Всем доброго времени суток! Понимаю, что звучит дико, но у меня в ОС Windows 7 32-bit не работает преобразование адреса. Никакое. Ни одно. Для примера - пытался определить физический адрес строки, виртуальный адрес которой равен 0x01024e7c. DirBase=0xbef5f2a0. WinDbg выдал следующее: Код (Text): lkd> !vtop bef5f2a0 1024e7c Pdi 8 Pti 24 01024e7c Not present (00000000) При попытке выполнить !pte в контексте данного процесса получил следующее: Код (Text): lkd> !pte 1024e7c VA 01024e7c PDE at 00000000C0600040 PTE at 00000000C0008120 contains 0000000000000000 Далее. Любое преобразование адреса из системного контекста дает результат Код (Text): lkd> !vtop 00185000 86c4a590 Pdi 436 Pti 4a PageDirectory Entry 1078 not valid, try another process С чем это может быть связано?
Lecko А что не так? Страница сейчас выгружена ('01024e7c Not present') и не имеет физического адреса. А адрес 00185000 не похож на адрес ядра. Судя по значению -- user mode.
Дело в том, что процесс в данный момент запущен, и эта переменная в нем явно используется. А, кроме того, аналогичный результат появляется при любом преобразовании виртуального адреса из данного процесса. Не может же он весь быть выгружен.
Новый эксперимент - не работает даже преобразование адреса токена: Код (Text): lkd> !vtop bef5a3a0 a2884c8f Pdi 514 Pti 84 PageDirectory Entry 1300 not valid, try another process Что происходит??
Полагаться на livekd я бы не стал: Лучше используй полноценный remote kernel debugging. Алсо, для чистоты эксперимента и выяснения дополнительных деталей, которые могут указать на причину проблемы, попробуй написать скрипт, который сам будет анализировать PDE/PTE и делать преобразование виртуального адреса в физический.
Мысль насчет скрипта хорошая, спасибо, попробую. lkd - это не LiveKD, а local kernel debug в WinDbg. И работает он, по-моему, все таки не со слепком (потому как память в нем я редактировал). Что касается дополнительных деталей: Код (Text): lkd> !pte 1024e7c VA 01024e7c PDE at 00000000C0600040 PTE at 00000000C0008120 contains 0000000000000000 В какой то момент он попадает на нулевое значение, и на этом прекращает свою жизнедеятельность. Возможно, неверно интрепретирует биты типа LargePage, или с контекстом что-то не то...завтра проверю
Это у тебя такой PFN для каталога страниц? о_0 Кстати, 0x00001078 = 00..001 0 0 00011 1100 0 (pagefilehigh transition prototype protection pagefilelow valid) Страница выгруженная, аттрибуты EXECUTE_READ, PFN в файле подкачки 0x1c. Иначе говоря, выгружаемая страница кода ядра. Ничего удивительного. Cr4sh Ну он просто динамически подгружает страницы. "does not show a single instant state" == при чтении подряд физстраниц данные могут быть неконсистентны (одну страницу прочитали, пока читали вторую - первую перезаписали), и не относится к актуальности их содержимого, AFAIR. Уж, судя по скорости, явно не скидывает на диск содержимое оперативы =)
Да, именно такой. Во всяком случае, такое значение лежит в поле DirectoryTableBase в KPROCESS. Вообще, PFN и правда странный. Логично. Но не может же быть выгружен, например, токен. А преобразование с его адресом дает такой же результат.