IRP_MJ_CREATE_NAMED_PIPE

보낸 경우

I/O 관리자는 명명된 새 파이프를 만들거나 열 때 IRP_MJ_CREATE_NAMED_PIPE 요청을 보냅니다. 일반적으로 이 IRP는 다음과 같이 전송됩니다.

명명된 파이프 만들기 요청이 성공적으로 완료되면 애플리케이션 또는 커널 모드 구성 요소는 명명된 파이프 파일 인스턴스의 서버 끝에 대한 핸들을 받습니다.

IRP_MJ_CREATE_NAMED_PIPE 처리는 IRP_MJ_CREATE 거의 동일합니다.

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

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

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

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

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

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

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

매개 변수

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

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

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

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

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

  • IrpSp-> MajorFunction 은 IRP_MJ_CREATE_NAMED_PIPE 설정됩니다.

    • IrpSp-> 플래그 는 SL_FORCE_ACCESS_CHECK 설정할 수 있습니다. 이 플래그가 설정되면 Irp-RequestorMode> 값이 KernelMode인 경우에도 액세스 검사를 수행해야 합니다.
  • IrpSp-> Parameters.CreatePipe.SecurityContext-AccessState>는 개체의 주체 컨텍스트, 부여된 액세스 형식 및 원하는 나머지 액세스 형식을 포함하는 ACCESS_STATE 구조체에 대한 포인터입니다.

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

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

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

    이 멤버의 하위 24비트는 IoCreateFileSpecifyDeviceObjectHint에 대한 CreateOptions 매개 변수에 해당합니다.

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

  • IrpSp-> Parameters.CreatePipe.Parameters 는 명명된 파이프를 만들 때의 만들기 매개 변수를 포함하는 NAMED_PIPE_CREATE_PARAMETERS 구조체에 대한 포인터입니다.

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

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

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

참고 항목

ACCESS_MASK

ACCESS_STATE

FLT_PARAMETERS

IRP_MJ_CREATE_NAMED_PIPE 대한 FLT_PARAMETERS

FltCancelFileOpen

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileOpen

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE(WDK 커널 참조)

NAMED_PIPE_CREATE_PARAMETERS