Я разделяю память между моим драйвером и приложением.
После того, как я выделил и 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);
Я ожидал, что после того, как я сделал последние два кода, упомянутых выше, выделенная память будет свободной, потому что свободна даже отображенная физическая память.
Итак, еще раз, мой вопрос: стоит ли ожидать, что очищенная память станет Нет доступа в пространстве приложения / пользовательского режима.