I/O 제어 코드(IOCTL)는 사용자 모드 애플리케이션과 드라이버 간의 통신 또는 스택의 드라이버 간 내부 통신에 사용됩니다. I/O 제어 코드는 IRP를 사용하여 전송됩니다.
사용자 모드 애플리케이션은 Microsoft Windows SDK 설명서에 설명된 DeviceIoControl을 호출하여 드라이버에 IOCTL을 보냅니다. DeviceIoControl에 대한 호출로 인해 I/O 관리자가 IRP_MJ_DEVICE_CONTROL 요청을 만들어 최상위 드라이버로 보냅니다.
또한 상위 수준 드라이버는 IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 만들고 전송하여 IOCTL을 하위 수준 드라이버로 보낼 수 있습니다. 드라이버는 DispatchDeviceControl 및 DispatchInternalDeviceControl 루틴에서 이러한 요청을 처리합니다. (사용자 모드 애플리케이션은 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 보낼 수 없습니다.)
일부 IOCTL은 공용이고 일부는 비공개입니다. 공용 IOCTL은 일반적으로 WDK(Windows 드라이버 키트) 또는 Windows SDK에서 Microsoft에서 시스템 정의 및 문서화됩니다. DeviceIoControl에 대한 사용자 모드 구성 요소의 호출과 함께 전송되거나, IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 사용하여 커널 모드 드라이버에서 다른 커널 모드 드라이버로 전송될 수 있습니다.
반면에 개인 IOCTL은 공급업체의 소프트웨어 구성 요소 간의 독점적 통신을 위해 사용됩니다. 프라이빗 IOCTL은 일반적으로 공급업체에서 제공하는 헤더 파일에 정의되며 공개적으로 문서화되지 않습니다. 공용 IOCTL과 마찬가지로 DeviceIoControl에 대한 사용자 모드 구성 요소의 호출과 함께 전송되거나 IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 사용하여 커널 모드 드라이버에서 다른 커널 모드 드라이버로 전송될 수 있습니다.
퍼블릭 및 프라이빗 IOCTL의 코딩에는 차이가 없습니다. 그러나 공급업체에서 정의한 IOCTL에서 사용할 수 있는 내부 코드와 시스템 정의 IOCTL에 사용되는 코드와는 차이가 있습니다. 사용 가능한 공용 IOCTL이 요구 사항에 맞지 않는 경우 소프트웨어 구성 요소가 서로 통신하는 데 사용할 수 있는 새 프라이빗 IOCTL을 정의할 수 있습니다. 자세한 내용은 I/O 제어 코드 정의을 참조하세요.