Отправка IOCTL из IRQL = DISPATCH_LEVEL (KbFilter / KMDF) - PullRequest
6 голосов
/ 03 октября 2009

Я использую пример KbFilter в WDK, пытаясь отправить IOCTL в функцию, которая вызывается KbFilter_ServiceCallback и, следовательно, выполняется в DISPATCH_LEVEL. Функция просто должна отправить IOCTL и вернуться, не ожидая заполнения выходного буфера, чтобы он мог быть асинхронным, запускаться и забываться.

В настоящее время я использую функции WDF WdfIoTargetFormatRequestForIoctl и WdfRequestSend , чтобы попытаться отправить на DISPATCH_LEVEL и ничего не получить. Вызов WdfRequestSend выполняется успешно, но IOCTL не получен.

Использование любого из WdfIoTargetSendIoctlSynchronously или шаблона WDM IoBuildDeviceIoControlRequest () и IoCallDriver () требует PASSIVE_LEVEL, и единственный способ, которым я знаю, является создание отдельного потока, который создает VEL для вызова PASSIVE_, работает в PASSIVE_LEVEL и передает ему инструкции через буфер или очередь, синхронизированные с спин-блокировкой и семафором.

Может кто-нибудь сказать мне, есть ли более простой способ передать IOCTL в драйверы под моим фильтром, или поток / очередь приближаются к нормальному образцу, когда вам нужно сделать что-то с более высоким IRQL? При каких обстоятельствах я могу использовать KeRaiseIrql и это то, что я должен использовать? Спасибо.

1 Ответ

5 голосов
/ 05 октября 2009

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

Вы не можете понизить 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 = ...
...