相关代码如下:
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
为false,check
为ERROR_INVALID_PARAMETER
。 checkF
是ERROR_ALREADY_EXISTS
,这不应该成为问题。
据我所知,我以与IOCTL_DISK_GET_DRIVE_GEOMETRY
documentation一致的方式致电DeviceIoControl()
。
,但显然我错过了一些东西。非常感谢您的帮助。
编辑:
根据收到的回复,我改变了以下内容:
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
。
答案 0 :(得分:1)
据我所知,我以与
DeviceIoControl()
文档一致的方式致电IOCTL_DISK_GET_DRIVE_GEOMETRY
实际上,你不是,因为你没有注意文档中的这些内容:
hDevice
磁盘设备的句柄,从中检索几何体。要检索设备句柄,请调用CreateFile
函数。
您没有将句柄传递给磁盘设备,而是将句柄传递给文件系统路径。
调用CreateFile2()
以获取磁盘设备的句柄时,您需要指定\\.\PhysicalDriveX
格式的物理设备,而不是文件系统路径。
另外,正如CreateFile2()
文档所说:
要成功调用,必须满足以下要求:
- 来电者必须具有管理权限。有关更多信息,请参阅使用特殊权限运行。
dwCreationDisposition
参数必须包含OPEN_EXISTING
标记。- 打开卷或软盘时,
dwShareMode
参数必须具有FILE_SHARE_WRITE
标记。
您使用OPEN_ALWAYS
代替OPEN_EXISTING
。
请仔细阅读CreateFile2()
文档的“物理磁盘和卷”部分。
尝试更像这样的东西:
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);
}