I/O 제어 코드 소개
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은 "public"이고 일부는 "프라이빗"입니다. 공용 IOCTL은 일반적으로 WDK(Windows 드라이버 키트) 또는 Windows SDK에서 Microsoft에서 시스템 정의 및 문서화됩니다. DeviceIoControl에 대한 사용자 모드 구성 요소의 호출을 통해 전송되거나 IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 사용하여 커널 모드 드라이버에서 다른 커널 모드 드라이버로 전송될 수 있습니다. 공용 IOCTL의 예로는 SCSI 포트 I/O 제어 코드 및 I8042prt 마우스 내부 디바이스 제어 요청이 있습니다.
반면에 프라이빗 IOCTL은 공급업체의 소프트웨어 구성 요소에서만 서로 통신하는 데 사용됩니다. 프라이빗 IOCTL은 일반적으로 공급업체에서 제공하는 헤더 파일에 정의되며 공개적으로 문서화되지 않습니다. 공용 IOCTL과 마찬가지로 DeviceIoControl에 대한 사용자 모드 구성 요소의 호출을 통해 전송되거나 IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 사용하여 커널 모드 드라이버에서 다른 커널 모드 드라이버로 전송될 수 있습니다.
퍼블릭 및 프라이빗 IOCTL의 코딩에는 차이가 없습니다. 그러나 공급업체에서 정의한 IOCTL에서 사용할 수 있는 내부 코드와 시스템 정의 IOCTL에 사용되는 코드에 비해 차이가 있습니다. 사용 가능한 공용 IOCTL이 요구 사항에 맞지 않는 경우 소프트웨어 구성 요소가 서로 통신하는 데 사용할 수 있는 새 프라이빗 IOCTL을 정의할 수 있습니다. 자세한 내용은 I/O 제어 코드 정의를 참조하세요.