В следующей функции, когда я попадаю в строку 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;
Мне кажется, что ZeroMemory (& dli, sizeof (dli)) не делает того, что вы хотите. Он удаляет адрес из dli, вместо того, чтобы обнулять содержимое массива байтов. Может быть, ZeroMemory (dli, dwDliSize) - это то, что вы имели в виду?
Кроме того, более серьезная ошибка заключается в использовании и при вызове DeviceIoControl. Вы в основном перезаписываете весь свой стек и уничтожаете локальные переменные.