I/O 控制代碼 (IOCTLs) 用於使用者模式應用程式和驅動程式之間的通訊,或用於在堆疊中的驅動程式內部通訊。 I/O 控制代碼會使用 IRP 傳送。
使用者模式應用程式透過呼叫 DeviceIoControl 將 IOCTL 傳送至驅動程式,如Microsoft Windows SDK 檔所述。 呼叫 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 通常由 Microsoft 定義並記錄在 Windows 驅動程式開發工具包(WDK)或 Windows SDK 中。 這些請求可能會透過使用者模式元件的呼叫來傳送給 DeviceIoControl,或者他們可能會使用 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL 要求,從一個內核模式驅動程式傳送至另一個內核模式驅動程式。
另一方面,私有IOCTL專門用於供廠商使用的軟體元件之間的通訊。 私人IOCTL通常會定義在廠商提供的頭檔中,而且不會公開記載。 和公共 IOCTL 一樣,它們可以通過使用者模式元件的 DeviceIoControl 呼叫來發送,或者可以使用 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL 要求,從一個核心模式驅動程式發送至另一個核心模式驅動程式。
公用和私人 IOCTLs 的編碼沒有任何差異。 不過,相較於用於系統定義 IOCTL 的內部程式代碼,用於供應商自定義 IOCTL 的內部程式代碼存在差異。 如果可用的公用 IOCTL 不符合您的需求,您可以定義軟體元件可用來彼此通訊的新私人 IOCTL。 如需詳細資訊,請參閱 定義 I/O 控制程式碼。