Routine DispatchCleanup
La routine DispatchCleanup di un driver gestisce i provider di accesso per il codice di funzione I/O di IRP_MJ_CLEANUP .
I driver possono usare una routine DispatchCleanup per eseguire operazioni di pulizia necessarie dopo la chiusura di tutti gli handle a un oggetto file. Si noti che DispatchCleanup viene chiamato nel contesto del processo che ha chiuso l'handle finale; questo processo potrebbe essere diverso dal processo che inizialmente ha aperto l'handle. In genere questa differenza si verifica perché un altro processo usa la routine in modalità utente DuplicateHandle per duplicare gli handle dei processi. I driver che devono eseguire la pulizia nel contesto del processo originale possono usare la routine PsSetCreateProcessNotifyRoutine per registrare una routine di callback per tale scopo, ma tenere presente che tali callback sono una risorsa di sistema limitata.
In generale, una routine DispatchCleanup deve elaborare una richiesta di IRP_MJ_CLEANUP eseguendo le operazioni seguenti per ogni IRP attualmente presente nella coda del dispositivo (o nella coda interna del driver di IRP), per l'oggetto dispositivo di destinazione ed è associato all'oggetto file:
Chiamare IoSetCancelRoutine per impostare il puntatore di routine Annulla su NULL.
Annullare ogni IRP attualmente presente nella coda per l'oggetto dispositivo di destinazione, se l'oggetto file specificato nel percorso dello stack I/O del driver dell'IRP in coda corrisponde all'oggetto file ricevuto nel percorso dello stack I/O della richiesta di IRP_MJ_CLEANUP .
Chiamare IoCompleteRequest per completare l'IRP e restituire STATUS_SUCCESS.
Durante l'elaborazione di una richiesta di IRP_MJ_CLEANUP , un driver può ricevere richieste aggiuntive, ad esempio IRP_MJ_READ o IRP_MJ_WRITE. Pertanto, un driver che deve deallocare le risorse deve anche sincronizzare l'esecuzione della routine DispatchCleanup con altre routine di invio, ad esempio DispatchRead e DispatchWrite.