다음을 통해 공유


드라이버의 I/O 스택 위치를 확인해야 하는 경우

들어오는 각 IRP에 대한 드라이버의 I/O 스택 위치에 주요 I/O 함수 코드가 설정됩니다.

드라이버의 디스패치 루틴은 IRP에 대한 드라이버의 I/O 스택 위치를 검사 다음 조건이 있는 경우 수행할 작업을 결정해야 합니다.

  • 디스패치 루틴은 둘 이상의 주요 I/O 함수 코드를 처리합니다.

  • 디스패치 루틴은 특정 주 함수 코드에 대한 부 함수 코드 집합을 처리해야 합니다. 부 함수 코드가 있는 IRP에는 SCSI 포트 드라이버 및 파일 시스템 드라이버가 처리해야 하는 특정 IRP뿐만 아니라 IRP_MJ_PNP 및 IRP_MJ_POWER 포함됩니다.

  • 디바이스 드라이버 또는 긴밀하게 결합된 상위 수준 드라이버의 디스패치 루틴은 연결된 I/O 제어 코드 집합이 있는 IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 처리합니다.

드라이버의 I/O 스택 위치에 대한 포인터를 가져오기 위해 디스패치 루틴 은 IoGetCurrentIrpStackLocation을 호출합니다.

상위 수준 드라이버의 디스패치 루틴은 항상 IoGetCurrentIrpStackLocation 을 호출하고 IoGetNextIrpStackLocation 을 호출하여 드라이버 스택 아래로 IRP를 전달할 때 다음 하위 드라이버에 대해 설정한 다음 하위 드라이버의 I/O 스택 위치에 대한 포인터를 가져옵니다.

디바이스 드라이버 또는 밀접하게 결합된 클래스 드라이버의 DispatchDeviceControl 루틴 또는 DispatchInternalDeviceControl 루틴은 각 요청에 대해 Parameters.DeviceIoControl.IoControlCode 의 드라이버 I/O 스택 위치에 설정된 I/O 제어 코드를 결정해야 합니다. I/O 컨트롤 코드는 드라이버의 I/O 스택 위치에 포함되어 있습니다.

대부분의 경우 상위 수준 드라이버의 DispatchDeviceControl 또는 DispatchInternalDeviceControl 루틴은 IRP에서 스택 위치를 설정한 후 IRP_MJ_DEVICE_CONTROL 또는IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 다음 하위 드라이버에 전달합니다. 그러나 SCSI 클래스 드라이버는 이러한 요청을 전달하기 전에 SCSI 포트 드라이버의 I/O 스택 위치를 올바르게 설정할 수 있도록 특정 SCSI 포트 I/O 제어 코드에 대해 검사 합니다.