Приложение падает на вызове DeviceIoControl

203
28 июля 2018, 06:40

Необходимо получить смещение разделов жёсткого диска. Я делаю это следующим образом:

PDRIVE_LAYOUT_INFORMATION_EX partitions;
DWORD partitionsSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) 
                       + 127 * sizeof(PARTITION_INFORMATION_EX);
partitions = (PDRIVE_LAYOUT_INFORMATION_EX)malloc(partitionsSize);
HANDLE h = CreateFile(L"\\\\.\\PhysicalDrive0", FILE_ANY_ACCESS , 
                      FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 
                      OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE)
{
   // handle error and exit
}
if (DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, NULL, 0, partitions, 
                    partitionsSize, 0, NULL) != 0)
{
   // do stuff with partitions here
}

Данный код корректно отрабатывает на Windows 10, однако мне необходима совместимость с Windows 7. Приложение падает на вызове DeviceIoControl со следующим выводом отладчика: Unhandled exception at 0x76B5D2EA (KernelBase.dll) in myapp.exe: 0xC0000005: Access violation writing location 0x00000000.

Для сборки использовал компилятор Microsoft Visual Studio 14.0

Для решения испробовал следующее: менял параметры доступа в вызове CreateFile, запускал от имени администратора

Answer 1

При вызове DeviceIoControl c флагом IOCTL_DISK_GET_DRIVE_LAYOUT_EX без использования асинхронного чтения параметр lpBytesReturned должен быть ненулевым указателем, согласно документации:

If lpOverlapped is NULL, lpBytesReturned cannot be NULL. Even when an operation returns no output data and lpOutBuffer is NULL, DeviceIoControl makes use of lpBytesReturned. After such an operation, the value of lpBytesReturned is meaningless.

READ ALSO
Как работает валидатор ввода в данном методе?

Как работает валидатор ввода в данном методе?

Пытаюсь понять, как работает данное решение с валидатором (вложенный в 'do' while)Никак не могу понять порядок исполнения кода

203
Загрузка файлов в удаленную MongoDB GridFS

Загрузка файлов в удаленную MongoDB GridFS

Нужно записывать метаданные и большие файлы в удаленную MongoDBИзвестен адрес сервера с монгой

154
Как передвинуть маркер в google map Android

Как передвинуть маркер в google map Android

подскажите пожалуйста как передвинуть или удалить маркер в google map Android

215
Ошибка при переключение Tab

Ошибка при переключение Tab

При переключении Tab, выкидывает ошибку:

224