IRP_MJ_CLEANUP(FS 및 FS 필터)

보낸 경우

IRP_MJ_CLEANUP 요청을 수신하면 파일 개체의 핸들 참조 수가 0에 도달했음을 나타냅니다. 즉, 파일 개체에 대한 모든 핸들이 닫혔습니다. 사용자 모드 애플리케이션이 파일 개체에 대한 마지막 미해결 핸들에서 Win32 CloseHandle 함수를 호출하거나 커널 모드 드라이버가 ZwClose를 호출한 경우 전송되는 경우가 많습니다.

파일 개체에 대한 모든 핸들이 닫혔을 때 파일 개체가 계속 사용될 수 있다는 점에 유의해야 합니다. 캐시 관리자 및 메모리 관리자와 같은 시스템 구성 요소에는 파일 개체에 대한 미해결 참조가 있을 수 있습니다. 이러한 구성 요소는 IRP_MJ_CLEANUP 요청을 받은 후에도 파일에서 읽거나 쓸 수 있습니다.

작업: 파일 시스템 드라이버

대상 디바이스 개체가 파일 시스템의 제어 디바이스 개체인 경우 파일 시스템 드라이버는 IRP를 완료해야 합니다.

그렇지 않으면 파일 시스템 드라이버가 정리 요청을 처리해야 합니다.

작업: 레거시 파일 시스템 필터 드라이버

대상 디바이스 개체가 필터 드라이버의 제어 디바이스 개체인 경우 필터 드라이버는 IRP를 완료해야 합니다.

그렇지 않으면 필터 드라이버는 필요한 처리를 수행한 후 스택의 다음 하위 드라이버로 IRP를 전달해야 합니다.

파일 시스템 필터 드라이버 작성기는 IoCreateStreamFileObject 로 인해 IRP_MJ_CLEANUP 요청이 볼륨의 파일 시스템 드라이버 스택으로 전송된다는 점에 유의해야 합니다. 파일 시스템은 종종 스트림 파일 개체를 IRP_MJ_CREATE 이외의 작업의 부작용으로 만들기 때문에 필터 드라이버가 스트림 파일 개체 생성을 안정적으로 검색하기가 어렵습니다. 따라서 필터 드라이버는 이전에 보이지 않는 파일 개체에 대한 IRP_MJ_CLEANUP 및 IRP_MJ_CLOSE 요청을 수신해야 합니다.

또한 필터 드라이버 작성기는 IoCreateStreamFileObject와 달리 IoCreateStreamFileObjectLite 는 파일 시스템 드라이버 스택에 IRP_MJ_CLEANUP 요청을 보내지 않습니다. 이러한 이유로 파일 시스템은 종종 스트림 파일 개체를 IRP_MJ_CREATE 이외의 작업의 부작용으로 만들기 때문에 필터 드라이버가 스트림 파일 개체 생성을 안정적으로 검색하기가 어렵습니다. 따라서 필터 드라이버는 이전에 보이지 않는 파일 개체에 대한 IRP_MJ_CLOSE 요청을 수신해야 합니다.

매개 변수

파일 시스템 또는 레거시 필터 드라이버는 지정된 IRP를 사용하여 IoGetCurrentIrpStackLocation을 호출하여 다음 목록에 IrpSp로 표시된 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. (IRP는 Irp로 표시됩니다.) 드라이버는 정리 요청을 처리하는 데 IRP 및 IRP 스택 위치의 다음 멤버에 설정된 정보를 사용할 수 있습니다.

  • DeviceObject

    대상 디바이스 개체에 대한 포인터입니다.

  • Irp 플래그>

    이 요청에 대해 다음 플래그가 설정됩니다.

    • IRP_CLOSE_OPERATION
    • IRP_SYNCHRONOUS_API
  • Irp-IoStatus>

    최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조체 및 요청된 작업에 대한 정보를 가리키는 포인터입니다.

  • Irp-FileObject>

    DeviceObject와 연결된 파일 개체에 대한 포인터입니다.

    Irp-FileObject> 매개 변수에는 relatedFileObject 필드에 대한 포인터가 포함되어 있으며 이는 FILE_OBJECT 구조체이기도 합니다. FILE_OBJECT 구조체의 RelatedFileObject 필드는 IRP_MJ_CLEANUP 처리하는 동안 유효하지 않으므로 사용하면 안 됩니다.

  • Irp-MajorFunction>

    IRP_MJ_CLEANUP 지정합니다.

추가 정보

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP(WDK 커널 참조)

IRP_MJ_CLOSE

IRP_MJ_CREATE

ZwClose