2009-02-09 2 views
1

CreateFile выделяет 2 (!!) дескриптора, а CloseHandle закрывает только один дескриптор при попытке получить низкоуровневый доступ к устройству cd-rom. ОС Windows XP SP3, 5 из 7 протестированных компьютеров работает одинаково.Обращение с утечкой в ​​WinAPI CreateFile?

При попытке получить доступ к букве диска hdd CreateFiles работает нормально и выделяет только один дескриптор.

Вот код образца:

HANDLE m_driveHandle = CreateFileW ("\\\\ \\ Е", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle (m_driveHandle);

Какова возможная причина или это просто ошибка Microsoft?

Обновление. Имя диска was'nt cut & вставлено. Правая строка - L "\\. \ E:". Ошибка все еще сохраняется.

Upd2. Задача решена! См. Ответ ниже от меня (омега).

+0

И как вы подтвердили, что это была настоящая утечка? – MSN

+0

Да, мы отключили возможное программное обеспечение оболочки, в том числе антивирус и nero (но не удалили его, hmmm ...) – Svetlana

+0

Утечки, обнаруженные в TaskManager, ProcessExplorer и т. Д. – Svetlana

ответ

0

Предложение:
Положить журнал на вызов CreateFileW, это подтвердит, сколько раз оно выполняется;

+0

Это чистая программа-образец, одна строка для createFile a-one для закрытого дескриптора. – Svetlana

+0

Вы проверяете, что Джейсон Оуэн сказал о строке L "\\\\. \\ E:"? – lsalamon

+0

Да! Это обновление в тексте. – Svetlana

3

Кажется, что есть несколько ошибок в вашем примере кода. Если бы это было фактически скопировано &, вставленное из вашей программы, тогда должно было произойти что-то еще.

Во-первых, вы вызываете функцию Unicode со строкой MBCS: первый аргумент должен быть добавлен с 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

Это was'nt Cut & Paste :) У меня все в порядке с строкой имени диска, теперь я отредактирую текст в сообщении. – Svetlana

+0

Выполняет ли программа-образец, описанную выше, при обработке ее? Или количество ручек, открытых в первой строке, равно числу ручек, открытых на последней строке? –

+0

Да, он все еще течет ручками. – Svetlana

0

Вы пробовали инструмент «Ручка» SysInternals? Он может показать вам каждую ручку, открытую вашей программой, а не только счет. Следовательно, вы узнаете, какой дескриптор остается открытым.

+0

Я попробовал инструмент sysinternal's russinovich ProcessExplorer. Здесь 2 обрабатывает также, он показывает две ручки как два объекта ядра. – Svetlana

2

Проблема была в программном обеспечении Kaspersky Antivirus. KAV 6.0 был установлен на всех испытанных машинах. После удаления программного обеспечения это необходимо, чтобы очистить UpperFilters и LowerFilters для компакт-драйвера в реестре:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Class {4D36E965-E325-11CE-BFC1-08002BE10318}

Только после этого этапы обработки прекращают утечку. Новейшая версия программного обеспечения Kaspersky Internet Security также работает без утечки.

Смежные вопросы