2017-02-23 5 views
1

DeviceIoControlFSCTL_SET_ZERO_DATAの制御コードでC#で使用しようとしています。FSCTL_SET_ZERO_DATAのDeviceIoControlがERROR_INVALID_PARAMETERを返します

ファイルC:\tmp\test.txtを作成しましたが、その中にテキスト「aaaa」を入れました。

私は、コードを実行し、私はエラー番号受信:MSDNによると87
を:「パラメータが間違っています」

enter image description here

私は、任意のデータなしで入力バッファ(DeviceIoControlのパラメータ数3)を送信していますので、問題があると仮定。

DeviceIoControlfalseを返します。
有効なパラメータをDeviceIoControlに入力してFSCTL_SET_ZERO_DATAと入力すると、trueが返されます。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program2 
    { 
     [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)] 
     static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, 
IntPtr lpInBuffer, uint nInBufferSize, 
IntPtr lpOutBuffer, uint nOutBufferSize, 
out uint lpBytesReturned, IntPtr lpOverlapped); 

     [Flags] 
     public enum EMethod : uint 
     { 
      Buffered = 0, 
      InDirect = 1, 
      OutDirect = 2, 
      Neither = 3 
     } 

     [Flags] 
     public enum EFileDevice : uint 
     { 
      FileSystem = 0x00000009 
     } 

     [Flags] 
     public enum EIOControlCode : uint 
     { 
      FsctlSetZeroData = (EFileDevice.FileSystem << 16) | (50 << 2) | EMethod.Buffered | (FileAccess.Write << 14), 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     struct FILE_ZERO_DATA_INFORMATION 
     { 
      public FILE_ZERO_DATA_INFORMATION(long offset, long count) 
      { 
       FileOffset = offset; 
       BeyondFinalZero = offset + count; 
      } 

      public long FileOffset; 
      public long BeyondFinalZero; 
     } 

     [DllImport("kernel32.dll")] 
     public static extern uint GetLastError(); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern IntPtr CreateFile(
     [MarshalAs(UnmanagedType.LPTStr)] string filename, 
     [MarshalAs(UnmanagedType.U4)] FileAccess access, 
     [MarshalAs(UnmanagedType.U4)] FileShare share, 
     IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero 
     [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, 
     uint flagsAndAttributes, 
     IntPtr templateFile); 

     static void Main(string[] args) 
     { 
      IntPtr handle = CreateFile(@"C:\tmp\test.txt", FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, (int)FileAttributes.Normal, IntPtr.Zero); 

      long length = 2; 
      FILE_ZERO_DATA_INFORMATION data = new FILE_ZERO_DATA_INFORMATION(0, length); 
      uint structSize = (uint)Marshal.SizeOf(data); 
      IntPtr pBuffer = Marshal.AllocHGlobal((int)structSize); 


      uint bytesReturned = 0; 
      bool succeed = DeviceIoControl(handle, (uint)EIOControlCode.FsctlSetZeroData, pBuffer, 5, IntPtr.Zero, 5, out bytesReturned, IntPtr.Zero); 

      // bool succeed = DeviceIoControl(handle, (uint)EIOControlCode.FsctlSetZeroData, IntPtr.Zero, 0, IntPtr.Zero, 0, out bytesReturned, IntPtr.Zero); 
      if (succeed) 
      { 
       Console.WriteLine("Works fine"); 
      } 
      else 
      { 
       uint err = GetLastError(); 
       Console.WriteLine("Error number: {0}", err); 
      } 
     } 

    } 
} 
+1

'nInBufferSize'は' FILE_ZERO_DATA_INFORMATION'のサイズですので '16'、' nOutBufferSize'は0にする必要があります。 – Aybe

+0

ありがとう、今は動作します。それを回答として提出すれば、それを回答としてマークします。 私は呼び出しを次のように変更しました: 'uint pBufferSize = 16; bool succeed = DeviceIoControl(handle、(uint)EIOControlCode.FsctlSetZeroData、pBuffer、pBufferSize、IntPtr.Zero、0、out bytesReturned、IntPtr.Zero); ' – E235

答えて

1

@Aybeへのクレジット。

修正は次のとおりです。

uint pBufferSize = 16; 
Marshal.StructureToPtr(data, pBuffer, false); 
bool succeed = DeviceIoControl(handle, (uint)EIOControlCode.FsctlSetZeroData, pBuffer, pBufferSize, IntPtr.Zero, 0, out bytesReturned, IntPtr.Zero); 
  • あなたは時々関数はtrueを返しますし、いつかはfalse、それを追加しない場合はMarshal.StructureToPtr(data, pBuffer, false);

を追加することが非常に重要。

Hereは、C#でFSCTLも使用するコードへの参照です。

+0

ここにいくつかの追加の担当者があります。あなたのためのポイント:) – Aybe

関連する問題