IOCTL_DISK_GET_DRIVE_GEOMETRY的DeviceIoControl()失败并返回错误代码87.为什么?
相关的代码如下: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
是假的,check
是ERROR_INVALID_PARAMETER
。 checkF
是ERROR_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);
这应该是更接近于正确的,即使是不太正确的呢。 checkF
是ERROR_FILE_NOT_FOUND
,我发现这很奇怪。我也试过"\\.\PhysicalDrive1"
和"\\.\PhysicalDrive2"
,但收到相同的结果。 controlCheck
仍然是错误的,但现在检查ERROR_INVALID_HANDLE
。
至于我可以告诉大家,我叫与
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);
}
已作出更改,但出现新错误 – MNagy
@MNagy:这是因为您向CreateFile2()输入的字符串错误,因此失败,返回'INVALID_HANDLE_VALUE'并将错误代码设置为'ERROR_FILE_NOT_FOUND'。你没有检查任何失败,所以你将这个无效句柄传递给'DeviceIoControl()',这就是为什么它报告一个'ERROR_INVALID_HANDLE'错误。您的输入字符串使用**字符串**,所以您需要通过加倍来避免斜线,例如:'L'\\\\。\\ PhysicalDrive0“'。 –
据我所知,'IOCTL_DISK_ *'只能如果打开磁盘本身,你不能把那些打开的句柄的文件里面的硬盘内卷。 –