드라이버의 DispatchCleanup 루틴은 IRP_MJ_CLEANUP I/O 함수 코드에 대한 IRP를 처리합니다.
드라이버는 DispatchCleanup 루틴을 사용하여 파일 개체에 대한 모든 핸들을 닫은 후에 필요한 정리 작업을 수행할 수 있습니다. DispatchCleanup은 최종 핸들을 닫은 프로세스의 프로세스 컨텍스트에서 호출됩니다. 이 프로세스는 처음에 핸들을 연 프로세스와 다를 수 있습니다. (일반적으로 이러한 차이는 다른 프로세스가 DuplicateHandle 사용자 모드 루틴을 사용하여 프로세스 핸들을 복제하기 때문에 발생합니다.) 원래 프로세스 컨텍스트에서 정리를 수행해야 하는 드라이버는 PsSetCreateProcessNotifyRoutine 루틴을 사용하여 해당 용도로 콜백 루틴을 등록할 수 있지만, 이러한 콜백은 제한된 시스템 리소스라는 점을 명심하세요.
일반적으로 DispatchCleanup 루틴은 대상 디바이스 개체에 대해 디바이스 큐(또는 드라이버의 내부 IRP 큐)에 있고 파일 개체와 연결된 모든 IRP에 대해 다음을 수행하여 IRP_MJ_CLEANUP 요청을 처리 해야 합니다.
IoSetCancelRoutine을 호출하여 취소 루틴 포인터를 NULL로 설정합니다.
대기 중인 IRP의 드라이버 I/O 스택 위치에 지정된 파일 개체가 IRP_MJ_CLEANUP 요청의 I/O 스택 위치에서 받은 파일 개체와 일치하는 경우 대상 디바이스 개체의 큐에 있는 모든 IRP를 취소합니다.
IoCompleteRequest를 호출하여 IRP를 완료하고 STATUS_SUCCESS 반환합니다.
IRP_MJ_CLEANUP 요청을 처리하는 동안 드라이버는 IRP_MJ_READ 또는IRP_MJ_WRITE 같은 추가 요청을 받을 수 있습니다. 따라서 리소스 할당을 취소해야 하는 드라이버는 DispatchCleanup 루틴의 실행을 DispatchRead 및 DispatchWrite와 같은 다른 디스패치 루틴과 동기화해야 합니다.