尝试获取对cd-rom设备的低级访问权限时,CreateFile分配2(!!)句柄,并且CloseHandle仅关闭一个句柄。操作系统Windows XP SP3,经测试的7台计算机中有5台工作相同。

尝试访问硬盘驱动器号时,CreateFiles可以正常工作,并且仅分配一个句柄。

这是示例代码:

HANDLE m_driveHandle = CreateFileW(“\\\\。\\ E”,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
CloseHandle(m_driveHandle);

是什么可能原因,或者仅仅是Microsoft错误?

更新。没有剪切和粘贴驱动器名称。右字符串为L“\\。\ E:”。错误仍然存​​在。

更新2。问题解决了!请参阅以下来自我的答案(欧米茄)。

最佳答案

您的示例代码中似乎存在一些错误。如果实际上是从您的程序中复制并粘贴的,那么就必须进行其他操作。

首先,您要使用MBCS字符串调用Unicode函数:第一个参数应该以L开头或以_T()包围。

其次,也许更重要的是,"\\\\.\\E"不是有效的名称。您缺少尾随的冒号:要打开一个卷,它必须采用\\.\X:的形式,或者在您的情况下为"\\\\.\\E:"的形式。

修复了这两个错误之后(第一个阻止编译,第二个阻止获取INVALID_HANDLE_VALUE以外的内容),一切似乎都按预期进行。我使用GetProcessHandleCount来计算打开句柄的数量,前后的数量相同:

HANDLE m_driveHandle = NULL;
HANDLE m_process = GetCurrentProcess();
DWORD handleCount;
GetProcessHandleCount(m_process, &handleCount);
cout << "Currently held handles: " << handleCount << endl;

for (int i = 0; i < 10; ++i)    {
    m_driveHandle = CreateFileW(L"\\\\.\\E:",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    if (INVALID_HANDLE_VALUE == m_driveHandle)  {
        cout << "Invalid handle" << endl;
    }   else    {
        CloseHandle(m_driveHandle);
    }

    GetProcessHandleCount(m_process, &handleCount);
    cout << "Currently held handles: " << handleCount << endl;
}

注释掉CloseHandle调用也会导致handleCount像预期的那样增加。

09-06 14:42