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.

¿Fue útil?

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 = ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top