Я использую пример KbFilter в WDK, пытаясь отправить IOCTL в функцию, вызываемую KbFilter_ServiceCallback и, следовательно, выполняется на DISPATCH_LEVEL. Функция просто должна отправить IOCTL и вернуться, не дожидаясь заполнения буфера вывода, чтобы он мог быть асинхронным, срабатывать и забывать.Отправка IOCTL из IRQL = DISPATCH_LEVEL (KbFilter/KMDF)
я в настоящее время с помощью функции WDF WdfIoTargetFormatRequestForIoctl и WdfRequestSend, чтобы попытаться отправить на DISPATCH_LEVEL и не получить ничего. Вызов WdfRequestSend выполняется успешно, но IOCTL, похоже, не получен.
Использование любого из WdfIoTargetSendIoctlSynchronously или шаблон WDM IoBuildDeviceIoControlRequest() и IoCallDriver() требует PASSIVE_LEVEL и единственный способ, которым я знаю, называть их на PASSIVE_LEVEL будет создать отдельный поток, который проходит в PASSIVE_LEVEL и передать его инструкции через буфер или очередь, синхронизированную с помощью спин-блокировки и семафора.
Может ли кто-нибудь сказать мне, есть ли более простой способ передать IOCTLs драйверам под моим фильтром, или же поток/очередь подходят к нормальному шаблону, когда вам нужно делать что-то на более высоком IRQL? При каких обстоятельствах я могу использовать KeRaiseIrql и это то, что я должен использовать? Благодарю.
Я не знаком с WDF. –
Спасибо, как мне создать запрос IOCTL на уровне отправки? IoAllocateIrp и IoCallDriver оба находятся на уровне отправки, но для IoBuildDeviceIoControlRequest требуется пассивный уровень. –
на самом деле http://msdn.microsoft.com/en-us/library/ms801530.aspx говорит, что для этого требуется, по крайней мере, уровень APC, тогда как http://www.osronline.com/DDKx/kmarch/k104_8ble.htm говорит, что это необходимо быть на пассивном уровне .. странный –