Допустим есть драйвер. Мы его загружаем в память - ZwLoadDriver И потом можно удалить файл с диска. Вопрос: почему так получается, если учесть что он после этого продолжает работать? Размер драйвера 10 кб.. Кто-нибудь может пояснить или отправить на литературу? Прочел Солдатова - Программирование драйверов Windows, и еще "ПРограммирование драйверов и систем безопасности" - не помню автора.. Там либо эти вопросы не задевались, либо я пропустил.. Еще половину книги Руссиновича прочел.. сенкс
test555 Загрузка драйвера происходит следующим образом. NtLoadDriver формирует пакет (work-item), который доставляется одному из рабочих потоков процесса System (worker-threads). Рабочий поток в контексте System исполняет функцию IopLoadUnloadDriver (с именами внутренних функций могу налажать, ибо не помню уже, но это не играет совершенно никакой роли), которая для загрузки драйвера вызывает IopLoadDriver (просто та же IopLoadUnloadDriver доставляеся как worker routine и в случае выгрузки), а IopLoadDriver в конечном итоге вызывает MmLoadSystemImage. MmLoadSystemImage производит следующие манипуляции: 1) файл открывается и проецируется на юзермодное АП процесса System обычными ZwOpenFile, ZwCreateSection,... 2) выделяется место нужного размера в памяти ядра итуда просто постранично копируется этот вид, 3) после чего вид уничтожается и файл закрывается. Имеем: в памяти ядра находится полная копия файла, а хендл файла закрыт и файл спокойно может быть удален. Если в драйвере есть подкачиваемые секции, их хранилищем на случай page out будет файл подкачки. PS. Читаем комментарий внутри MmLoadSystemImage в wrk исходниках: Код (Text): base/ntos/mm/sysload.c 01326 // 01327 // Normal drivers are dereferenced here and their images can then be 01328 // overwritten. This is ok because we've already read the whole thing 01329 // into memory and from here until reboot (or unload), we back them 01330 // with the pagefile. 01331 // 01332 // Session space drivers are the exception - these images 01333 // are inpaged from the filesystem and we need to keep our reference to 01334 // the file so that it doesn't get overwritten. 01335 //
Great LdrpCreateDllSection тоже закрывает хендл файла - а удалить нельзя :-Р для DLL секция остается referenced, причем этот референс происходит внутри MapView а для драйвера секция силой зачем-то дереференсится этот коммент что ты процитировал мне лично не объясняет почему так точнее говоря я не понимаю почему MiLoadSystemImage работает так а LdrpLoadDll не так
Наверное потому, что подсчет ссылок для длл нужен для концепции неизменных разделяемых данных(при изменении соот-но данные дублируются, через copy-on-write), а для драйвера такой механизм попросту не нужен.
z0mailbox Ну дык, одна ссылка на файл неявная остается изза маппинга, а в драйвере лишних ссылок не остается. Ты же сам написал коммент, что я процитировал, просто подтверждает часть моих слов. а почему она так работает - это надо спросить у разработчиков.