다음을 통해 공유


DispatchDeviceControl 및 DispatchInternalDeviceControl 루틴

드라이버의 디스패치 루틴(DRIVER_DISPATCH 참조)은 각각 IRP_MJ_DEVICE_CONTROL 및 IRP_MJ_INTERNAL_DEVICE_CONTROL I/O 함수 코드를 사용하여 IRP를 처리합니다.

모든 일반적인 유형의 주변 장치에서 시스템은 IRP_MJ_DEVICE_CONTROL 요청에 대한 I/O 제어 코드 집합을 정의합니다. 각 유형의 디바이스에 대한 새 드라이버는 이러한 요청을 지원해야 합니다. 대부분의 경우 각 디바이스 유형에 대한 이러한 공용 I/O 제어 코드는 사용자 모드 애플리케이션으로 내보내지지 않습니다.

이러한 시스템 정의 I/O 제어 코드 중 일부는 IoBuildDeviceIoControlRequest를 호출하여 기본 디바이스 드라이버에 대한 IRP를 만드는 상위 수준 드라이버에서 사용됩니다. Win32 구성 요소는 Win32 함수 DeviceIoControl(Microsoft Windows SDK 설명서에 설명됨)을 호출하여 기본 디바이스 드라이버와 통신하는 데 사용됩니다. 이 함수는 시스템 서비스를 호출합니다. I/O 관리자는 IRP를 설정하고 주 함수 코드 IRP_MJ_DEVICE_CONTROL 및 지정된 I/O 컨트롤 코드를 Parameters.DeviceIoControl.IoControlCodeIO_STACK_LOCATION 구조에 저장합니다. 그런 다음 I/O 관리자는 체인에서 가장 높은 수준의 드라이버의 DispatchDeviceControl 루틴을 호출합니다.

운영 체제는 새 드라이버와 상호 운용하고 지원하도록 설계된 특정 시스템 제공 드라이버의 경우 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청에 대한 I/O 제어 코드 집합도 정의합니다. 대부분의 경우 이러한 공용 I/O 제어 코드를 사용하면 추가 기능 상위 수준 드라이버가 기본 디바이스 드라이버와 상호 운용할 수 있습니다.

예를 들어 시스템 제공 병렬 드라이버는 공급업체에서 제공한 드라이버가 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청에서 보내는 내부 I/O 제어 코드 집합을 지원합니다. 자세한 내용은 병렬 포트에 대한 내부 디바이스 제어 요청병렬 디바이스에 대한 내부 디바이스 제어 요청을 참조하세요.

시스템 정의 I/O 제어 코드를 통해 요청된 거의 모든 작업은 버퍼링된 I/O를 사용합니다. 이러한 유형의 요청에는 대용량 데이터 전송이 거의 필요하지 않으므로 즉, 직접 I/O를 위해 디바이스 개체를 설정한 드라이버도 Irp-AssociatedIrp.SystemBuffer>에서 버퍼로 전송하거나 버퍼에서 전송할 데이터가 있는 디바이스 제어 요청에 대한 IRP를 전송합니다(Win32 멀티미디어 드라이버가 밀접하게 결합된 특정 유형의 최상위 디바이스 드라이버 제외).

또한 드라이버는 다른 드라이버가 통신하는 데 사용할 수 있는 개인 I/O 제어 코드 집합을 정의할 수 있습니다. 공용 I/O 제어 코드는 운영 체제 자체에 기본 제공되므로 Microsoft Corporation의 협조를 통해서만 새 공용 I/O 제어 코드를 시스템에 추가할 수 있습니다.

다양한 종류의 드라이버가 지원해야 하는 공용 I/O 컨트롤 코드 집합과 프라이빗 I/O 컨트롤 코드 정의에 대한 자세한 내용은 WDK(Windows 드라이버 키트)의 디바이스별 참조 섹션을 참조하세요.