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?
Odpowiedz
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 ...?
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 –
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. –
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) –
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? –