2009-10-03 4 views
6

WDK에서 KbFilter 예제를 사용 중입니다. KbFilter_ServiceCallback에서 호출되는 함수에서 IOCTL을 보내려고하므로 DISPATCH_LEVEL에서 실행됩니다. 이 함수는 단지 IOCTL을 보내고 반환해야합니다. 출력 버퍼가 채워지는 것을 기다리지 않아서 비동기, 화재 및 잊어 버릴 수 있습니다. 나는 현재 WDF를 사용하고IRQL = DISPATCH_LEVEL (KbFilter/KMDF)에서 IOCTL 보내기

시도하고 DISPATCH_LEVEL에서 아무것도 점점하지 보낼 WdfIoTargetFormatRequestForIoctlWdfRequestSend을 작동합니다. WdfRequestSend에 대한 호출이 성공하지만 IOCTL이 수신 된 것으로 나타나지 않습니다. WdfIoTargetSendIoctlSynchronously 또는 WDM 패턴 IoBuildDeviceIoControlRequest() 및 위해 IoCallDriver()는 PASSIVE_LEVEL하고있는 유일한 방법이 필요 내가 PASSIVE_LEVEL에서 실행되는 별도의 스레드를 생성하고 그것을 지시 사항을 전달하는 PASSIVE_LEVEL에서이입니다 전화를 알고 중 하나를 사용

버퍼 또는 대기열을 통해 스핀 록 및 세마포어와 동기화됩니다.

더 높은 IRQL에서 일을해야 할 때 내 필터 아래 드라이버에 IOCTL을 전달하는 더 쉬운 방법이 있는지 또는 스레드/대기열 접근 방식이 정상적인 패턴인지 사용자가 알 수 있습니까? 어떤 상황에서 사용할 수 있습니까 KeRaiseIrql 그리고 내가 뭘 사용해야합니까? 감사.

답변

5

IoAllocateIrp 및 IoCallDriver를 사용하십시오. IRQL < = DISPATCH_LEVEL에서 실행할 수 있습니다.

당신이 IRQL을 올릴 수 없습니다. KeRaiseIrql은 IRQL을 높이기 위해서만 사용됩니다. 호출자가 NewIrql> = CurrentIrql을 지정하면 KeRaiseIrql에 대한 호출이 유효합니다.

주의 : 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 = ... 
+0

내가 WDF에 익숙하지 않다 : 여기

는 코드입니다. –

+0

감사합니다. 디스패치 수준에서 IOCTL 요청을 어떻게 만듭니 까? IoAllocateIrp와 IoCallDriver는 모두 디스패치 수준에서는 정상이지만 IoBuildDeviceIoControlRequest는 수동 수준이 필요합니다. –

+0

실제로는 http://msdn.microsoft.com/en-us/library/ms801530.aspx에 의하면 적어도 APC 레벨이 필요하지만 http://www.osronline.com/DDKx/kmarch/k104_8ble.htm은 필요하다고 말하고 있습니다. 이상한 –