2016-11-07 78 views
0

相关的代码如下:IOCTL_DISK_GET_DRIVE_GEOMETRY的DeviceIoControl()失败并返回错误代码87.为什么?

std::wstring path = ApplicationData::Current->LocalFolder->Path->Data(); 

std::wstring testFileName = path + std::wstring(L"\\TestVariablySized"); 
this->hMappedFile = CreateFile2(
    testFileName.c_str(), 
    GENERIC_READ | GENERIC_WRITE, 
    0, 
    OPEN_ALWAYS, 
    NULL); 

uint32_t checkF = GetLastError(); 

DISK_GEOMETRY geo = { 0 }; 
DWORD bReturned = 0; 

bool controlCheck = DeviceIoControl(
    (HANDLE)hMappedFile,    // handle to device 
    IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode 
    NULL,       // lpInBuffer 
    0,        // nInBufferSize 
    (LPVOID)&geo,   // output buffer 
    (DWORD)sizeof(geo),  // size of output buffer 
    (LPDWORD)&bReturned,  // number of bytes returned 
    NULL); 

uint32_t check = GetLastError(); 

在此之后,controlCheck是假的,checkERROR_INVALID_PARAMETERcheckFERROR_ALREADY_EXISTS,这应该不成问题。

据我所知,我打电话给DeviceIoControl()的方式与IOCTL_DISK_GET_DRIVE_GEOMETRY documentation一致。 ,但显然我错过了一些东西。我们非常感谢您的帮助。

编辑:

每收到的答复,我改变的东西如下:

HANDLE hDevice = CreateFile2(
    L"\\.\PhysicalDrive0", 
    GENERIC_READ | GENERIC_WRITE, 
    FILE_SHARE_READ | FILE_SHARE_WRITE, 
    OPEN_EXISTING, 
    NULL); 

uint32_t checkF = GetLastError(); 

DISK_GEOMETRY geo = { 0 }; 
DWORD bReturned = 0; 

bool controlCheck = DeviceIoControl(
    hDevice,    // handle to device 
    IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode 
    NULL,       // lpInBuffer 
    0,        // nInBufferSize 
    (LPVOID)&geo,   // output buffer 
    (DWORD)sizeof(geo),  // size of output buffer 
    (LPDWORD)&bReturned,  // number of bytes returned 
    NULL); 

uint32_t check = GetLastError(); 

CloseHandle(hDevice); 

这应该是更接近于正确的,即使是不太正确的呢。 checkFERROR_FILE_NOT_FOUND,我发现这很奇怪。我也试过"\\.\PhysicalDrive1""\\.\PhysicalDrive2",但收到相同的结果。 controlCheck仍然是错误的,但现在检查ERROR_INVALID_HANDLE

+0

据我所知,'IOCTL_DISK_ *'只能如果打开磁盘本身,你不能把那些打开的句柄的文件里面的硬盘内卷。 –

回答

1

至于我可以告诉大家,我叫与IOCTL_DISK_GET_DRIVE_GEOMETRY文档

其实是一致的方式DeviceIoControl(),你是不是,因为你没有注意这个珍闻的文件:

hDevice
的句柄磁盘设备从中GE ometry将被检索。要检索设备句柄,请调用CreateFile函数。

你是不是传递一个句柄磁盘设备,您传递的句柄文件系统路径,而不是

当调用CreateFile2()得到一个句柄磁盘设备,则需要在\\.\PhysicalDriveX格式指定物理设备来代替,而不是一个文件系统路径。

此外,作为CreateFile2()文件说:

以下要求必须满足这样的电话成功:

  • 调用者必须具有管理权限。有关更多信息,请参阅使用特权运行。
  • dwCreationDisposition参数必须具有OPEN_EXISTING标志。
  • 打开卷或软盘时,dwShareMode参数必须具有FILE_SHARE_WRITE标志。

您正在使用OPEN_ALWAYS,而不是OPEN_EXISTING

请仔细阅读CreateFile2()文档的“Physical Disks and Volumes”部分。

尝试一些更喜欢这个:

std::wstring path = L"\\\\.\\PhysicalDrive0"; 
DWORD errCode; 

hMappedFile = CreateFile2(
    path.c_str(), 
    GENERIC_READ | GENERIC_WRITE, 
    0, 
    OPEN_EXISTING, 
    NULL); 

if (this->hMappedFile == INVALID_HANDLE_VALUE) 
{ 
    errCode = GetLastError(); 
    // handle error as needed... 
} 
else 
{ 
    DISK_GEOMETRY geo = { 0 }; 
    DWORD dwReturned = 0; 

    bool controlCheck = DeviceIoControl(
     hMappedFile,     // handle to device 
     IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode 
     NULL,       // lpInBuffer 
     0,        // nInBufferSize 
     &geo,       // output buffer 
     sizeof(geo),     // size of output buffer 
     &dwReturned,     // number of bytes returned 
     NULL); 

    if (!controlCheck) 
    { 
     errCode = GetLastError(); 
     // handle error as needed... 
    } 
    else 
    { 
     // use drive as needed... 
    } 

    CloseHandle(hMappedFile); 
} 
+0

已作出更改,但出现新错误 – MNagy

+0

@MNagy:这是因为您向CreateFile2()输入的字符串错误,因此失败,返回'INVALID_HANDLE_VALUE'并将错误代码设置为'ERROR_FILE_NOT_FOUND'。你没有检查任何失败,所以你将这个无效句柄传递给'DeviceIoControl()',这就是为什么它报告一个'ERROR_INVALID_HANDLE'错误。您的输入字符串使用**字符串**,所以您需要通过加倍来避免斜线,例如:'L'\\\\。\\ PhysicalDrive0“'。 –

相关问题