相关的代码如下: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_ *'只能如果打开磁盘本身,你不能把那些打开的句柄的文件里面的硬盘内卷。 –