Condividi tramite


Separare le routine DispatchCreate e DispatchClose

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 ulteriori informazioni, vedere Completamento degli IRP.

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. Considerare gli scenari seguenti:

  • Al ricevimento 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 sulla 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 rendere residente alcune delle routine del driver che elaborano altre richieste IRP_MJ_XXX. Al momento della ricezione di una richiesta di chiusura reciproca, il driver potrebbe chiamare MmUnlockPagableImageSection per risparmiare memoria di sistema, spostando la relativa sezione di immagine paginabile su disco anziché mantenerla caricata in memoria, quando tutti gli handle degli oggetti file relativi agli oggetti dispositivo di tale driver vengono chiusi.

Alcuni driver gestiscono IRP_MJ_CLOSE richieste solo per la simmetria perché, dopo che gli oggetti dispositivo sono stati aperti da un sottosistema protetto o da un driver di livello superiore, gli oggetti dispositivo dei driver di livello inferiore non vengono chiusi fino all'arresto del sistema stesso. 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, quindi questi driver potrebbero avere routine DispatchClose minime per la 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 driver del disco di sistema non hanno routine DispatchClose , ma questi driver in genere hanno routine DispatchFlushBuffers e DispatchShutdown per completare eventuali operazioni di I/O di 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.