6

WDKでKbFilterの例を使用しており、KbFilter_ServiceCallbackによって呼び出され、DISPATCH_LEVELで実行される関数でIOCTLを送信しようとしています。この関数は、IOCTLを送信して戻るだけでよく、出力バッファーがいっぱいになるのを待たずに、非同期で起動して忘れることができます。

現在、WDF関数WdfIoTargetFormatRequestForIoctlWdfRequestSendを使用して、DISPATCH_LEVELで送信を試みても、何も取得していません。WdfRequestSendの呼び出しは成功していますが、IOCTLが受信されていないようです。

WdfIoTargetSendIoctlSynchronouslyまたはWDMパターンIoBuildDeviceIoControlRequest()とIoCallDriver()のいずれかを使用するには、 PASSIVE_LEVELが必要です。これらをPASSIVE_LEVELで呼び出す唯一の方法は、PASSIVE_LEVELで実行される別のスレッドを作成し、バッファーまたはキューを介して同期された命令を渡すことです。スピンロックとセマフォ付き。

フィルタの下のドライバーにIOCTLを渡す簡単な方法があるかどうか、またはより高いIRQLで処理する必要がある場合に、スレッド/キューが通常のパターンに近づくかどうかを誰かに教えてもらえますか?どのような状況でKeRaiseIrqlを使用できますか?これは私が使用する必要があるものですか?ありがとう。

4

1 に答える 1

5

IoAllocateIrpとIoCallDriverを使用します。これらはIRQL<=DISPATCH_LEVELで実行できます。

IRQLを下げることはできません(それを上げたのがあなたでない限り)。KeRaiseIrqlは、IRQLを上げるためにのみ使用されます。KeRaiseIrqlの呼び出しは、呼び出し元がNewIrql>=CurrentIrqlを指定した場合に有効です。

注意:IOCTLはDISPATCH_LEVELで期待されていますか?

コードスニペットは次のとおりです。

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 = ...
于 2009-10-05T07:07:59.230 に答える