Frage

Ich bin mit dem kbfilter Beispiel in der WDK, versuche, eine IOCTL in einer Funktion zu senden, die von KbFilter_ServiceCallback genannt wird und daher bei DISPATCH_LEVEL ausgeführt wird. Die Funktion hat gerade einen IOCTL und Rückkehr zu senden, wartet ist nicht für eine Ausgabe gefüllt werden Puffer, so dass es asynchron sein kann, Feuer und vergessen.

Ich bin derzeit die WDF Funktionen WdfIoTargetFormatRequestForIoctl und WdfRequestSend , um zu versuchen und sendet an DISPATCH_LEVEL und nichts bekommen. Der Aufruf von WdfRequestSend gelingt aber die IOCTL erscheint nicht empfangen werden.

Unter Verwendung entweder von WdfIoTargetSendIoctlSynchronously oder das WDM-Muster IoBuildDeviceIoControlRequest () und IoCallDriver () erfordert PASSIVE_LEVEL und der einzige Weg, ich weiß, das sind bei PASSIVE_LEVEL zu nennen, ist eine separate zu erstellen Faden, der läuft bei PASSIVE_LEVEL und gibt sie Anweisungen über einen Puffer oder eine Warteschlange, synchronisiert mit einem spinlock und Semaphore.

Kann mir jemand sagen, ob es ein einfacher Weg ist IOCTLs an die Fahrer unter meinem Filter passieren, oder ist der rote Faden / queue das normale Muster nähern, wenn man die Dinge mit einer höheren IRQL tun müssen? Unter welchen Umständen kann ich KeRaiseIrql und das ist, was soll ich verwenden? Danke.

War es hilfreich?

Lösung

Mit IoAllocateIrp und IoCallDriver. Sie können bei IRQL ausgeführt werden <= DISPATCH_LEVEL.

Sie können Ihre IRQL nicht senken (es sei denn, es Ihnen ist, die sie erhoben). KeRaiseIrql wird nur verwendet, IRQL zu erhöhen. Ein Aufruf von KeRaiseIrql ist gültig, wenn der Anrufer gibt an NewIrql> = CurrentIrql.

Seien Sie vorsichtig: Ist Ihr IOCTL bei DISPATCH_LEVEL erwartet

Hier ist ein Code-Snippet:

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 = ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top