Condividi tramite


Passaggio di PnP IRP verso il basso dello stack di dispositivi

Il gestore PnP usa i provider di integrazione per indirizzare i driver per avviare, arrestare e rimuovere i dispositivi e per eseguire query sui driver relativi ai dispositivi. Tutti i PnP IRP hanno il codice di funzione principale IRP_MJ_PNP e tutti i driver PnP devono fornire una routine DispatchPnP per il servizio di questo codice di funzione. Il gestore PnP inizializza Irp-IoStatus.Status> per STATUS_NOT_SUPPORTED quando invia un'istanza di IRP . Per altre informazioni, vedere Routine DispatchPnP.

Per un elenco di IRP secondari PnP, vedere Plug and Play Minor IRPs.

Tutti i driver per un dispositivo devono avere la possibilità di rispondere a un'IRP PnP a meno che un driver nello stack non abbia esito negativo sull'IRP. Vedere la figura seguente.

diagramma che illustra il passaggio di un plug and play irp verso il basso dello stack di dispositivi.

Nessun singolo driver per un dispositivo può presupporre che sia l'unico driver che risponderà a un'IRP PnP. Si consideri, ad esempio, un driver di funzione che risponde a una richiesta di IRP_MN_QUERY_CAPABILITIES e completa l'IRP senza passarlo al driver inferiore successivo. None delle funzionalità supportate dai driver inferiori, ad esempio un ID istanza univoco o funzionalità di risparmio energia supportate dal driver del bus padre, viene segnalato.

Un'IRP PnP esegue il backup dello stack di dispositivi quando il driver del bus padre chiama IoCompleteRequest e il gestore I/O chiama le routine IoCompletion registrate dal driver di funzione o dai driver di filtro.

Quando riceve un'IRP PnP, un driver di funzione o filtro deve eseguire le operazioni seguenti:

  • Se il driver esegue azioni in risposta all'IRP:
    1. Eseguire le azioni appropriate.
    2. Impostare Irp-IoStatus.Status> su uno stato appropriato, ad esempio STATUS_SUCCESS. Impostare Irp-IoStatus.Information>, se appropriato per l'IRP.
    3. Configurare la posizione successiva dello stack con IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext. Chiamare la seconda routine se si imposta una routine IoCompletion .
    4. Impostare una routine IoCompletion , se necessario.
    5. Non completare l'IRP. Non chiamare IoCompleteRequest. Il driver del bus padre completerà l'IRP.
  • Se il driver non esegue azioni per questo IRP, si prepara semplicemente a passare l'IRP al driver successivo:
    1. Chiamare IoSkipCurrentIrpStackLocation per rimuovere la posizione dello stack dall'IRP.
    2. Non impostare campi in Irp-IoStatus>.
    3. Non impostare una routine IoCompletion .
    4. Non completare l'IRP. Non chiamare IoCompleteRequest. Il driver del bus padre completerà l'IRP.

Se un driver di funzione o filtro non ha avuto esito negativo, passa l'IRP al driver inferiore successivo con IoCallDriver. Un driver ha un puntatore al driver inferiore successivo; tale puntatore è stato restituito dalla chiamata IoAttachDeviceToDeviceToDeviceStack nella routine AddDevice del driver superiore.

Il driver del bus padre completa l'IRP dopo aver eseguito qualsiasi attività per rispondere all'IRP. Dopo che il driver del bus chiama IoCompleteRequest, il gestore I/O chiama le routine IoCompletion registrate dalla funzione o dai driver di filtro per il dispositivo.