2009-10-03 8 views
6

Estoy utilizando el ejemplo de KbFilter en el WDK, tratando de enviar un IOCTL en una función que es llamada por KbFilter_ServiceCallback y por lo tanto se ejecuta en DISPATCH_LEVEL. La función solo tiene que enviar un IOCTL y regresar, no estoy esperando que se llene un buffer de salida para que pueda ser asincrónico, disparar y olvidar.Enviando IOCTL de IRQL = DISPATCH_LEVEL (KbFilter/KMDF)

Actualmente estoy usando el WDF funciones 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 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 un hilo separado que funciona a PASSIVE_LEVEL y pasarlo instrucciones a través de un búfer o una cola, sincronizado con un spinlock y un semáforo.

¿Alguien me puede decir si hay una manera más fácil de pasar IOCTLs a los controladores debajo de mi filtro, o el hilo/cola se aproxima al patrón normal cuando necesitas hacer cosas con un IRQL más alto? ¿Bajo qué circunstancias puedo usar KeRaiseIrql y esto es lo que debo usar? Gracias.

Respuesta

5

Utilice IoAllocateIrp y IoCallDriver. Se pueden ejecutar en IRQL < = DISPATCH_LEVEL.

No puede reducir su IRQL (a menos que sea usted quien lo haya creado). KeRaiseIrql se usa solo para elevar IRQL. Una llamada a KeRaiseIrql es válida si el llamante especifica NewIrql> = CurrentIrql.

Cuidado: ¿Se espera su IOCTL en DISPATCH_LEVEL?

Aquí 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 = ... 
+0

No estoy familiarizado con WDF. –

+0

Gracias, ¿cómo creo la solicitud IOCTL en el nivel de envío? IoAllocateIrp e IoCallDriver están bien en el nivel de envío, pero IoBuildDeviceIoControlRequest requiere nivel pasivo. –

+0

realmente http://msdn.microsoft.com/en-us/library/ms801530.aspx dice que necesita al menos nivel APC, mientras que http://www.osronline.com/DDKx/kmarch/k104_8ble.htm dice que necesita estar en el nivel pasivo ... extraño –