Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La rutina DispatchCleanup de un controlador gestiona los IRP para el código de función de E/S 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 del proceso que cerró el identificador final; este proceso puede ser diferente al que abrió inicialmente el identificador. (Normalmente, esta diferencia se produce porque otro proceso usa la rutina de modo de usuario DuplicateHandle para duplicar los identificadores de los 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 de dispositivos (o en la cola interna del controlador de IRP), para el objeto de dispositivo de destino y está asociado con el objeto de archivo:
Llame a IoSetCancelRoutine para establecer el puntero de rutina Cancelar en NULL.
Cancele cada IRP que se encuentre actualmente en la cola para el objeto de dispositivo de destino, si el objeto de archivo especificado en la ubicación de la pila de E/S 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 IRP_MJ_CLEANUP.
Llame a IoCompleteRequest para completar el IRP y devolver 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 distribución, como DispatchRead y DispatchWrite.