Конференция "Прочее" » О пользе закрытия Handle`ов :)
 
  • Riply © (01.11.08 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 тремя часами своего собственного времени :)
  • Сергей М. © (01.11.08 12:32) [1]

    > Riply ©   (01.11.08 12:16)  


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


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

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

    А про контексты исполнения кода драйверов режима ядра можно почитать, скажем, на http://www.wasm.ru/article.php?article=drvw2k01 или непосредственно у Соломона с Руссиновичем
  • Сергей М. © (01.11.08 12:34) [2]
    Удалено модератором
    Примечание: Дубль...
  • Riply © (01.11.08 12:57) [3]
    > [1] Сергей М. ©   (01.11.08 12:32)
    > ...
    > Вот и все чудеса)

    Да чудеса-то я осознала :)
    Я вела к тому, что дорого приходиться платить (IMHO)
    за неряшливость при написании кода :)
  • Сергей М. © (01.11.08 13:01) [4]

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


    Поди и BSOD'ами по ходу дела насладилась по самое нехочу ,)
  • Rouse_ © (01.11.08 13:01) [5]

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

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

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


    Не пристало барышне быть неряхой)
  • Riply © (01.11.08 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 © (01.11.08 13:14) [8]
    > [6] Сергей М. ©   (01.11.08 13:07)
    > Не пристало барышне быть неряхой)

    Угу. Но пооправдываюсь:
    просто я забыла его внести в битовую маску инициализированных объектов.
    (я по ней определяюсь что надо создавать и освобожлать)
  • Rouse_ © (01.11.08 13:45) [9]

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

    Стесняюсь спросить - а нафига? :)
  • Riply © (01.11.08 13:53) [10]
    > [9] Rouse_ ©   (01.11.08 13:45)

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

    Эмулятор на Delphi, потому что здесь я себя свободнее чуствую.
    С не так быстро и легко осваивается, как хотелось бы :(
    Много досадных "опечаток".
    Далее, эмулятор легче портировать на Delphi-драйвер для проверки.
    Ну уж потом, с грехом попалам, переводим все на С.
    Вот так обстоят дела на текущий момент :)
  • Rouse_ © (01.11.08 15:18) [11]
    Пиши сразу на С, незачем делать одну и ту-же работу 3 раза, да еще маятся с Дельфи "драйвером" бррр...
 
Конференция "Прочее" » О пользе закрытия Handle`ов :)
Есть новые Нет новых   [134446   +31][b:0][p:0]