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


Операции с памятью - часть 3


Другое дело, если этот адрес окажется в распоряжении программного потока, созданного драйвером по вызову PsCreateSystemThread, где интерпретация данного адреса вызовет ошибку, поскольку, как указано в документации DDK, этот системный программный поток не имеет никакого пользовательского контекста. Это одна из проблем.

HAL 0xFFFFFFFF

...

Информация CRASH DUMP 0xFFC00000
...
Нестраничный пул 0xFFBE0000
...
Страничный пул ...
 0xE1000000
Файловый кэш  ...
 0xC1000000
Пространство файлового кэш-менеджера  ...
 0xC0C00000
Не используется  ...
 0xC0800000
Зарезервировано  ...
 0xC0400000
Элементы директории страниц (PDE)  ...
 0xC0300000
Элементы таблицы страниц (РТЕ)  ...
 0xC0000000
Не используется  ...
 0xA3000000
Memory Mapped files  
 
Копия операционной системы  ...
 0x80000000
Таблица 7.1. Диапазоны памяти системного адресного пространства Windows 2000

Вторая возможная проблема состоит в том, что к моменту обращения созданного программного потока к пользовательскому буферу, рассматриваемое пользовательское пространство вполне может оказаться в страничном файле на жестком диске, и (если поток повысил свой приоритет) неминуемо случится сбой системы, поскольку операционная система запрещает обработку таких ситуаций на высоких уровнях IRQL.

Чтобы решить задачу в данной постановке необходимо, во-первых, создать список MDL (структуру, хранящую отображение блока виртуальной памяти на физическую память), зафиксировать пользовательский буфер в физической оперативной памяти и передать MDL список (или соответствующий виртуальный адрес системного адресного пространства) рабочему потоку. По выполнении работы, следует разблокировать страницы пользовательского буфера и освободить структуру MDL списка. Соответственно, при этом делаются вызовы системных функций: IoAllocateMdl, MmProbeAndLockPages, MmGetSystemAddressForMdl, MmUnlockPages и IoFreeMdl.




Начало  Назад  Вперед