2009-10-03 8 views
6

Sto utilizzando l'esempio KbFilter nel WDK, provando a inviare un IOCTL in una funzione chiamata da KbFilter_ServiceCallback e pertanto viene eseguito su DISPATCH_LEVEL. La funzione deve solo inviare un IOCTL e restituire, non sto aspettando che un buffer di output venga riempito in modo che possa essere asincrono, accendere e dimenticare.Invio di IOCTL da IRQL = DISPATCH_LEVEL (KbFilter/KMDF)

Attualmente sto usando il WDF Funzioni di WdfIoTargetFormatRequestForIoctl e WdfRequestSend per cercare di trasmettere a DISPATCH_LEVEL e ottenere nulla. La chiamata a WdfRequestSend è riuscita ma il IOCTL non sembra essere ricevuto.

Utilizzando uno dei WdfIoTargetSendIoctlSynchronously o il modello WDM IoBuildDeviceIoControlRequest() e IoCallDriver() richiede PASSIVE_LEVEL e l'unico modo che conosco per chiamare questi a PASSIVE_LEVEL è quello di creare un thread separato che funziona a PASSIVE_LEVEL e passarlo istruzioni tramite un buffer o una coda, sincronizzati con uno spinlock e un semaforo.

Qualcuno può dirmi se esiste un modo più semplice per passare gli IOCTL ai driver sotto il mio filtro, oppure la filettatura/coda si avvicina al modello normale quando è necessario eseguire operazioni su un IRQL superiore? In quali circostanze posso usare KeRaiseIrql ed è questo che dovrei usare? Grazie.

risposta

5

Utilizzare IoAllocateIrp e IoCallDriver. Possono essere eseguiti su IRQL < = DISPATCH_LEVEL.

Non è possibile abbassare l'IRQL (a meno che non siate voi a sollevarlo). KeRaiseIrql è usato solo per aumentare IRQL. Una chiamata a KeRaiseIrql è valida se il chiamante specifica NewIrql> = CurrentIrql.

Attenzione: il tuo IOCTL è previsto a DISPATCH_LEVEL?

Ecco un frammento di codice:

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

non ho familiarità con WDF. –

+0

Grazie, come posso creare la richiesta IOCTL a livello di spedizione? IoAllocateIrp e IoCallDriver sono entrambi ok a livello di invio, ma IoBuildDeviceIoControlRequest richiede un livello passivo. –

+0

in realtà http://msdn.microsoft.com/en-us/library/ms801530.aspx dice che ha bisogno almeno del livello APC, mentre http://www.osronline.com/DDKx/kmarch/k104_8ble.htm dice che ha bisogno essere al livello passivo .. strano –