Здравствуйте. Мой драйвер обрабатывает данные запросов IRP_MJ_WRITE с флагом PAGING IO. Во время работы необходимо буферизировать/задерживать некоторые подобные IRP (IRP завершаются, а данные сохраняются в моём буфере), а при определённых условиях записывать их на диск. Подскажите пожалуйста каким образом можно записать на диск, то есть пустить дальше по назначению, те в своп, ранее буферизированное.
В чём непосредственно сложность-то? Пишешь очередь для данных, скидываешь когда надо. Плюс не забудь придумать, что будешь делать, когда только что записанные данные потребуются приложению и тебе придёт Read-запрос.
Я правильно понимаю, что правила работы в paging path ничем не отличается от обычной обработки IRP, кроме того что во избежание рекурсии, код функций должен быть NON PAGEABLE? То есть можно невозбранно хоть собственные IRP создать, хоть открыть файл свопа напрямую...
В общем и целом - да, если не считать того, что Paging I/O запрос это своего рода стрессовая ситуация для системы и тебе следует хорошо понимать, что ты делаешь, если ты собираешься обрабатывать такие запросы не совсем стандартным образом (т.е. по сути изменять поведение системных механизмов, таких как #PF, к примеру). Между прочим, в этом случае будет не обычная рекурсия, а double fault, что приведёт к падению. Можно, конечно, если IRQL правильный для того запроса, который ты собрался послать. А этого тебе просто так система сделать не даст (sharing violation ибо).