DeviceIoControl () с IOCTL_DISK_GET_DRIVE_GEOMETRY завершается с ошибкой и возвращает код ошибки 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 документация.
, но явно я что-то упускаю. Ваша помощь очень ценится.

Редактировать:

В соответствии с полученными ответами я изменил следующее:

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

Решение

Насколько я могу сказать, я позвонил 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]