I/O 控制程式碼簡介

I/O 控制程式碼 (IOCTLs) 用於使用者模式應用程式和驅動程式之間的通訊,或用於在堆疊中的驅動程式內部通訊。 I/O 控制代碼是使用 IRP 傳送。

使用者模式應用程式會呼叫DeviceIoControl 將 IOCTL傳送至驅動程式,如Microsoft Windows SDK檔中所述。 呼叫 DeviceIoControl 會導致 I/O 管理員建立 IRP_MJ_DEVICE_CONTROL 要求,並將其傳送至最上層的驅動程式。

此外,高階驅動程式可以藉由建立和傳送 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 要求,將 IOCTL 傳送至較低層級的驅動程式。 驅動程式會在 DispatchDeviceControlDispatchInternalDeviceControl 常式中處理這些要求。 (使用者模式應用程式無法傳送 IRP_MJ_INTERNAL_DEVICE_CONTROL requests.)

某些 IOCTL 為「公用」,有些則為「私用」。 公用 IOCTL 通常是由 Microsoft 系統定義並記載于 Windows 驅動程式套件 (WDK) 或 Windows SDK 中。 他們可能透過使用者模式元件對 DeviceIoControl的呼叫來傳送,或是使用 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 要求,從某個核心模式驅動程式傳送到另一個核心模式驅動程式。 公用 IOCTL 的範例包括 SCSI 埠 I/O 控制代碼I8042prt 滑鼠內部設備控制要求

另一方面,私人 IOCTL 是專門供廠商的軟體元件用來彼此通訊。 私人 IOCTL 通常會定義在廠商提供的標頭檔中,而且不會公開記載。 就像公用 IOCTL 一樣,他們可能會透過使用者模式元件的 DeviceIoControl呼叫來傳送,或是使用 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 要求,從一個核心模式驅動程式傳送到另一個核心模式驅動程式。

公用和私人 IOCTLs 的編碼沒有任何差異。 不過,相較于系統定義 IOCTL 所使用的 IOCTL,內部程式碼的差異也不同。 如果可用的公用 IOCTL 不符合您的需求,您可以定義軟體元件可用來彼此通訊的新私人 IOCTL。 如需詳細資訊,請參閱 定義 I/O 控制程式碼