-
Здравствуйте ! Предистория. При загрузке, драйвер открывает файл при помощи следующего вызова: 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 тремя часами своего собственного времени :)
-
> Riply © (01.11.08 12:16)
> после завершения нашего творения, > занятые им ресурсы могут оставаться в системе
Под "системой" в этой ситуации будет фигурирует вполне конкретный процесс system.exe - именно в его контексте ты заняла файловый ресурс и получила хэндл этого ресурса. Поскольку ты по забывчивости или незнанию не удосужилась явно закрыть хэндл и "отпустить" ресурс, он так и останется занятым вплоть до завершения процесса system.exe. Вот и все чудеса) А про контексты исполнения кода драйверов режима ядра можно почитать, скажем, на http://www.wasm.ru/article.php?article=drvw2k01 или непосредственно у Соломона с Руссиновичем
-
Удалено модератором Примечание: Дубль...
-
> [1] Сергей М. © (01.11.08 12:32) > ... > Вот и все чудеса)
Да чудеса-то я осознала :) Я вела к тому, что дорого приходиться платить (IMHO) за неряшливость при написании кода :)
-
> дорого приходиться платить
Поди и BSOD'ами по ходу дела насладилась по самое нехочу ,)
-
> за неряшливость при написании кода
За неряшливость всегда приходится платить :) Хуже было если бы ты разрешила бы шаринг на запись, т.е. FILE_SHARE_READ | FILE_SHARE_WRITE - тогда не получила бы STATUS_SHARING_VIOLATION и продолжила бы писать не подозревая о ошибке в коде :) ЗЫ: кстати а почему у тебя код такой? Ты на Дельфи чтоли драйвер пишешь?
-
> Riply © (01.11.08 12:57) [3]
Не пристало барышне быть неряхой)
-
> [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'ов :)
-
> [6] Сергей М. © (01.11.08 13:07) > Не пристало барышне быть неряхой)
Угу. Но пооправдываюсь: просто я забыла его внести в битовую маску инициализированных объектов. (я по ней определяюсь что надо создавать и освобожлать)
-
> Он у меня одновременно идет в трех вариантах: Delphi, C и еще его подобие
Стесняюсь спросить - а нафига? :)
-
> [9] Rouse_ © (01.11.08 13:45)
> Стесняюсь спросить - а нафига? :)
Эмулятор на Delphi, потому что здесь я себя свободнее чуствую. С не так быстро и легко осваивается, как хотелось бы :( Много досадных "опечаток". Далее, эмулятор легче портировать на Delphi-драйвер для проверки. Ну уж потом, с грехом попалам, переводим все на С. Вот так обстоят дела на текущий момент :)
-
Пиши сразу на С, незачем делать одну и ту-же работу 3 раза, да еще маятся с Дельфи "драйвером" бррр...
|