相关代码如下:
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
文档一致。,但显然我错过了一些东西。非常感谢您的帮助。
编辑:
根据收到的回复,我将内容更改如下:
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
仍然是假的,但 check 是 now ERROR_INVALID_HANDLE
。