Способы изменить юзерскую память из кернела

Тема в разделе "WASM.WIN32", создана пользователем Saint German, 10 ноя 2005.

  1. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    А ты поищи по форуму, я где-то выкладывал файл, базчекс вроде.
     
  2. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    В твоем файле я тоже такого не нашел.
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Narkoliga

    Ну хорошо, тогда как же сделать так, чтобы функция находилась? Или как можно ее заменить каким-нибудь своим макросом?
     
  4. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    ubil

    и правда нету, по смыслу, могу предположить,

    PAGE_FAULT_IN_NONPAGEN_AREA
     
  5. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Saint German

    Мне сказал чел один, что bsod получается из-за того, что я не поместил MmProbeAndLockPages в try-except блок. Хотя вроде бы как у меня и с try-except бсод был.
     
  6. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
  7. _CC

    _CC New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    52
    2ubil:

    >> Нужно просто максимально быстро давать usermode знать что

    >> внутри драйвера творится, и также быстро давать ему команды

    А что стоит создать общий раздел в памяти, и пусть юзермодное приложение читает оттуда инфу, а драйвер, соответственно, пишет?.. Правда придется синхронизировать эти операции..
     
  8. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    _CC

    Я с самого начала так хотел делать, но меня отговорили. Мне нужно реагировать примерно за микросекунду, а время переключения потоков в винде вроде бы как ~1 миллисекунда => так не пойдет.

    Но я уже скоро может KeUserModeCallback научусь пользоваться, надеюсь это полностью удовлетворит мои потребности в скорости.
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    ubil

    Имхо обрабатывать быстрые события с помощью юзермодного кода это весьма криво.

    Для этого можно использовать весьма кривой, но всетаки быстрый метод: находясь в ринг0 заполнить параметры возврата в стеке (с CS = 1B) и сделать iretd, и сразу окажемся в ринг3, а когда сделаем все что там нужно, то назад можно вернуться через установленый в GDT колгейт либо через прерывание.
     
  10. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Ну, вроде бы как нормально поместив функцию в try - catch блок я уже перестал видеть синий экран. Но MmProbeAndLockPages все-равно не хочет успешно работать, GetExceptionCode выдает c0000005 - к чему бы это? Кстати, это число было на синем экране тоже:)

    Ms Rem,

    Спасибо за совет, если не будет хватать скорости - придется пытаться делать так...
     
  11. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Ваще мистика...

    Кароче я вдруг решил решил протестить с помощью MmIsAddressValid будет ли pf или нет если я стану обращаться к памяти юзера... Она выдала TRUE. Я кароче решил считать шо там есть... Зная уже что ща будет опять синий экран и неприятный звук в наушниках нажимаю ентер - и нифига - все правильно считалось, без bsod-ов. Странно как-то...

    Но хотелось бы все-таки как-то научиться лочить страницы...
     
  12. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    STATUS_ACCESS_VIOLATION





    Ты обращаешся к памяти на чтение или на запись? На тех страницах стоят соответствующие атрибуты?
     
  13. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    И зря решил, эта функция должна использоваться только для неподкачиваемой памяти.
     
  14. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    ****Ты обращаешся к памяти на чтение или на запись? На тех страницах стоят соответствующие атрибуты?****

    Обращаюсь сейчас на на чтение. Но запись тоже нужна будет. Какие атрибуты - не знаю, процесс к которому приаттачиваюсь - консольное приложение.

    Тут наверное все дело в том, как я MDL заполняю. Я это делаю след образом:

    pDE->pUserMDL =

    IoAllocateMdl(

    (PVOID)pDE->KCT/*адрес массива в процессе юзера*/,

    20/*его размер*/,

    FALSE/*no IRP is associated with the MDL*/,

    TRUE/*...context of the thread that originates...*/,

    NULL/*нет IRP*/);



    Что здесь не так? Хотя я уже наверное все комбинации перепробовал + функцию MmInitializeMdl, а результат один...
     
  15. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вроде все правильно и должно работать.

    Попробуй посмотри в айсе что лежит по адресу pDE->KCT когда ты вызываеш MmProbeAndLockPages, скорее всего дело в неправильно переданом адресе. И с какими параметрами ты вызываеш MmProbeAndLockPages?

    Правильно будет так: MmProbeAndLockPages(pDE->pUserMDL, UserMode, IoReadAccess);
     
  16. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    ****Попробуй посмотри в айсе что лежит по адресу pDE->KCT...****

    Так я же ее уже благополучно считал безо всяких заморочек(после того как удостоверился что она не сброшена никуда). А в Сайсе я пока не спец, так что пока без него обходимся:)

    Я сейчас попробовал создать буфер pageble памяти и передать ее адрес вместо pDE->KCT - все сработало замечательно. Это меня наводит на мысль, что память по адресу pDE->KCT уже залочена системой, а это значит что можно спокойно к ней обращаться с помощью обычных средств. Только вот нет гарантии, что ее при каких-нибудь условиях не разлочат и не сбросят на диск(например если система "заснет").

    ****Правильно будет так: MmProbeAndLockPages(pDE->pUserMDL, UserMode, IoReadAccess);****

    Кстати в этом случае чтобы все заработало надо было написать KernelMode(Иначе будет все также). А вот чтобы доступ из UserMode сохранился - я, как мне представляется, должен буду здесь указать параметр UserMode:

    pDE->Buffer = MmMapLockedPages(pDE->pUserMDL, UserMode);
     
  17. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    PROCESSOR_MODE передаваемый в MmProbeAndLockPages означает только режим проверки адресов на их принадлежность к юзермодной памяти, а в MmMapLockedPages определяет куда они буду спроецированы (в юзермодную память или в память ядра).
     
  18. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Ms Rem,

    А вот если страница имеет атрибут READONLY(но это не код), можно как-то в нее что-то записать? Желательно с помощью функций DDK, чтобы не лазать самому в таблицу страниц.
     
  19. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    С помощью MDL можно ее отобразить на другую страницу с нужными атрибутами.
     
  20. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    ****С помощью MDL можно ее отобразить на другую страницу с нужными атрибутами.****

    Используя MmMapLockedPages?



    А если делать через каталоги, то надо в контксте данного процесса получить cr3, получить каталог страниц по смещению задаваемому битами 31-22 виртуального адреса к которому нужно получить доступ, в этом каталоге получить адрес таблицы страниц(биты 31-12 элемента полученного каталога страниц, а остальные - нули), установить бит 1 в элементе каталога страниц, по битам 21-12 виртуального адреса найти нужную страницу в уже найденной таблице страниц и в ней тоже установить бит 1? Я правильно все понимаю?

    Че-та я не могу ваще никак обращаться к элементам каталога страниц, тоже получается исключение access_violation.