Rutinas dispatchCleanup
La rutina DispatchCleanup de un controlador controla irP para el código de función de E/S de IRP_MJ_CLEANUP .
Los controladores pueden usar una rutina DispatchCleanup para realizar las operaciones de limpieza necesarias después de que se hayan cerrado todos los identificadores de un objeto de archivo. Tenga en cuenta que se llama a DispatchCleanup en el contexto de proceso del proceso que cerró el identificador final; este proceso puede ser diferente del proceso que inicialmente abrió el identificador. (Normalmente, esta diferencia se produce porque otro proceso usa la rutina de modo usuario DuplicateHandle para duplicar los identificadores de procesos). Los controladores que deben realizar la limpieza en el contexto de proceso original pueden usar la rutina PsSetCreateProcessNotifyRoutine para registrar una rutina de devolución de llamada para ese propósito, pero tenga en cuenta que estas devoluciones de llamada son un recurso del sistema limitado.
En general, una rutina DispatchCleanup debe procesar una solicitud de IRP_MJ_CLEANUP haciendo lo siguiente para cada IRP que se encuentra actualmente en la cola del dispositivo (o en la cola interna del controlador de IRP), para el objeto de dispositivo de destino y está asociado al objeto de archivo:
Llame a IoSetCancelRoutine para establecer el puntero de rutina Cancelar en NULL.
Cancele cada IRP que esté actualmente en la cola del objeto de dispositivo de destino, si el objeto de archivo especificado en la ubicación de la pila de E/S del controlador del IRP en cola coincide con el objeto de archivo que se recibió en la ubicación de la pila de E/S de la solicitud de IRP_MJ_CLEANUP .
Llame a IoCompleteRequest para completar el IRP y devuelva STATUS_SUCCESS.
Al procesar una solicitud de IRP_MJ_CLEANUP , un controlador puede recibir solicitudes adicionales, como IRP_MJ_READ o IRP_MJ_WRITE. Por lo tanto, un controlador que debe desasignar recursos también debe sincronizar la ejecución de su rutina DispatchCleanup con otras rutinas de envío, como DispatchRead y DispatchWrite.