2013-01-07 5 views
7

원래 요청을 발행 한 CPU에 CompleteRequest의 완료를 알리려고합니다. FdoDeviceControl 또는 다른 방법으로 요청을 발행 한 CPU를 검색하여 디스패치 큐에 들어가기 전에 요청이 어디서 왔는지 확인할 수 있습니까?WDFREQUEST를 생성 한 CPU를 검색 할 수 있습니까?

+0

그 디스패치가 발생한 후에 CPU를 검색하는 것은 물론 간단합니다. 그러나 콜백 함수가 이슈와 같은 핵심에서 실행된다는 것을 보장합니까? –

답변

6

일단 DPC 루틴에 들어갔을 때 요청이 시작된 곳을 알기에는 너무 늦었습니다. 요청을 DPC 대기열에 대기열로 보내기 전에 KeGetCurrentProcessorNumberEx()를 호출해야합니다. 요청이 IRP라고 가정합니다 ...?

+0

David, KMDF를 사용하여 요청을 처리하므로 IRP가 WDFREQUEST 구조체에 래핑됩니다. 내가 요청을 보았을 때 이미 I/O 큐를 통과했습니다. –

+0

KMDF를 사용하고 있다면 WdfDeviceInitSetIoInCallerContextCallback()을 호출해야합니다. 이렇게하면 kmdf I/O 큐에 배치되기 전에 I/O 요청을 들여다보고 I/O 개시 자의 프로세스 컨텍스트에서 실행하게되며 I/O 요청을 시작한 코어에있게됩니다. 영형. 거기에서 KeGetCurrentProcessorNumberEx()를 호출하고 결과를 저장할 수 있습니다. –

+0

답변으로 표시 David, 감사합니다. 관련 메모에서 EvtDeviceWdmIrpPreprocess가 클라이언트의 컨텍스트에서 호출된다는 사실을 확신합니다 (앞으로 전달 진행 보장 대기열을 사용하므로 항상 SetIoInCallerContextCallback처럼 보이지 않는 호출을해야합니다) –