다음을 통해 공유


IRP_MJ_CREATE_NAMED_PIPE(FS 및 필터 드라이버)

보낸 경우

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

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

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의 자체 스택 위치에 대한 포인터를 가져옵니다. 다음 매개 변수에서 IrpIRP 를 가리키고 IrpSpIO_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->RequestorMode커널Mode 또는 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 구조체입니다. 자세한 내용은 DesiredAccess 매개 변수에서 IoCreateFileSpecifyDeviceObjectHint에 대한 설명을 참조하세요.

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

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

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

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

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

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

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

    IrpSp-FileObject> 매개 변수에는 relatedFileObject 필드에 대한 포인터가 포함되어 있으며 이는 FILE_OBJECT 구조체이기도 합니다. 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