Эксперименты с mdl и системными пулами показали следующее:
- NonPagedPool – после освобождения память возвращается в пул, но никуда не девается, по виртуальным адресам можно читать\писать. Когда строишь MDL для этого буфера и после освобождения получаешь новую ссылку на него (MmGetSystemAddressForMdlSafe), то она равна старому виртуальному адресу и доступна для обращения, что понятно, тк в DDK прямо сказано, что при использовании MmBuildMdlForNonPagedPool возвращается уже старый виртуальный адрес, а не создается новое отображение физических страниц на виртуальные.
- Если использовать MmBuildMdlForNonPagedPool над подкачиваемым буфером, возвращается (MmGetSystemAddressForMdlSafe) также старый адрес, который был валидным на момент вызова функции. Но ExFreePool полностю деммепирует (?) виртуальный адрес, и он становится невалидным.
- Если же нормальным образом залочить страницы вызовом MmProbeAndLockPages, то после ExFreePool MmGetSystemAddressForMdlSafe вернет новый виртуальный адрес на которые отобразятся нужные нам физические страницы.
Вобщем нужно изучить подробнее саму архитектуру памяти в x86 и реализацию менеджера памяти Windows для более полного и глубокого понимания картины. Но в общем случае понятно зачем mdl нужны и как их использовать.
Я с дровами на “Вы”, поэтому и пишу просьбу:
Будет здорово если раскроешь тему MDL на уровне вопросов:
1) Что это?
2) Где встречается?
3) Какие методы работы?
ну у меня у самого не так хорошо с ними =) Но напишу чуть позже =)