【问题标题】:Access Violation with FindVolumeClose()FindVolumeClose() 访问冲突
【发布时间】: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。我的理论是,当我在其他地方还有一个手柄打开时,也许我正在关闭音量,但我看不到。

标签: c++ winapi


【解决方案1】:

在我看来,ZeroMemory(&dli, sizeof(dli)) 并没有按照您的意愿去做。它从 dli 中擦除地址,而不是将字节数组的内容归零。也许 ZeroMemory(dli, dwDliSize) 就是你的意思?

另外,更严重的错误是在调用 DeviceIoControl 时使用 &dli。您基本上是在覆盖整个堆栈,并破坏局部变量。

【讨论】:

  • 我还在学习C++,但是调用DeviceIoControl的时候dli不就是空的吗?我将它设置为足够大的大小以容纳 8 个分区,然后将指针传入应该将数据填充到 DLI 中,不是吗?
  • 您传递的不是指向字节块的指针,而是指针的地址。指针本身是在堆栈上分配的,因此 DeviceIoControl 将覆盖堆栈变量,从而破坏几乎所有内容。要解决此问题,请在调用 DeviceIoControl 时使用 dli 而不是 &dli。
  • 谢谢!这显然是问题所在。我显然正在摧毁周围的一切并打破我的 IO 控制!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 2013-02-26
  • 2015-04-23
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多