IRP_MJ_CREATE(FS 및 FS 필터)

보낸 경우

I/O 관리자는 다음과 같은 경우 IRP_MJ_CREATE 요청을 보냅니다.

  • 새 파일 또는 디렉터리가 만들어지고 있습니다.
  • 기존 파일, 디바이스, 디렉터리 또는 볼륨이 열려 있습니다.

일반적으로 이 IRP는 CreateFile과 같은 Microsoft Win32 함수를 호출한 사용자 모드 애플리케이션을 대신하여 전송되거나 IoCreateFile, IoCreateFileSpecifyDeviceObjectHint, ZwCreateFile 또는 ZwOpenFile과 같은 함수를 호출한 커널 모드 구성 요소를 대신하여 전송됩니다.

만들기 요청이 성공적으로 완료되면 애플리케이션 또는 커널 모드 구성 요소가 파일 개체에 대한 핸들을 받습니다.

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

대상 디바이스 개체가 파일 시스템의 제어 디바이스 개체인 경우 Irp-IoStatus.Status 및 Irp-IoStatus.Information>를 적절한 값으로 설정한 후 파일 시스템 드라이버의 디스패치 루틴이 IRP를 완료하고 적절한 NTSTATUS 값을 반환해야 합니다.>

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

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

대상 디바이스 개체가 필터 드라이버의 제어 디바이스 개체인 경우 필터 드라이버의 디스패치 루틴은Irp-IoStatus.Status 및 Irp-IoStatus.Information>을 적절한 값으로 설정한 후 IRP를 완료하고 적절한 NTSTATUS 값을 반환해야 합니다.>

그렇지 않으면 필터 드라이버가 필요한 처리를 수행해야 합니다. 그런 다음 필터의 특성에 따라 IRP를 완료하거나 스택의 다음 하위 드라이버로 전달해야 합니다.

일반적으로 필터 드라이버는 IRP_MJ_CREATE 대한 응답으로 STATUS_PENDING 반환해서는 안 됩니다. 그러나 하위 수준 드라이버가 STATUS_PENDING 반환하는 경우 필터 드라이버는 이 상태 값을 드라이버 체인 위로 전달해야 합니다.

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

레거시 필터 드라이버가 생성 후 콜백에서 만들기 요청을 다시 실행하면 재분석 지점(보조 버퍼)과 연결된 버퍼를 해제하고 NULL로 설정해야 합니다. 레거시 필터 드라이버가 이 버퍼를 해제하지 않고 NULL로 설정하면 드라이버가 메모리를 누수합니다. 미니필터 드라이버는 필터 관리자가 이를 위해 수행하므로 이 작업을 수행할 필요가 없습니다.

매개 변수

