Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.28;
Скачать: CL | DM;

Вниз

О пользе закрытия Handle`ов :)   Найти похожие ветки 

 
Riply ©   (2008-11-01 12:16) [0]

Здравствуйте !
Предистория.
При загрузке, драйвер открывает файл при помощи следующего вызова:
ZwCreateFile(...,
 FILE_WRITE_DATA or FILE_READ_DATA or FILE_WRITE_ATTRIBUTES or SYNCHRONIZE,
 ..., FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ,
 FILE_OPEN_IF, FILE_NON_DIRECTORY_FILE or FILE_SYNCHRONOUS_IO_NONALERT, ...);
Потратила кучу времени на попытку понять почему этот вызов возвращает STATUS_SHARING_VIOLATION.
(подопытный файл мой и, кроме меня, на него никто не покусяется :))
Кагого же было мое удивление, когда выяснилось, что "он используется другим приложением".
(Все мои "приложения" в этот момент времени закрыты).
Поиск злоумышленника (путем пробежки по открытым Handle`ам) дал нам его ProcessID  - 4 :)
Перепроверка кода показала, что в одном из вариантов выгрузки драйвера,
возможно незакрытие Handle`а.
Иными словами получается, что даже после завершения нашего творения,
занятые им ресурсы могут оставаться в системе.
(про память-то я это знала, но с объектами не ожидала).
Результат: лично я заплатила за незакрытый Handle тремя часами своего собственного времени :)


 
Сергей М. ©   (2008-11-01 12:32) [1]


> Riply ©   (01.11.08 12:16)  


> после завершения нашего творения,
> занятые им ресурсы могут оставаться в системе


Под "системой" в этой ситуации будет фигурирует вполне конкретный процесс system.exe - именно в его контексте ты заняла файловый ресурс и получила хэндл этого ресурса. Поскольку ты по забывчивости или незнанию не удосужилась явно закрыть хэндл и "отпустить" ресурс, он так и останется занятым вплоть до завершения процесса system.exe.

Вот и все чудеса)

А про контексты исполнения кода драйверов режима ядра можно почитать, скажем, на http://www.wasm.ru/article.php?article=drvw2k01 или непосредственно у Соломона с Руссиновичем


 
Сергей М. ©   (2008-11-01 12:34) [2]

Удалено модератором
Примечание: Дубль...


 
Riply ©   (2008-11-01 12:57) [3]

> [1] Сергей М. ©   (01.11.08 12:32)
> ...
> Вот и все чудеса)

Да чудеса-то я осознала :)
Я вела к тому, что дорого приходиться платить (IMHO)
за неряшливость при написании кода :)


 
Сергей М. ©   (2008-11-01 13:01) [4]


> дорого приходиться платить


Поди и BSOD"ами по ходу дела насладилась по самое нехочу ,)


 
Rouse_ ©   (2008-11-01 13:01) [5]


> за неряшливость при написании кода

За неряшливость всегда приходится платить :) Хуже было если бы ты разрешила бы шаринг на запись, т.е. FILE_SHARE_READ | FILE_SHARE_WRITE - тогда не получила бы STATUS_SHARING_VIOLATION и продолжила бы писать не подозревая о ошибке в коде :)
ЗЫ: кстати а почему у тебя код такой? Ты на Дельфи чтоли драйвер пишешь?


 
Сергей М. ©   (2008-11-01 13:07) [6]


> Riply ©   (01.11.08 12:57) [3]


Не пристало барышне быть неряхой)


 
Riply ©   (2008-11-01 13:09) [7]

> [4] Сергей М. ©   (01.11.08 13:01)
> Поди и BSOD"ами по ходу дела насладилась по самое нехочу ,)

Ну а как же без них-то ? :)

> [5] Rouse_ ©   (01.11.08 13:01)
> За неряшливость всегда приходится платить :) Хуже было если бы ты разрешила бы шаринг на запись, т.е. > FILE_SHARE_READ | FILE_SHARE_WRITE - тогда не получила бы STATUS_SHARING_VIOLATION и
> продолжила бы писать не подозревая о ошибке в коде :)
> ЗЫ: кстати а почему у тебя код такой? Ты на Дельфи чтоли драйвер пишешь?

Он у меня одновременно идет в трех вариантах: Delphi, C и
еще его подобие (эмуляция) в user-mode в жалкой попытке уменьшить количество BSOD"ов :)


 
Riply ©   (2008-11-01 13:14) [8]

> [6] Сергей М. ©   (01.11.08 13:07)
> Не пристало барышне быть неряхой)

Угу. Но пооправдываюсь:
просто я забыла его внести в битовую маску инициализированных объектов.
(я по ней определяюсь что надо создавать и освобожлать)


 
Rouse_ ©   (2008-11-01 13:45) [9]


> Он у меня одновременно идет в трех вариантах: Delphi, C и еще его подобие

Стесняюсь спросить - а нафига? :)


 
Riply ©   (2008-11-01 13:53) [10]

> [9] Rouse_ ©   (01.11.08 13:45)

> Стесняюсь спросить - а нафига? :)

Эмулятор на Delphi, потому что здесь я себя свободнее чуствую.
С не так быстро и легко осваивается, как хотелось бы :(
Много досадных "опечаток".
Далее, эмулятор легче портировать на Delphi-драйвер для проверки.
Ну уж потом, с грехом попалам, переводим все на С.
Вот так обстоят дела на текущий момент :)


 
Rouse_ ©   (2008-11-01 15:18) [11]

Пиши сразу на С, незачем делать одну и ту-же работу 3 раза, да еще маятся с Дельфи "драйвером" бррр...



Страницы: 1 вся ветка

Текущий архив: 2008.12.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1226997574
SkyN
2008-11-18 11:39
2008.12.28
Как избавиться от 100% загрузки CPU? 5Мб лога в секунду.


15-1225052523
koha!
2008-10-26 23:22
2008.12.28
Консоль для супер маленьких


15-1224709773
Real
2008-10-23 01:09
2008.12.28
Почему своих контор нет? Или очень мало?


1-1204962203
GrafDrakula
2008-03-08 10:43
2008.12.28
Прозрачный Listbox1, memo(richedit)


2-1226867152
ivak
2008-11-16 23:25
2008.12.28
Как?