IoMarkIrpPending и все все все ...
От: izl3sa Россия  
Дата: 14.11.12 21:00
Оценка:
Наткнулся на неправильное объяснение необходимости if(irp->PendingReturned) IoMarkIrpPending(irp); в функции завершения, если последняя не возвращает STATUS_MORE_PROCESSING_REQUIRED. Сам факт того, что это распространяет SL_PENDING_RETURNED до верхнего элемента стека верен, но там говорится, что флаг SL_PENDING_RETURNED в верхнем элементе стека контролирует планирование APC зачистки в IoCompleteRequest для некоторых типов IRP, что не правда. Планирование APC в IoCompleteRequest (а точнее IofCompleteRequest) происходит почти всегда, кроме случаев установленного флага IRP_DEFER_IO_COMPLETION в irp->Flags (и тогда за очистку IRP ответственен пославший IRP код, это используется для оптимизации, тк при запросе из юзермода можно не планировать APC а просто вызвать функцию зачистки -> IopCompleteRequest) + спец. обработка для PAGING IO и CANCEL реквестов (но также никак не зависит от SL_PENDING_RETURNED). Этот флаг контролирует будет ли установлено событие в сигнальное состояние в IRP::UserEvent (или в FILE_OBJECT), на котором IO менеджер ждет завершения IRP в случае если вернулся STATUS_PENDING из IoCallDriver в случае синхронного IO запроса. Таким образом если не устанавливать SL_PENDING_RETURNED можно словить либо зависание всей системы, либо потоков приложения, которое обращается с синхронным IO. Как-то так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.