2013-01-07 20 views
7

Sto provando ad affinizzare il completamento di CompleteRequest con la CPU che ha originariamente emesso la richiesta. C'è un modo per recuperare la CPU che ha emesso la richiesta durante FdoDeviceControl o un altro modo per vedere da dove proviene la richiesta prima che entrasse nella coda di invio?È possibile recuperare la CPU che ha creato un WDFREQUEST?

+0

Recupero della CPU dopo che è avvenuta la spedizione è ovviamente abbastanza semplice. Ma sono sicuro che la funzione di callback gira sullo stesso nucleo dei problemi? –

risposta

6

Una volta che si è in una routine DPC, è troppo tardi per sapere da dove proviene la richiesta. È necessario chiamare KeGetCurrentProcessorNumberEx() prima di accodare la richiesta a una coda DPC. Presumo che la richiesta sia un IRP ...?

+0

David, sto utilizzando KMDF per gestire la richiesta in modo che l'IRP sia racchiuso in una struttura WDFREQUEST. Nel momento in cui vedo la richiesta, è già passata attraverso una coda I/O –

+0

Se si sta utilizzando KMDF, è necessario chiamare WdfDeviceInitSetIoInCallerContextCallback(). Ciò ti consentirà di dare una sbirciata alla richiesta I/O prima che venga inserita nella coda I/O di kmdf, verrai eseguito nel contesto del processo dell'iniziatore I/O e sarai sul core che ha avviato l'I/O O. Da lì puoi chiamare KeGetCurrentProcessorNumberEx() e salvare il risultato. –

+0

Iscritto come risposta David, grazie. In una nota correlata, sono sicuro che EvtDeviceWdmIrpPreprocess viene anche chiamato nel contesto del client (sto usando le code di avanzamento in avanti garantite, quindi devo assicurarmi di ricevere SEMPRE la chiamata, che sembra che SetIoInCallerContextCallback non faccia) –