Вопрос

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

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

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

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

Это было полезно?

Решение

Используйте 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 = ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top