понедельник, 9 февраля 2009 г.

Утечка хэндлов в WinAPI CreateFile?

На нескольких машинах в офисе обнаружилась странная закономерность. А именно, при попытке открыть CD\DVD-ROM как устройство с правами на чтение и запись при помощи CreateFile, хэндлов выделяется 2(!!), на CloseHandle закрывается ровно 1.
Хэндлы при операциях с устройством, естественно, текут.
Свежескаченный SmallCDWriter тоже утерял хэндл при нажатии на "Инфо"...
(Баг отчетливо воспроизводится если в устройстве нет диска.)

Собственно, код выглядит так:


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);Syhi-подсветка кода


От привода, материнской платы или какого-то специфического софта закономерности не выявлено; все программисты, зафиксировавшие проблему были трезвыми и попившими кофе с утра :)
Кроме этого, открытие с теми же параметрами любого HDD-привода к таким последствиям не ведет.
В то же время, если попытаться "поиграть" с правами, то можно получить открытие привода с одним, как и положено, хэндлом, но права нужны для работы через SPTI при помощи вызовов DeviceIoControl.

Upd. Проблема решилась деинсталляцией KAV 6.0 и чисткой ключей с UpperFilters и LowerFilters для cd-драйвера:

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

Эксперимент на чистой машиной подтвердил правильность выводов. А в Kaspersky Internet Security последней версии данный баг уже не проявляется. Спасибо за помощь автору блога Not a kernel guy Алексею Пахунову.

-------------------
PS. Небольшой пиар - bishop3000 завел наконец-то свой блог на отдельном движке, обещает писать там на профессиональные темы и уже перекинул туда несколько своих популярных постов. В общем, рекомендую, http://bishop-it.ru.

2 комментария:

Анонимный комментирует...

А пробовали посмотреть хендлы с помощью Process Explorer? Что покажет? Может там дополнительный хэндл на что-то другое открывается?

Omega комментирует...

Ага, пробовали, и тулзами от Руссиновича и еще какой-то сторонний менеджер был.
Это явно не глюк TaskManager'а, в ProcessExplorer все повторяется.