Enviando IOCTL de IRQL = DISPATCH_LEVEL (KbFilter / KMDF)
Pregunta
Estoy utilizando el ejemplo KbFilter en el WDK, tratando de enviar un IOCTL en una función que se llama por KbFilter_ServiceCallback y por lo tanto se ejecuta al DISPATCH_LEVEL. La función sólo tiene que enviar un IOCTL y vuelta, no estoy esperando a un búfer de salida para ser llenado por lo que puede ser asíncrono, dispara y olvida.
Actualmente estoy usando las funciones WDF WdfIoTargetFormatRequestForIoctl y WdfRequestSend para tratar de enviar al DISPATCH_LEVEL y no conseguir nada. La llamada a WdfRequestSend está teniendo éxito, pero el IOCTL no parece ser recibido.
El uso de cualquiera de los WdfIoTargetSendIoctlSynchronously o el patrón WDM IoBuildDeviceIoControlRequest () y IoCallDriver () requiere PASSIVE_LEVEL y la única manera que conozco para llamar a estos en PASSIVE_LEVEL es crear una separada hilo que corre en PASSIVE_LEVEL y pasarlo instrucciones a través de una memoria intermedia o una cola, sincronizado con un spinlock y semáforo.
Puede alguien decirme si hay una manera más fácil de pasar IOCTLs a los conductores a mi filtro, o es el hilo / cola de acercarse al patrón normal cuando se necesita para hacer las cosas en una IRQL alto? ¿En qué circunstancias se pueden usar I KeRaiseIrql y es esto lo que debo usar? Gracias.
Solución
Uso IoAllocateIrp y IoCallDriver. Se pueden ejecutar en IRQL <= DISPATCH_LEVEL.
No se puede bajar su IRQL (a menos que usted es quien lo levantó). KeRaiseIrql sólo se utiliza para elevar IRQL. Una llamada a KeRaiseIrql es válida si la persona que llama especifica NewIrql> = CurrentIrql.
Tenga cuidado:? Se espera que su IOCTL en DISPATCH_LEVEL
Este es un fragmento de código:
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 = ...