2009-02-09 41 views
1

当试图获取对CD-ROM设备的低级访问时,CreateFile分配2(!!)句柄并且CloseHandle仅关闭一个句柄。操作系统Windows XP SP3,7个测试计算机中的5个工作原理相同。在WinAPI CreateFile中处理泄漏?

当试图访问硬盘驱动器号时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);

什么是可能的原因,或者它只是一个微软的错误?

Upd。驱动器名称未被剪切&粘贴。右边的字符串是L“\\。\ E:”。错误仍然存​​在。

Upd2。问题解决了!从我(欧米茄)看下面的答案。

+0

你是如何确认这是开始泄漏的? – MSN 2009-02-09 21:45:04

+0

是的,我们禁用可能的包装软件,包括防病毒和nero(但不卸载它,嗯......) – Svetlana 2009-02-09 21:49:33

+0

在TaskManager,ProcessExplorer等检测到泄漏 – Svetlana 2009-02-09 21:50:22

回答

0

建议:
把日志开始在调用CreateFileW,这确认它被执行多少次;

3

您的示例代码中似乎有一些错误。如果它实际上是从您的程序粘贴&,那么就不得不做其他事情。

首先,你用一个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递增预期,以及。

0

你试过SysInternals的“Handle”工具吗?它可以显示你的程序打开的每个句柄,而不仅仅是一个计数。因此,你会知道哪个句柄仍然打开。

2

问题出在卡巴斯基防病毒软件。 KAV 6.0被安装在所有测试过的机器上。

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\ {类4D36E965-E325-11CE-BFC1-08002BE10318}

:去除它是需要清除的CD驱动器在注册表中的UpperFilters和LOWERFILTERS软件后只有经过此步骤处理后,才会停止泄漏。 Kaspersky Internet Security的最新版本软件也不会泄漏。