MmGetSystemAddressForMdlSafe и MmBuildMdlForNonPagedPool

Тема в разделе "WASM.NT.KERNEL", создана пользователем Mika0x65, 24 дек 2011.

  1. Mika0x65

    Mika0x65 New Member

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

    Пара вопросов по этим ф-иям.

    1. MmGetSystemAddressForMdlSafe -- макрос проверяет, есть ли отображение для MDL в адресном пространстве ядра и если нет, то создает его с помощью MmMapLockedPagesSpecifyCache. Вопрос в том, как я узнаю, было ли создано отображение или нет в случае получения MDL извне. Т.е. как я узнаю, надо ли вызвать MmUnmapLockedPages или нет. Если драйвер, передавший MDL уже отобразил его в адреса ядра, то MmMapLockedPagesSpecifyCache вызвана не будет, мне вернется существующий виртуальный адрес. В этом случае вызывать MmUnmapLockedPages не надо. Если отображения не было, то вызвать MmUnmapLockedPages надо. Но как это узнать? Или я чего-то недопонимаю в использовании этой ф-ии?

    2. Встретил в интернете такой код:

    Код (Text):
    1.          if(pMmMapLockedPagesSpecifyCache != NULL)
    2.         {
    3.             MmProbeAndLockPages(Irp->MdlAddress,
    4.                                 KernelMode,
    5.                                 Operation);
    6.             IrpContext->LockedCount++;
    7.  
    8.             if(Irp->MdlAddress->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
    9. MDL_SOURCE_IS_NONPAGED_POOL))
    10.             {
    11.                 IrpContext->LockedBuffer =
    12. Irp->MdlAddress->MappedSystemVa;
    13.             }
    14.             else
    15.             {
    16.                 IrpContext->LockedBufferMdl = Irp->MdlAddress;
    17.                 IrpContext->LockedBuffer =
    18. pMmMapLockedPagesSpecifyCache(
    19.                                                   Irp->MdlAddress,
    20.                                                   KernelMode,
    21.                                                   MmCached,
    22.                                                   NULL,
    23.                                                   FALSE,
    24.                                                   NormalPagePriority);
    25.             }
    26.         }
    Сначала идет вызов MmProbeAndLockPages, затем MmMapLockedPagesSpecifyCache. Код, как я понимаю, работает. Но почему нет вызова MmBuildMdlForNonPagedPool? Ведь MmProbeAndLockPages не создается PFN'ы для MDL.

    Заранее благодарю за ответ.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    А откуда, например, известно, что память, описываемая полученным от левого драйвера MDL, залочена?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    l_inc
    Это обязанность драйвера -- передавать MDL, которые probed and locked, если верить восьмому посту здесь: http://www.osronline.com/showThread.cfm?link=68730. Вопрос в том, как MDL была создана. Если это, например, MmBuildMdlForNonPagedPool, то вызывать MmUnlockPages не надо. А если MmProbeAndLock, то надо. Кстати, MmBuildMdlForNonPagedPool сразу выделяет виртуальную память в адресах ядра, насколько я понимаю.

    Интересно, атрибуты доступа страниц копируются? Я просто думаю об использовании MmBuildMdlForNonPagedPool для записи, например, в SSDT вместо сброса CR0.WP, т.к. это, вроде, более стабильно. С другой стороны вызывать MmMapLockedPagesSpecifyCache для MDL, построенной с помощью MmBuildMdlForNonPagedPool нельзя, подозреваю от того, что при вызове MmMapLockedPagesSpecifyCache будет перезаписан MDL::MappedSystemVa, что чревато утечкой виртуальных адресов. Еще не проверял, так, просто подумалось в эту сторону.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    Ни в каком случае не надо. Если передающий драйвер сам лочил страницы, он сам же их и разлочит. А MmUnlockPages в том числе и размапит страницы из системного АП, если они там присутствуют.
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    l_inc
    Ага, прочитал про MmUnlockPages есть там такое:
    С другой стороны в описании MmGetSystemAddressForMdlSafe написано:

    Насчет MmUnlockPages и MDL::MappedSystemVa понятно, с другой стороны интересно, что имелось в виду в описании MmGetSystemAddressForMdlSafe.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    А MmUnlockPages он тоже не вызовет несмотря на то, что вызывал MmProbeAndLockPages?
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    l_inc
    Я пост исправил :). Пока ответ читал, отвлекли, потом перечитал справку к MmUnlockPages, все сошлось. Вопрос, правда, остался, но это уже просто любопытство.
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    Ну если просто любопытство, то по большому счёту что мешает вместо явного использования макроса раскрыть его и проверять MdlFlags самостоятельно так же, как это сделано в коде из #1?
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    l_inc
    Тот подход работать будет, но он не совсем правильный в том смысле, что теоретически нельзя напрямую читать MDL::Flags. Если есть возможность делать документированным способом, то лучше делать им.

    Ну а по сути я на все вопросы ответы уже получил, спасибо.