파일 시스템 또는 레거시 필터 드라이버는 지정된 IRP를 사용하여 IoGetCurrentIrpStackLocation 을 호출하여 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. 다음 매개 변수에서 IrpIRP 를 가리키고 IrpSpIO_STACK_LOCATION 가리킵니다. 드라이버는 IRP 및 IRP 스택 위치의 다음 멤버에 설정된 정보를 사용하여 만들기 요청을 처리할 수 있습니다.

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

  • Irp->파일 개체가 확장 특성이 있는 파일을 나타내는 경우 AssociatedIrp.SystemBufferFILE_FULL_EA_INFORMATION 구조화된 버퍼를 가리킵니다. 그렇지 않으면 이 멤버가 NULL로 설정됩니다.

  • Irp->플래그 는 이 요청에 대해 다음 플래그로 설정됩니다.

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp->RequestorModeKernelMode 또는 UserMode 작업을 요청한 프로세스의 실행 모드를 나타냅니다. SL_FORCE_ACCESS_CHECK 플래그가 설정된 경우 Irp-RequestorMode>KernelMode인 경우에도 액세스 검사를 수행해야 합니다.

  • Irp->IoStatus는 최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조와 요청된 작업에 대한 정보를 가리킵니다. 파일 시스템은 이 구조체의 정보 멤버를 다음 값 중 하나로 설정합니다.

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp->Overlay.AllocationSize 는 파일에 대한 초기 할당 크기(바이트)입니다. 파일이 생성, 덮어쓰기 또는 대체되지 않는 한 0이 아닌 값은 적용되지 않습니다.

  • IrpSp->FileObject 는 I/O 관리자가 만들거나 열 파일을 나타내기 위해 만드는 파일 개체를 가리킵니다. 파일 시스템은 IRP_MJ_CREATE 요청을 처리할 때 이 파일 개체의 FsContextFsContext2 필드를 파일 시스템별 값으로 설정합니다. 따라서 파일 시스템에서 만들기 요청을 처리할 때까지 FsContextFsContext2 필드의 값은 유효한 것으로 간주할 수 없습니다. 자세한 내용은 파일 스트림, 스트림 컨텍스트 및 Per-Stream 컨텍스트를 참조하세요.

    FltCancelFileOpenIoCancelFileOpen은 파일 개체의 Flags 필드에서 FO_FILE_OPEN_CANCELLED 플래그 를 설정합니다. 이 플래그를 설정하면 IRP_MJ_CREATE 요청이 취소되었으며 이 파일 개체에 대해 IRP_MJ_CLOSE 요청이 실행됨을 나타냅니다. 만들기 요청이 취소되면 다시 실행할 수 없습니다.

    IrpSp-FileObject> 매개 변수에는 relatedFileObject 필드에 대한 포인터가 포함되어 있으며 이는 FILE_OBJECT 구조이기도 합니다. FILE_OBJECT 구조체의 RelatedFileObject 필드는 이미 열려 있는 파일 개체를 기준으로 지정된 파일이 열려 있음을 나타내는 데 사용됩니다. 일반적으로 상대 파일은 디렉터리이지만 스트림 기반 파일은 이미 기존 파일 스트림을 기준으로 열 수 있음을 나타냅니다. FILE_OBJECT 구조체의 RelatedFileObject 필드는 IRP_MJ_CREATE 처리하는 동안에만 유효합니다.

  • IrpSp->플래그 는 다음 값 중 하나 이상으로 설정할 수 있습니다.

    플래그 의미
    SL_FORCE_ACCESS_CHECK 0x01 이 플래그를 설정하면 IRP-RequestorMode> 값이 KernelMode인 경우에도 액세스 검사를 수행해야 합니다.
    SL_OPEN_PAGING_FILE 0x02 이 플래그가 설정되면 파일은 페이징 파일입니다.
    SL_OPEN_TARGET_DIRECTORY 0x04 이 플래그를 설정하면 파일의 부모 디렉터리를 열어야 합니다.
    SL_STOP_ON_SYMLINK 0x08 이 플래그를 설정하면 I/O 관리자의 교차점 및 기호 링크 자동 통과가 표시되지 않아 접합 및 기호 링크가 열리고 STATUS_REPARSE 반환됩니다.
    SL_IGNORE_READONLY_ATTRIBUTE 0x40 이 플래그를 설정하면 FILE_DELETE_ON_CLOSE 옵션을 사용하여 읽기 전용 파일을 만들 수 있습니다. 이 옵션을 사용하면 핸들이 닫혀 있을 때 파일이 삭제됩니다.
    SL_CASE_SENSITIVE 0x80 설정된 경우 파일 이름 비교는 대/소문자를 구분해야 합니다.
  • IrpSp->MajorFunction 은 IRP_MJ_CREATE 설정됩니다.

  • IrpSp->Parameters.Create.EaLengthIrp-AssociatedIrp.SystemBuffer>의 버퍼 크기(바이트)입니다. Irp*->AssociatedIrp.SystemBuffer 값이 NULL인 경우 이 멤버는 0이어야 합니다.

  • IrpSp->Parameters.Create.FileAttributes 는 파일을 만들거나 열 때 적용할 특성 플래그의 비트 마스크입니다. 명시적으로 지정된 특성은 파일을 만들거나, 대체하거나, 경우에 따라 덮어쓸 때만 적용됩니다. 기본적으로 이 값은 다른 플래그 또는 호환 플래그의 OR 조합이 재정의할 수 있는 FILE_ATTRIBUTE_NORMAL. 이 멤버는 IoCreateFileSpecifyDeviceObjectHint에 대한 FileAttributes 매개 변수에 해당합니다.

  • IrpSp->Parameters.Create.Options 는 파일을 만들거나 열 때 적용할 옵션과 파일이 이미 있는 경우 수행할 작업을 지정하는 플래그의 비트 마스크입니다.

    이 매개 변수의 상위 8비트는 IoCreateFileSpecifyDeviceObjectHint에 대한 Disposition 매개 변수에 해당합니다.

    이 멤버의 하위 24비트는 IoCreateFileSpecifyDeviceObjectHint에 대한 CreateOptions 매개 변수에 해당합니다. 파일 검사(예: 바이러스 백신 프로그램)를 수행하는 파일 시스템 필터 및 미니 필터 드라이버는 FILE_COMPLETE_IF_OPLOCKED 플래그에 특히 주의해야 합니다. 이 플래그를 설정하면 필터가 IRP_MJ_CREATE 작업을 차단하거나 지연하지 않아야 합니다.

    FILE_COMPLETE_IF_OPLOCKED 플래그가 사전 만들기(디스패치 만들기) 경로에 설정된 경우 필터는 oplock 중단을 일으킬 수 있으므로 다음 유형의 작업을 시작하지 않아야 합니다.

    • IRP_MJ_CLEANUP
    • IRP_MJ_CREATE
    • IRP_MJ_FILE_SYSTEM_CONTROL
    • IRP_MJ_FLUSH_BUFFERS
    • IRP_MJ_LOCK_CONTROL
    • IRP_MJ_READ
    • IRP_MJ_SET_INFORMATION
    • IRP_MJ_WRITE

    필터 또는 미니 필터가 FILE_COMPLETE_IF_OPLOCKED 플래그를 적용할 수 없는 경우 STATUS_SHARING_VIOLATION 사용하여 IRP_MJ_CREATE 요청을 완료해야 합니다.

    FILE_COMPLETE_IF_OPLOCKED 플래그가 완료(사후 생성) 경로에 설정된 경우 필터는 파일 시스템에서 Irp-IoStatus.Status>를 STATUS_OPLOCK_BREAK_IN_PROGRESS 상태 값으로 설정했는지 여부를 검사 합니다. 이 상태 값이 설정되지 않은 경우 필터가 파일에서 위의 작업 중 하나를 시작하는 것이 안전합니다. 이 상태 값이 설정되면 oplock이 아직 손상되지 않았으며 필터가 oplock 중단을 일으킬 수 있는 작업을 시작해서는 안됩니다. 따라서 필터는 다음 조건 중 하나가 충족될 때까지 파일에 대한 위의 모든 작업을 연기해야 합니다.

    • oplock의 소유자는 파일 시스템에 FSCTL_OPLOCK_BREAK_ACKNOWLEDGE 요청을 보냅니다.
    • 필터 또는 미니필터 이외의 시스템 구성 요소는 파일 시스템에 oplock 중단이 완료될 때까지 기다려야 하는 I/O 요청을 보냅니다(예: IRP_MJ_READ 또는 IRP_MJ_WRITE). 필터 또는 미니필터는 oplock 중단이 완료될 때까지 디스패치 또는 사전 운용 콜백 루틴이 대기 상태로 전환되므로 이 새 작업에 대한 디스패치(또는 사전 운용 콜백) 루틴에서 위의 작업 중 하나를 시작할 수 있습니다.
  • *IrpSp->Parameters.Create.SecurityContext-AccessState>는 개체의 주체 컨텍스트, 부여된 액세스 형식 및 원하는 나머지 액세스 형식을 포함하는 ACCESS_STATE 구조를 가리킵니다.

  • IrpSp->Parameters.Create.SecurityContext-DesiredAccess>는 파일에 대해 요청된 액세스 권한을 지정하는 ACCESS_MASK 구조체입니다. 자세한 내용은 DesiredAccess 매개 변수에서 IoCreateFileSpecifyDeviceObjectHint에 대한 설명을 참조하세요.

  • IrpSp->Parameters.Create.ShareAccess 는 파일에 대해 요청된 공유 액세스 권한의 비트 마스크입니다. 이 멤버가 0이면 단독 액세스가 요청됩니다. 자세한 내용은 IoCreateFileSpecifyDeviceObjectHint에 대한 ShareAccess 매개 변수에 대한 설명을 참조하세요.

추가 정보

ACCESS_MASK

ACCESS_STATE

FILE_FULL_EA_INFORMATION

FltCancelFileOpen

FltReissueSynchronousIo

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileOpen

IoCheckEaBufferValidity

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE(WDK 커널 참조)

ZwCreateFile

ZwOpenFile