2009-10-03 3 views
6

Я использую пример 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 и это то, что я должен использовать? Благодарю.

ответ

5

Использование IoAllocateIrp и IoCallDriver. Их можно запустить в IRQL < = DISPATCH_LEVEL.

Вы не можете опустить свой IRQL (если только вы не подняли его). KeRaiseIrql используется только для повышения IRQL. Вызов KeRaiseIrql действителен, если вызывающий объект указывает NewIrql> = CurrentIrql.

Будьте осторожны: ожидается ли ваш IOCTL на DISPATCH_LEVEL?

Вот фрагмент кода:

PIRP Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE); 

Irp->Tail.Overlay.Thread = PsGetCurrentThread(); 
Irp->RequestorMode  = KernelMode; 
Irp->IoStatus.Status  = STATUS_NOT_SUPPORTED; 
Irp->IoStatus.Information = 0; 

PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp); 
stack->MajorFunction  = IRP_MJ_DEVICE_CONTROL; 
stack->Parameters.DeviceIoControl.IoControlCode = ... 
+0

Я не знаком с WDF. –

+0

Спасибо, как мне создать запрос IOCTL на уровне отправки? IoAllocateIrp и IoCallDriver оба находятся на уровне отправки, но для IoBuildDeviceIoControlRequest требуется пассивный уровень. –

+0

на самом деле http://msdn.microsoft.com/en-us/library/ms801530.aspx говорит, что для этого требуется, по крайней мере, уровень APC, тогда как http://www.osronline.com/DDKx/kmarch/k104_8ble.htm говорит, что это необходимо быть на пассивном уровне .. странный –

Смежные вопросы