Domanda

sto usando l'esempio KbFilter nel WDK, tenta di inviare un IOCTL in una funzione che è chiamato da KbFilter_ServiceCallback e quindi viene eseguita a DISPATCH_LEVEL. La funzione deve solo inviare un'IOCTL e ritorno, non sono in attesa di un buffer di uscita da riempire in modo che possa essere asincrono, il fuoco e dimenticare.

Attualmente sto usando le funzioni di CDR WdfIoTargetFormatRequestForIoctl e WdfRequestSend per cercare di trasmettere a DISPATCH_LEVEL e ottenere nulla. La chiamata a WdfRequestSend sta riuscendo, ma l'IOCTL non sembra essere ricevuti.

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 separato filo che funziona a PASSIVE_LEVEL e passarlo istruzioni tramite un buffer o una coda, sincronizzato con uno spinlock e semaforo.

Qualcuno può dirmi se c'è un modo più semplice per passare IOCTL ai piloti sotto il mio filtro, o è il filo / coda di avvicinarsi al modello normale quando hai bisogno di fare le cose in un IRQL superiore? In quali circostanze posso utilizzare KeRaiseIrql ed è questo che dovrei usare? Grazie.

È stato utile?

Soluzione

Usa IoAllocateIrp e IoCallDriver. Essi possono essere eseguiti a IRQL <= DISPATCH_LEVEL.

Non si può ridurre l'IRQL (a meno che non v'è chi sollevò). KeRaiseIrql viene utilizzato solo per alzare IRQL. Una chiamata al KeRaiseIrql è valida se il chiamante specifica NewIrql> = CurrentIrql.

Fare attenzione:? Il vostro 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 = ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top