2013-01-07 18 views
7

Próbuję powiązać zakończenie polecenia CompleteRequest z procesorem, który pierwotnie wysłał żądanie. Czy istnieje sposób na odzyskanie procesora, który wysłał żądanie podczas FdoDeviceControl lub w inny sposób, aby zobaczyć, skąd pochodzi żądanie, zanim wszedł do kolejki wysyłkowej?Czy można odzyskać procesor, który utworzył WDFREQUEST?

+0

Pobieranie procesora po tej wysyłce jest oczywiście dość proste. Ale czy mam gwarancję, że funkcja wywołania zwrotnego działa na tym samym rdzeniu co problemy? –

Odpowiedz

6

Gdy jesteś w procedurze DPC, jest już za późno na określenie, skąd pochodzi żądanie. Przed kolejkowaniem żądania do kolejki DPC należy wywołać funkcję KeGetCurrentProcessorNumberEx(). Zakładam, że wniosek jest IRP ...?

+0

David, używam KMDF do obsługi żądania, więc IRP jest zawijany w strukturze WDFREQUEST. W momencie, gdy widzę żądanie, to już przeszło przez kolejkę I/O –

+0

Jeśli używasz KMDF, musisz wywołać WdfDeviceInitSetIoInCallerContextCallback(). To pozwoli ci zajrzeć do żądania I/O zanim zostanie umieszczone w kolejce I/O kmdf, będziesz pracował w kontekście procesu inicjatora I/O i będziesz na rdzeniu, który zainicjował I/O O. Stamtąd możesz zadzwonić do KeGetCurrentProcessorNumberEx() i zapisać wynik. –

+0

Wymienione jako odpowiedź David, dzięki. W powiązanej notatce, mam pewność, że EvtDeviceWdmIrpPreprocess jest również wywoływana w kontekście klienta (używam gwarantowanych kolejek postępu do przodu, więc muszę się upewnić, że ZAWSZE otrzymam wywołanie, które wygląda tak, jak robi to SetIoInCallerContextCallback) –

Powiązane problemy