다음을 통해 공유


IRP_MJ_INTERNAL_DEVICE_CONTROL(FS 및 필터 드라이버)

보낸 경우

I/O 관리자, 기타 운영 체제 구성 요소 및 기타 커널 모드 드라이버는 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 보냅니다.

IRP_MJ_DEVICE_CONTROL 요청과 달리 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청은 커널 모드 구성 요소 간의 통신에만 사용됩니다. IRP_MJ_DEVICE_CONTROL 요청은 일반적으로 DeviceIoControl 또는 ZwDeviceIoControlFile에 대한 호출로 시작되지만 이러한 루틴은 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 만들 수 없습니다. 그러나 IoBuildDeviceIoControlRequest를 호출하여 두 유형의 IRP를 모두 만들 수 있습니다.

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

파일 시스템 드라이버는 파일 개체를 추출하고 디코딩하여 열린 볼륨을 나타내는 핸들에서 요청이 실행되었는지 여부를 확인해야 합니다. 이 경우 파일 시스템 드라이버는 볼륨이 탑재된 스토리지 디바이스의 디바이스 드라이버에 IRP를 전달해야 합니다. 그렇지 않으면 드라이버가 IRP에 실패해야 합니다.

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

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

매개 변수

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

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

  • Irp->ASSOCIATedIrp.SystemBuffer 는 대상 디바이스의 디바이스 드라이버에 전달할 시스템 제공 입력 버퍼를 가리킵니다. METHOD_BUFFERED 또는 METHOD_DIRECT I/O에 사용됩니다. 이 매개 변수가 필요한지 여부는 특정 I/O 컨트롤 코드에 따라 달라집니다.

  • Irp->IoStatus는 최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조와 요청된 작업에 대한 정보를 가리킵니다. 자세한 내용은 ZwDeviceIoControlFile에 대한 IoStatusBlock 매개 변수에 대한 설명을 참조하세요.

  • Irp->MdlAddress 는 대상 디바이스의 디바이스 드라이버에 전달할 출력 버퍼를 설명하는 MDL(메모리 설명자 목록)의 주소입니다. METHOD_DIRECT I/O에 사용됩니다. 이 매개 변수가 필요한지 여부는 특정 I/O 컨트롤 코드에 따라 달라집니다.

  • Irp->RequestorModeKernelMode 또는 UserMode 작업을 요청한 프로세스의 실행 모드를 나타냅니다.

  • Irp->UserBuffer는 대상 디바이스의 디바이스 드라이버에 전달될 호출자 제공 출력 버퍼를 가리킵니다. 이 매개 변수는 METHOD_BUFFERED 또는 METHOD_NEITHER I/O에 사용됩니다. 이 매개 변수가 선택 사항인지 필수인지 여부는 특정 I/O 제어 코드에 따라 달라집니다.

  • IrpSp->FileObjectDeviceObject와 연결된 파일 개체를 가리킵니다.

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

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

  • IrpSp->Parameters.DeviceIoControl.InputBufferLengthIrp-AssociatedIrp.SystemBuffer>가 가리키는 버퍼의 크기(바이트)입니다.

  • IrpSp->Parameters.DeviceIoControl.IoControlCode 는 대상 디바이스의 디바이스 드라이버에 전달할 IOCTL 함수 코드입니다.

    IOCTL 요청에 대한 자세한 내용은 Windows SDK 설명서에서 I/O 제어 코드 사용 및 "디바이스 입력 및 출력 제어 코드"를 참조하세요.

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLength 는 Irp-UserBuffer가 가리키는 버퍼의 크기(바이트 )>입니다.

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer 는 METHOD_NEITHER 사용하는 커널 모드 요청에 대한 입력 버퍼입니다.

추가 정보

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL

IRP_MJ_INTERNAL_DEVICE_CONTROL(WDK 커널 참조)

I/O 컨트롤 코드 사용

ZwDeviceIoControlFile