Предполагает ли MmUnmapLockedPages освободить виртуальный адрес - PullRequest
0 голосов
/ 17 июня 2019

Я разделяю память между моим драйвером и приложением. После того, как я выделил и Mapping , я очищаюсь с помощью Unmapping и Free . Я обнаружил, что Выделение и сопоставление будет выделять совершенно новую страницу виртуальной памяти в приложении, к которой могут обращаться как драйвер, так и приложение, но она не исчезает после того, как я убирать . Я хочу знать, стоит ли ожидать, что страница будет свободной после того, как я все-таки уберусь.

Я видел, что MmAllocatePagesForMdlEx и MmMapLockedPagesSpecifyCache будет выделять совершенно новую страницу виртуальной памяти в приложении, которая ранее не отображалась в списке памяти. После того, как я очистил с помощью MmUnmapLockedPages и MmFreePagesFromMdl , я все еще вижу , который выделил память в списке, которая все еще может быть чтение и запись отладчиком и приложением VC ++. Я подумала о том, что очистка не удалась, но меня смущает другое. Очистка будет ноль страницы памяти, что заставляет меня думать, что это на самом деле работает. И есть еще одна вещь, которую я сделал. Я использую инструмент под названием CE для чтения памяти, но в результате он не может быть прочитан . CE использует ReadProcessMemory для чтения памяти. Поэтому я снова запутался. Подводя итог, я сделал

  • Allocate - MmAllocatePagesForMdlEx
  • Карта - MmMapLockedPagesSpecifyCache
  • Unmap - MmUnmapLockedPages
  • Бесплатно - MmFreePagesFromMdl

Результат

  • VC ++ отладчик может читать очищенную память
  • Приложение может читать очищенную память
  • CE, использующий стандартный API, не может прочитать очищенную память
  • CE, использующий стандартный API, может видеть информацию о памяти в списке памяти

Метод, который я использовал для проверки чтения очищенной памяти

  • VC ++ отладчик - на вкладке памяти, перейти к адресу
  • Приложение - значение = ^ (ULONG64 ^) addr; // звезда отключена

Основной код указан ниже:

mdl = MmAllocatePagesForMdlEx(least, most, least, totalBytes, MmCached, 0);
MmGetSystemAddressForMdlSafe(mdl, NormalPagePriority);
MmUnmapLockedPages(userAddr, mdl);
MmFreePagesFromMdl(mdl);

Я ожидал, что после того, как я сделал последние два кода, упомянутых выше, выделенная память будет свободной, потому что свободна даже отображенная физическая память. Итак, еще раз, мой вопрос: стоит ли ожидать, что очищенная память станет Нет доступа в пространстве приложения / пользовательского режима.

...