Соответствующий код выглядит следующим образом:
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
все еще ложь, но проверка сейчас ERROR_INVALID_HANDLE
,
Насколько я могу сказать, я позвонил
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);
}
Других решений пока нет …