【问题标题】:INVALID_HANDLE_VALUE when using CreateFile(”\\.\C:“,...)使用 CreateFile(”\\.\C:“,...) 时的 INVALID_HANDLE_VALUE
【发布时间】:2015-11-12 07:51:42
【问题描述】:

代码在这里

HANDLE hDrive = CreateFile(_T("\\\\.\\D:"), GENERIC_READ, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL,///*FILE_FLAG_WRITE_THROUGH |*/FILE_FLAG_NO_BUFFERING, 
    NULL);
assert(hDrive != INVALID_HANDLE_VALUE);

我也试过CreateFile(_T("\\\.\D:",...)OPEN_EXISTING,但也返回INVALID_HANDLE_VALUE

我打电话给GetLastError(),错误码是5,ERROR_ACCESS_DENIED

【问题讨论】:

  • 您是否查看过GetLastError() 的结果以确定相关的错误代码?
  • 谢谢,我去看看
  • 尝试\\\\.\\PhysicalDrive1: 而不是\\\\.\\D: 或者它可能是PhysicalDrive0,具体取决于驱动器的映射方式。 ps 也OPEN_EXISTING 如前所述。
  • 程序必须运行提升才能获得对驱动器的原始访问权限。需要 UAC 提升,编辑程序的清单以显示提示。
  • 错误代码的最佳快速查找方法是简单地搜索 中的数字。在这种情况下,5 是 ERROR_ACCESS_DENIED,这与 Hans Passant 的分析密切相关。

标签: windows winapi


【解决方案1】:

感谢@Barmak Shemirani 和@Hans Passant,

我有一个可行的代码

HANDLE hDrive = CreateFile(_T("\\\\.\\PhysicalDrive0"), GENERIC_READ, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_READONLY,///*FILE_FLAG_WRITE_THROUGH |*/FILE_FLAG_NO_BUFFERING, 
    NULL);

HANDLE hDrive = CreateFile(_T("\\\\.\\D:"), GENERIC_READ|GENERIC_WRITE, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_READONLY,///*FILE_FLAG_WRITE_THROUGH |*/FILE_FLAG_NO_BUFFERING, 
    NULL);
DWORD dwError = GetLastError();

assert(hDrive != INVALID_HANDLE_VALUE);
cin.get();

需要以管理员身份运行

【讨论】:

  • 实际上"\\\\.\\D:" 也可以工作,问题是d: 可能是磁盘或分区。另外,如果您只想获取磁盘信息,请尝试将GENERIC_READ 替换为0,看看它是否在没有提升访问权限的情况下运行。
  • 非常感谢:),我试过了,它也需要以管理员身份运行
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多