Нарушение доступа с FindVolumeClose ()

0

В следующей функции, когда я попадаю в строку FindVolumeClose(), я всегда получаю приведенную ниже ошибку. Любые идеи, почему это происходит?

Необработанное исключение в 0x11000000 в BootFixFFS.exe: 0xC0000005: нарушение доступа (параметры: 0x00000008).

char buffer[MAX_PATH];

HANDLE hVol = FindFirstVolume(buffer, MAX_PATH);

if (hVol == INVALID_HANDLE_VALUE) {
    std::cout << "No volumes found\n.";

    return FALSE;
}

std::string strVol = buffer;

strVol.pop_back();

HANDLE hPart = CreateFile(strVol.c_str(), 0, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hPart == INVALID_HANDLE_VALUE) {
    FindVolumeClose(hVol);

    std::cout << "Couldn't create file: " << GetLastError() << "\n";

    return FALSE;
}

int numPartitions = 8;

DWORD dwDliSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + numPartitions * sizeof(PARTITION_INFORMATION_EX);

DRIVE_LAYOUT_INFORMATION_EX *dli = (DRIVE_LAYOUT_INFORMATION_EX*) new BYTE[dwDliSize];

DWORD dwSize;

ZeroMemory(&dli, sizeof(dli));

BOOL bSuccess = DeviceIoControl(hPart, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, NULL, 0, &dli, dwDliSize, &dwSize, NULL);

CloseHandle(hPart);

FindVolumeClose(hVol);

if (bSuccess == FALSE) {
    std::cout << "Couldn't get device information: " << GetLastError() << "\n";

    return FALSE;
}   

return TRUE;
  • 0
    Вы говорите нам. Что возвращается FindFirstVolume () и что передается FindVolumeClose ()? Вы вообще что-нибудь отлаживали?
  • 0
    FindFirstVolume возвращает дескриптор правильно, и я передаю этот правильный дескриптор в FindVolumeClose. Моя теория заключалась в том, что, может быть, я закрывал том, когда у меня все еще была ручка, но я не видел этого.
Теги:
winapi

1 ответ

4
Лучший ответ

Мне кажется, что ZeroMemory (& dli, sizeof (dli)) не делает того, что вы хотите. Он удаляет адрес из dli, вместо того, чтобы обнулять содержимое массива байтов. Может быть, ZeroMemory (dli, dwDliSize) - это то, что вы имели в виду?

Кроме того, более серьезная ошибка заключается в использовании и при вызове DeviceIoControl. Вы в основном перезаписываете весь свой стек и уничтожаете локальные переменные.

  • 0
    Я все еще изучаю C ++, но не пуст ли во время вызова DeviceIoControl? Я установил достаточно большой размер для 8 разделов, а затем, передав указатель, следует заполнить данные в DLI, не так ли?
  • 0
    Вы передаете не указатель на блок BYTE, а вместо этого адрес указателя. Сам указатель размещается в стеке, поэтому DeviceIoControl перезапишет переменные стека, уничтожив практически все. Чтобы это исправить, используйте dli вместо & dli в DeviceIoControl вызова.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню