Condividi tramite


Routine DispatchCreate e DispatchClose separate

Le routine Dispatch di un driver per IRP_MJ_CREATE e le richieste di IRP_MJ_CLOSE potrebbero non eseguire altro che completare l'IRP di input con STATUS_SUCCESS. Per altre informazioni, vedere Completamento dei runtime di integrazione.

Le routine Dispatch di un altro driver per IRP_MJ_CREATE e IRP_MJ_CLOSE richieste potrebbero eseguire più operazioni, a seconda del driver di dispositivo sottostante o del dispositivo sottostante. Esaminare gli scenari seguenti:

  • Alla ricezione di una richiesta di creazione, un driver di classe potrebbe inizializzare una coda interna e inviare una richiesta di IRP_MJ_INTERNAL_DEVICE_CONTROL al driver di porta corrispondente che richiede informazioni di configurazione del dispositivo o l'accesso esclusivo a una porta controller.

  • La ricezione di IRP_MJ_CLOSE indica che l'ultimo riferimento all'oggetto file associato all'oggetto dispositivo di destinazione è stato rimosso. Ciò implica che tutti gli handle per l'oggetto file sono stati chiusi e tutte le richieste di I/O in sospeso sono state completate o annullate.

  • Alla ricezione di una richiesta di creazione, un driver di un dispositivo usato raramente potrebbe chiamare MmLockPagableCodeSection per far risiedere alcune routine driver che elaborano altre richieste IRP_MJ_XXX . Alla ricezione di una richiesta di chiusura reciproca, il driver potrebbe chiamare MmUnlockPagableImageSection per conservare la memoria di sistema facendo in modo che la sezione immagine impaginabile venga visualizzata quando tutti gli handle di oggetti file per tali oggetti dispositivo del driver vengono chiusi.

Alcuni driver gestiscono IRP_MJ_CLOSE richieste solo per la simmetria perché, dopo l'apertura degli oggetti dispositivo da parte di un sottosistema protetto o di un driver di livello superiore, gli oggetti dispositivo dei driver di livello inferiore non vengono chiusi finché il sistema stesso non viene arrestato. Ad esempio, i driver della tastiera e del mouse configurano oggetti dispositivo che rappresentano dispositivi fisici che devono essere funzionali durante l'esecuzione del sistema, pertanto questi driver potrebbero avere routine DispatchClose minime per simmetria oppure potrebbero avere routine DispatchCreateClose combinate .

Se il dispositivo controllato da un driver di livello inferiore deve essere disponibile per continuare l'esecuzione del sistema, la routine DispatchClose del driver in genere non verrà chiamata. Ad esempio, alcuni dei driver del disco di sistema non hanno routine DispatchClose , ma questi driver in genere hanno routine DispatchFlushBuffers e DispatchShutdown per completare le operazioni di I/O dei file in sospeso prima dell'arresto del sistema.

Sebbene sia possibile implementare routine separate DRIVER_DISPATCH e DispatchClose , i driver a volte hanno una singola routine DispatchCreateClose per gestire le richieste di creazione e chiusura.