【发布时间】:2014-02-24 21:57:40
【问题描述】:
在下面的函数中,当我点击 FindVolumeClose() 行时,我总是得到下面概述的错误。任何想法为什么会发生这种情况?
BootFixFFS.exe 中 0x11000000 处的未处理异常: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;
【问题讨论】:
-
你告诉我们。 FindFirstVolume() 返回什么以及传递给 FindVolumeClose() 什么?你有没有做过任何调试?
-
FindFirstVolume 正确返回了一个句柄,我将这个正确的句柄传递给 FindVolumeClose。我的理论是,当我在其他地方还有一个手柄打开时,也许我正在关闭音量,但我看不到。