Не работает преобразование виртуального адреса в физический

Тема в разделе "WASM.NT.KERNEL", создана пользователем Lecko, 23 мар 2011.

  1. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Всем доброго времени суток!

    Понимаю, что звучит дико, но у меня в ОС Windows 7 32-bit не работает преобразование адреса. Никакое. Ни одно.

    Для примера - пытался определить физический адрес строки, виртуальный адрес которой равен 0x01024e7c. DirBase=0xbef5f2a0. WinDbg выдал следующее:

    Код (Text):
    1. lkd> !vtop bef5f2a0 1024e7c
    2. Pdi 8 Pti 24
    3. 01024e7c Not present (00000000)
    При попытке выполнить !pte в контексте данного процесса получил следующее:
    Код (Text):
    1. lkd> !pte 1024e7c
    2.                VA 01024e7c
    3. PDE at 00000000C0600040    PTE at 00000000C0008120
    4. contains 0000000000000000
    Далее. Любое преобразование адреса из системного контекста дает результат
    Код (Text):
    1. lkd> !vtop 00185000 86c4a590
    2. Pdi 436 Pti 4a
    3. PageDirectory Entry 1078 not valid, try another process
    С чем это может быть связано?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Lecko
    А что не так? Страница сейчас выгружена ('01024e7c Not present') и не имеет физического адреса. А адрес 00185000 не похож на адрес ядра. Судя по значению -- user mode.
     
  3. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Дело в том, что процесс в данный момент запущен, и эта переменная в нем явно используется. А, кроме того, аналогичный результат появляется при любом преобразовании виртуального адреса из данного процесса. Не может же он весь быть выгружен.
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А переключение на контекст этого процесса сделано было? '.process /p EPROCESS'?
     
  5. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Разумеется :)
     
  6. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Новый эксперимент - не работает даже преобразование адреса токена:
    Код (Text):
    1. lkd> !vtop bef5a3a0 a2884c8f
    2. Pdi 514 Pti 84
    3. PageDirectory Entry 1300 not valid, try another process
    Что происходит??
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я не обратил внимания сразу -- это lkd? Просто нет уверенности, что lkd поддерживает такие операции.
     
  8. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Поддерживает. НА ХР все прекрасно работает. На Win7 x64 - тоже.
     
  9. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Полагаться на livekd я бы не стал:
    Лучше используй полноценный remote kernel debugging.
    Алсо, для чистоты эксперимента и выяснения дополнительных деталей, которые могут указать на причину проблемы, попробуй написать скрипт, который сам будет анализировать PDE/PTE и делать преобразование виртуального адреса в физический.
     
  10. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Мысль насчет скрипта хорошая, спасибо, попробую. lkd - это не LiveKD, а local kernel debug в WinDbg. И работает он, по-моему, все таки не со слепком (потому как память в нем я редактировал). Что касается дополнительных деталей:
    Код (Text):
    1. lkd> !pte 1024e7c
    2.                VA 01024e7c
    3. PDE at 00000000C0600040    PTE at 00000000C0008120
    4. contains 0000000000000000
    В какой то момент он попадает на нулевое значение, и на этом прекращает свою жизнедеятельность. Возможно, неверно интрепретирует биты типа LargePage, или с контекстом что-то не то...завтра проверю
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Это у тебя такой 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. Уж, судя по скорости, явно не скидывает на диск содержимое оперативы =)
     
  12. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Да, именно такой. Во всяком случае, такое значение лежит в поле DirectoryTableBase в KPROCESS. Вообще, PFN и правда странный.

    Логично. Но не может же быть выгружен, например, токен. А преобразование с его адресом дает такой же результат.