Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер, использующий подпрограммы поддержки MmLockPagableXxx и задающий пагинированные и отменяемые разделы, состоит из непагинированных разделов, пагинированных разделов и раздела INIT, который удаляется после инициализации драйвера.
После того как драйвер устройства подключает прерывания для устройств, которыми он управляет, путь обработки прерываний драйвера должен находиться в системной области. Код обработки прерываний должен быть частью раздела драйвера, который не может быть разорван, в случае прерывания.
Две дополнительные подпрограммы диспетчера памяти, MmPageEntireDriver и MmResetDriverPaging, можно использовать для переопределения страничных или неспраничных атрибутов разделов образа драйвера. Эти подпрограммы позволяют полностью выгружать драйвер из памяти, когда устройство, которым он управляет, не используется и не может вызывать прерывания.
Примеры системных драйверов, полностью страницируемых, являются драйвером win32k.sys, серийным драйвером, драйвером mailslot, драйвером beep и драйвером NULL.
Последовательный драйвер обычно используется периодически. До открытия управляемого им порта последовательный драйвер может быть полностью выгружен из памяти. Как только порт будет открыт, части последовательного драйвера, которые должны оставаться в памяти, должны быть перемещены в незагрузочное системное пространство. Другие части драйвера могут оставаться подкачиваемыми.
Драйвер, который может быть полностью выгружен из памяти, должен вызывать MmPageEntireDriver во время инициализации перед подключением прерываний.
Когда устройство, управляемое выгруженным драйвером, получает запрос на открытие, драйвер загружается в память. Затем драйвер должен вызвать MmResetDriverPaging перед подключением к прерываниям. Вызов MmResetDriverPaging приводит к тому, что диспетчер памяти обрабатывает разделы драйвера в соответствии с атрибутами, приобретенными во время компиляции и компоновки. Любой нестраничный раздел, такой как текстовый, будет выгружен в незагружаемую системную память; страничные разделы будут подгружаться по мере обращения к ним.
Такой драйвер должен хранить количество открытых дескрипторов на своих устройствах. Драйвер увеличивает количество по каждому открытому запросу для любого устройства и уменьшает количество при каждом закрытии запроса. Когда число достигает нуля, драйвер должен отключить прерывания, а затем вызвать MmPageEntireDriver. Если драйвер управляет несколькими устройствами, число должно быть равно нулю для всех таких устройств, прежде чем драйвер может вызвать MmPageEntireDriver.
Драйвер несет ответственность за выполнение любой синхронизации при изменении счетчика ссылок, а также для предотвращения изменения количества ссылок во время изменения состояния драйвера. То есть на компьютерах SMP драйвер должен убедиться, что MmPageEntireDriver не может выполняться на одном процессоре, в то время как на другом процессоре происходит открытый вызов, который приводит к подключению прерываний и увеличению счетчика ссылок.