Момент при работе с IRP PAGING IO.

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

  1. r0m4n

    r0m4n New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2011
    Сообщения:
    9
    Здравствуйте.

    Мой драйвер обрабатывает данные запросов IRP_MJ_WRITE с флагом PAGING IO. Во время работы необходимо буферизировать/задерживать некоторые подобные IRP (IRP завершаются, а данные сохраняются в моём буфере), а при определённых условиях записывать их на диск.

    Подскажите пожалуйста каким образом можно записать на диск, то есть пустить дальше по назначению, те в своп, ранее буферизированное.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В чём непосредственно сложность-то? Пишешь очередь для данных, скидываешь когда надо. Плюс не забудь придумать, что будешь делать, когда только что записанные данные потребуются приложению и тебе придёт Read-запрос.
     
  3. r0m4n

    r0m4n New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2011
    Сообщения:
    9
    Я правильно понимаю, что правила работы в paging path ничем не отличается от обычной обработки IRP, кроме того что во избежание рекурсии, код функций должен быть NON PAGEABLE?
    То есть можно невозбранно хоть собственные IRP создать, хоть открыть файл свопа напрямую...
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В общем и целом - да, если не считать того, что Paging I/O запрос это своего рода стрессовая ситуация для системы и тебе следует хорошо понимать, что ты делаешь, если ты собираешься обрабатывать такие запросы не совсем стандартным образом (т.е. по сути изменять поведение системных механизмов, таких как #PF, к примеру).

    Между прочим, в этом случае будет не обычная рекурсия, а double fault, что приведёт к падению.

    Можно, конечно, если IRQL правильный для того запроса, который ты собрался послать.

    А этого тебе просто так система сделать не даст (sharing violation ибо).