다음을 통해 공유


DispatchCleanup 루틴

드라이버의 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 루틴의 실행을 DispatchReadDispatchWrite와 같은 다른 디스패치 루틴과 동기화해야 합니다.