Непонятки с MDL

Эксперименты с mdl и системными пулами показали следующее:

- NonPagedPool – после освобождения память возвращается в пул, но никуда не девается, по виртуальным адресам можно читать\писать. Когда строишь MDL для этого буфера и после освобождения получаешь новую ссылку на него (MmGetSystemAddressForMdlSafe), то она равна старому виртуальному адресу и доступна для обращения, что понятно, тк в DDK прямо сказано, что при использовании MmBuildMdlForNonPagedPool возвращается уже старый виртуальный адрес, а не создается новое отображение физических страниц на виртуальные.

- Если использовать MmBuildMdlForNonPagedPool над подкачиваемым буфером, возвращается (MmGetSystemAddressForMdlSafe) также старый адрес, который был валидным на момент вызова функции. Но ExFreePool полностю деммепирует (?) виртуальный адрес, и он становится невалидным.

- Если же нормальным образом залочить страницы вызовом MmProbeAndLockPages, то после ExFreePool MmGetSystemAddressForMdlSafe вернет новый виртуальный адрес на которые отобразятся нужные нам физические страницы.

Вобщем нужно изучить подробнее саму архитектуру памяти в x86 и реализацию менеджера памяти Windows для более полного и глубокого понимания картины. Но в общем случае понятно зачем mdl нужны и как их использовать.

2 Responses to Непонятки с MDL

  1. NTvisigoth says:

    Я с дровами на “Вы”, поэтому и пишу просьбу:
    Будет здорово если раскроешь тему MDL на уровне вопросов:
    1) Что это?
    2) Где встречается?
    3) Какие методы работы?

  2. izl3sa says:

    ну у меня у самого не так хорошо с ними =) Но напишу чуть позже =)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.