Отправка IOCTL из IRQL=DISPATCH_LEVEL (KbFilter/KMDF)
Вопрос
Я использую пример 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 = ...