C#Pinvoke无效文件句柄

C#Pinvoke无效文件句柄,c#,pinvoke,kernel32,C#,Pinvoke,Kernel32,我对内核32 Pinvoke函数有一个问题,因为它们不断抛出一个无效的\u文件\u句柄。程序读取当前硬盘的第一个扇区。我看不出下面的代码有什么问题 class Program { const uint GENERIC_READ = 0x80000000; const uint FILE_SHARE_READ = 0x00000001; const uint OPEN_EXISTING = 0x00000003; const uint FILE_FL

我对内核32 Pinvoke函数有一个问题,因为它们不断抛出一个无效的\u文件\u句柄。程序读取当前硬盘的第一个扇区。我看不出下面的代码有什么问题

    class Program
    {
    const uint GENERIC_READ = 0x80000000;
    const uint FILE_SHARE_READ = 0x00000001;
    const uint OPEN_EXISTING = 0x00000003;
    const uint FILE_FLAG_DELETE_ON_CLOSE = 0x04000000;

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern SafeFileHandle CreateFile(string Disk, uint Access, uint ShareMode, IntPtr SecurityAttributes, uint CreationDisposition, uint Flags, IntPtr TemplateFile);
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern uint SetFilePointer([In] SafeFileHandle Handle, [In] int DistanceToMove, [Out] out int DistanceToMoveHigh, [In] int MoveMethod);
    [DllImport("kernel32.dll", SetLastError = true)]
    unsafe public static extern int ReadFile(SafeFileHandle Handle, [Out] byte[] Buffer, int NumberOfBytesToRead, out int NumberOfBytesRead, IntPtr Overlapped);



    unsafe public static void Main(string[] args)
    {
        string Drive = @"\\.\C";
        int SectorSize = 512;
        int Sector = 0;
        int BytesRead, DistanceToMoveHigh;
        byte[] Buffer = new byte[SectorSize];

        SafeFileHandle Handle = CreateFile(Drive, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, IntPtr.Zero);
        SetFilePointer(Handle, Sector * SectorSize, out DistanceToMoveHigh, 0);
        ReadFile(Handle, Buffer, SectorSize, out BytesRead, IntPtr.Zero);

        Console.WriteLine(Marshal.GetLastWin32Error()); // It gives 6 which translates to an INVALID_FILE_HANDLE error
        Console.ReadKey();
    }
}

调用
CreateFile
失败。当然,您无法知道这一点,因为您忽略了任何错误检查。阅读文档。您调用的所有三个函数的错误都由返回值发出信号。你忽略了


CreateFile
的调用返回
无效的\u句柄\u值
。你需要测试一下。当您遇到这种情况时,只需调用
GetLastWin32Error
。很可能会返回
错误\u访问被拒绝

  • 在关闭时传递
    文件\u标志\u删除\u是错误的。把那面旗子移开
  • 我认为共享标志必须是
    FILE\u share\u READ | FILE\u share\u WRITE
  • 文件名必须是
    @“\\。\C:“
    带尾随冒号
  • 您将需要提升流程的执行
调用
CreateFile
失败。当然,您无法知道这一点,因为您忽略了任何错误检查。阅读文档。您调用的所有三个函数的错误都由返回值发出信号。你忽略了


CreateFile
的调用返回
无效的\u句柄\u值
。你需要测试一下。当您遇到这种情况时,只需调用
GetLastWin32Error
。很可能会返回
错误\u访问被拒绝

  • 在关闭时传递
    文件\u标志\u删除\u是错误的。把那面旗子移开
  • 我认为共享标志必须是
    FILE\u share\u READ | FILE\u share\u WRITE
  • 文件名必须是
    @“\\。\C:“
    带尾随冒号
  • 您将需要提升流程的执行
您以错误的方式使用了
GetLastWin32Error

此处失败的方法是
CreateFile
,它返回一个
无效的\u HANDLE\u值(表示失败)。要确定出现了什么问题,必须在
CreateFile
之后直接调用
GetLastWin32Error
当您在尝试读取后调用它时,错误当然是
error\u INVALID\u HANDLE(6)
,因为您向
ReadFile
传递了一个无效的句柄

如果在失败的
CreateFile
之后直接调用
GetLastWin32Error
,则会出现错误2:

系统找不到指定的文件

这是因为驱动器名缺少一个

string Drive = @"\\.\C:"; // <- add colon :

stringdrive=@“\\。\C:;// 您以错误的方式使用了
GetLastWin32Error

此处失败的方法是
CreateFile
,它返回一个
无效的\u HANDLE\u值(表示失败)。要确定出现了什么问题,必须在
CreateFile
之后直接调用
GetLastWin32Error
当您在尝试读取后调用它时,错误当然是
error\u INVALID\u HANDLE(6)
,因为您向
ReadFile
传递了一个无效的句柄

如果在失败的
CreateFile
之后直接调用
GetLastWin32Error
,则会出现错误2:

系统找不到指定的文件

这是因为驱动器名缺少一个

string Drive = @"\\.\C:"; // <- add colon :
字符串驱动器=@“\\。\C:”//