MDL, вопросы

Тема в разделе "WASM.NT.KERNEL", создана пользователем Mika0x65, 29 ноя 2010.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Читаю про MDL, появилось несколько вопросов.

    1. Насколько я понял, с помощью MDL можно спроецировать несколько страниц из kernel mode в user mode по схеме:
    Код (Text):
    1. pool = ExAllocatePool(NonPagedPool);
    2. pMdl = IoAllocateMdl(pool, size);
    3. MmBuildMdlForNonPagedPool(pMdl);
    4. UserAddress = MmMapLockedPagesSpecifyCache(pMdl);
    и передать UserAddress в user mode. Все это сугубо теоретически, я еще не пробовал так сделать. При этом MDL можно построить только для NonPaged страниц. Тогда непонятно, для чего нужна ф-ия MmProbeAndLockPages, которая получает построенный MDL.

    2. В книге в качестве альтернативы к сбросу WP предлагается такой способ:
    Код (Text):
    1. pMdl = IoAllocateMdl(SSDT, sizeof(SSDT));
    2. MmBuildMdlForNonPagedPool(pMdl);
    3. WritableAddress = MmMapLockedPages(pMdl, KernelMode);
    После чего можно писать по адресу WriteableAddress. С другой стороны в MSDN сказано:
    Получается, что метод не отличается стабильностью?

    Заранее благодарен.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MDL = Memory Descriptor List = Список "дескрипторов" физстраниц, или, на самом деле, просто их PFN'ов (page frame number).
    С помощью апишек MDL можно спроецировать любые страницы куда угодно, kernel-kernel, kernel-user, user-kernel, user-user.
    Чтобы страницы было безопасно проецировать, нужно быть увереным, что они не уйдут в pagefile (подкачку). Поэтому нужно либо брать неподкачиваемый пул (NonPagedPool), либо блокировать страницы подкачиваемого.
    В первом случае потребуется просто заполнить MDL номерами страниц через MmBuildMdlForNonPagedPool, во втором потребуется сделать MmProbeAndLockPages, чтобы "потыкать" их (при обращении они будут подгружены, если были выгружены) и заблокировать в физической памяти.
    После окончания работы в первом случае просто удаляем проекцию, во втором еще и снимаем блокировку (MmUnlockPages).

    Надеюсь, прояснил ситуацию.
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Спасибо, это как раз я понимал, вроде. Просто не обратил внимания на то, что MmProbeAndLockPages заполняет PFN для MDL. l_inc указал мне на ошибку:
    Теперь понятно, что PFN заполняются не только в MmBuildMdlForNonPagedPool. Единственное, что не очень понятно -- зачем указывать 'KPROCESSOR_MODE AccessMode' -- разве ОС сама не может этого определить?

    Насчет kernel-kernel, видимо, MSDN запрещает, но все равно делают и работает.

    И еще: в описании к MmBuildMdlForNonPagedPool сказано:
    Что вообще имелось в виду?