Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Il gestore PnP utilizza gli IRP per indirizzare i driver affinché avviino, arrestino e rimuovano i dispositivi e per interrogare i driver sui loro dispositivi. Tutti gli IRP PnP hanno il codice di funzione maggiore IRP_MJ_PNP, e tutti i driver PnP devono fornire una routine DispatchPnP per servire questo codice di funzione. Il manager PnP inizializza Irp-IoStatus.Status> per STATUS_NOT_SUPPORTED quando invia un IRP. Per altre informazioni, vedere Routine DispatchPnP.
Per un elenco di IRP secondari PnP, vedere Plug and Play Minor IRP.
Tutti i driver per un dispositivo devono avere la possibilità di rispondere a un IRP PnP, a meno che un driver nello stack fallisca l'IRP. Vedere la figura seguente.
Nessun driver singolo 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. Nessuna delle funzionalità supportate dai driver inferiori, come un ID univoco di istanza o le funzionalità di gestione energetica, supportate dal driver del bus padre, vengono segnalate.
Un IRP PnP esegue il backup dello stack di dispositivi quando il driver del bus padre chiama IoCompleteRequest e il gestore di I/O chiama tutte 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:
- Eseguire le azioni appropriate.
- Impostare Irp-IoStatus.Status> su uno stato appropriato, ad esempio STATUS_SUCCESS. Impostare Irp-IoStatus.Information>, se appropriato per l'IRP.
- Configurare la posizione successiva dello stack con IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext. Chiamare questa routine se si imposta una routine IoCompletion.
- Impostare una routine IoCompletion , se necessario.
- Non completare l'IRP. Non chiamare IoCompleteRequest. Il conducente dell'autobus padre completerà l'IRP.
- Se il driver non esegue azioni per questo IRP, si prepara semplicemente a passare l'IRP al driver successivo:
- Chiamare IoSkipCurrentIrpStackLocation per rimuovere la posizione dello stack dall'IRP.
- Non impostare campi in Irp-IoStatus>.
- Non impostare una routine IoCompletion .
- Non completare l'IRP. Non chiamare IoCompleteRequest. Il conducente dell'autobus padre completerà l'IRP.
Se un driver di funzione o filtro non ha fallito l'IRP, lo passa al driver successivo di livello inferiore utilizzando IoCallDriver. Un driver ha un puntatore al driver immediatamente inferiore; tale puntatore è stato restituito dalla chiamata IoAttachDeviceToDeviceStack nella routine AddDevice del driver superiore.
Il conducente 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 di I/O chiama le routine di IoCompletion registrate dai driver funzione o filtro per il dispositivo.