Вопросик про загрузку дрова..

Тема в разделе "WASM.BEGINNERS", создана пользователем test555, 11 май 2009.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Допустим есть драйвер.
    Мы его загружаем в память - ZwLoadDriver
    И потом можно удалить файл с диска. Вопрос: почему так получается, если учесть что он после этого продолжает работать?
    Размер драйвера 10 кб..

    Кто-нибудь может пояснить или отправить на литературу?
    Прочел Солдатова - Программирование драйверов Windows, и еще "ПРограммирование драйверов и систем безопасности" - не помню автора..
    Там либо эти вопросы не задевались, либо я пропустил.. Еще половину книги Руссиновича прочел..

    сенкс
     
  2. apx

    apx New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2008
    Сообщения:
    25
    Object Section читай соломона русиновича
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    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):
    1. base/ntos/mm/sysload.c
    2. 01326     //
    3. 01327     // Normal drivers are dereferenced here and their images can then be
    4. 01328     // overwritten.  This is ok because we've already read the whole thing
    5. 01329     // into memory and from here until reboot (or unload), we back them
    6. 01330     // with the pagefile.
    7. 01331     //
    8. 01332     // Session space drivers are the exception - these images
    9. 01333     // are inpaged from the filesystem and we need to keep our reference to
    10. 01334     // the file so that it doesn't get overwritten.
    11. 01335     //
     
  4. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Спасибо. Ответ понятен.
     
  5. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Great
    LdrpCreateDllSection тоже закрывает хендл файла - а удалить нельзя :-Р

    для DLL секция остается referenced, причем этот референс происходит внутри MapView
    а для драйвера секция силой зачем-то дереференсится
    этот коммент что ты процитировал мне лично не объясняет почему так
    точнее говоря я не понимаю почему MiLoadSystemImage работает так а LdrpLoadDll не так
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Наверное потому, что подсчет ссылок для длл нужен для концепции неизменных разделяемых данных(при изменении соот-но данные дублируются, через copy-on-write), а для драйвера такой механизм попросту не нужен.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    z0mailbox
    Ну дык, одна ссылка на файл неявная остается изза маппинга, а в драйвере лишних ссылок не остается.
    Ты же сам написал:)

    коммент, что я процитировал, просто подтверждает часть моих слов.
    а почему она так работает - это надо спросить у разработчиков.