Программирование драйверов Windows

       

Проблемы, возникающие при перемещении кода в страничную память


В стремлении оказать системе хорошую услугу важно остановиться в нужном месте. В случае, если драйвер обслуживает прерывание, а оно поступило как раз в тот момент, когда ISR процедура, предназначенная для него, оказалась на жестком диске, среди другого кода категории PAGE, то крах системы неминуем.

Соответственно, если пользователь прекращает работу с драйвером вызовом CloseHandle

(в результате чего вызывается драйверная процедура, обслуживающая запрос IRP_MJ_CLOSE), то драйвер может выполнить перевод всего своего кода в область страничной памяти, после чего он, возможно, окажется сброшенным на диск. Разумеется, имеет смысл проверить предварительно, сколько раз был получен доступ к драйверу (возможно, имеются еще пользовательские приложения, имеющие открытый дескриптор). Если драйвер подключен к прерыванию, следует отключиться от него. Обратные действия (восстановления прежнего состояния драйверных процедур) можно проделать в процедуре, обслуживающей IRP_MJ_CREATE, то есть когда пользовательское приложение пытается получить доступ к драйверу и получить соответствующий дескриптор вызовом пользовательского режима CreateFile.

Контроль за количеством обращений к драйверу можно вести при помощи системных вызовов InterlockedIncrement и InterlockedDecrement, обеспечивающих безопасное обращение к счетчику, который можно разместить, например, в расширении структуры устройства (device extension), состав которой полностью зависит от воли разработчика драйвера.

Следует также помнить, что после старта драйвера секции, отнесенные при компиляции к типу INIT перестают существовать, поэтому использовать их в операциях по перемещению из/в страничную память нельзя.



Содержание раздела