首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#调用无效文件句柄

C#调用无效文件句柄
EN

Stack Overflow用户
提问于 2016-08-03 09:10:36
回答 2查看 899关注 0票数 0

当kernal32 Pinvoke函数不断抛出INVALID_FILE_HANDLE时,我遇到了问题。程序读取当前硬盘的第一个扇区。我看不出下面的代码有什么问题。

代码语言:javascript
运行
复制
    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();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-03 09:15:59

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

CreateFile的调用返回INVALID_HANDLE_VALUE。你需要测试一下。当您遇到这种情况时,然后再调用GetLastWin32Error。然后很可能会返回ERROR_ACCESS_DENIED

  • 通过FILE_FLAG_DELETE_ON_CLOSE是一个错误。把旗子移开。
  • 我认为共享标志必须是FILE_SHARE_READ | FILE_SHARE_WRITE
  • 文件名必须是带有尾随冒号的@"\\.\C:"
  • 您将需要将该进程提升执行。
票数 3
EN

Stack Overflow用户

发布于 2016-08-03 09:18:28

您以错误的方式使用GetLastWin32Error

这里失败的方法是CreateFile,它返回一个INVALID_HANDLE_VALUE (指示失败)。要确定出了什么问题,您必须在GetLastWin32Error CreateFile之后直接调用CreateFile

在尝试读取后调用它时,错误当然是ERROR_INVALID_HANDLE (6),因为您向ReadFile传递了一个无效句柄。

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

系统找不到指定的文件。

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

代码语言:javascript
运行
复制
string Drive = @"\\.\C:"; // <- add colon :

我试过使用这个驱动器名,但是得到了错误32:

该进程无法访问该文件,因为其他进程正在使用该文件。

我一直在努力想办法.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38739224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档