Мое почтение всем. Читаю про MDL, появилось несколько вопросов. 1. Насколько я понял, с помощью MDL можно спроецировать несколько страниц из kernel mode в user mode по схеме: Код (Text): pool = ExAllocatePool(NonPagedPool); pMdl = IoAllocateMdl(pool, size); MmBuildMdlForNonPagedPool(pMdl); UserAddress = MmMapLockedPagesSpecifyCache(pMdl); и передать UserAddress в user mode. Все это сугубо теоретически, я еще не пробовал так сделать. При этом MDL можно построить только для NonPaged страниц. Тогда непонятно, для чего нужна ф-ия MmProbeAndLockPages, которая получает построенный MDL. 2. В книге в качестве альтернативы к сбросу WP предлагается такой способ: Код (Text): pMdl = IoAllocateMdl(SSDT, sizeof(SSDT)); MmBuildMdlForNonPagedPool(pMdl); WritableAddress = MmMapLockedPages(pMdl, KernelMode); После чего можно писать по адресу WriteableAddress. С другой стороны в MSDN сказано: Получается, что метод не отличается стабильностью? Заранее благодарен.
MDL = Memory Descriptor List = Список "дескрипторов" физстраниц, или, на самом деле, просто их PFN'ов (page frame number). С помощью апишек MDL можно спроецировать любые страницы куда угодно, kernel-kernel, kernel-user, user-kernel, user-user. Чтобы страницы было безопасно проецировать, нужно быть увереным, что они не уйдут в pagefile (подкачку). Поэтому нужно либо брать неподкачиваемый пул (NonPagedPool), либо блокировать страницы подкачиваемого. В первом случае потребуется просто заполнить MDL номерами страниц через MmBuildMdlForNonPagedPool, во втором потребуется сделать MmProbeAndLockPages, чтобы "потыкать" их (при обращении они будут подгружены, если были выгружены) и заблокировать в физической памяти. После окончания работы в первом случае просто удаляем проекцию, во втором еще и снимаем блокировку (MmUnlockPages). Надеюсь, прояснил ситуацию.
Спасибо, это как раз я понимал, вроде. Просто не обратил внимания на то, что MmProbeAndLockPages заполняет PFN для MDL. l_inc указал мне на ошибку: Теперь понятно, что PFN заполняются не только в MmBuildMdlForNonPagedPool. Единственное, что не очень понятно -- зачем указывать 'KPROCESSOR_MODE AccessMode' -- разве ОС сама не может этого определить? Насчет kernel-kernel, видимо, MSDN запрещает, но все равно делают и работает. И еще: в описании к MmBuildMdlForNonPagedPool сказано: Что вообще имелось в виду?