다음을 통해 공유


IRP_MJ_DEVICE_CONTROL(FS 및 필터 드라이버)

보낸 경우

I/O 관리자, 기타 운영 체제 구성 요소 및 기타 커널 모드 드라이버는 IRP_MJ_DEVICE_CONTROL 요청을 보냅니다. 일반적으로 이 IRP는 Win32 DeviceIoControl 함수를 호출한 사용자 모드 애플리케이션을 대신하거나 ZwDeviceIoControlFile을 호출한 커널 모드 구성 요소를 대신하여 전송됩니다.

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

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

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

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

매개 변수

파일 시스템 또는 필터 드라이버는 지정된 IRP에 대해 IoGetCurrentIrpStackLocation 을 호출하여 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. 다음 매개 변수에서 IrpIRP 를 가리키고 IrpSpIO_STACK_LOCATION 가리킵니다. 드라이버는 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->RequestorMode커널Mode 또는 UserMode 작업을 요청한 프로세스의 실행 모드를 나타냅니다.

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

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

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

  • IrpSp->MajorFunction 은 IRP_MJ_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(WDK 커널 참조)

I/O 제어 코드 사용

ZwDeviceIoControlFile