存取PCI裝置設定空間
周邊元件互連 (PCI) 裝置上的某些作業會保留給裝置的函式驅動程式。 例如,這類作業包括存取總線的裝置特定設定空間,以及設計直接記憶體存取 (DMA) 控制器。 Microsoft 提供系統支援,以兩種方法存取 PCI 裝置的設定空間:
組態 I/O 要求封包 (IRP) 、 IRP_MN_READ_CONFIG 和 IRP_MN_WRITE_CONFIG
注意
從 2004 版 Windows 10 開始,如果裝置有安全裝置 (SDEV) ACPI 數據表和虛擬化型安全性啟用,則存取 PCI 裝置設定空間不受支援的方法會受到限制。 如果驅動程式或進程嘗試使用上述方法讀取或操作PCI裝置設定空間,將會封鎖存取,並導致系統錯誤檢查。
Windows XP 和 Windows Server 2003 和更新版本的作業系統可獨佔控制設定空間標頭,如 PCI 本機總線 規格所定義,以及功能連結清單中的所有功能。 驅動程式不得嘗試修改這些緩存器。
不過,驅動程式可以使用IRP_MN_WRITE_CONFIG要求或BUS_INTERFACE_STANDARD 的 SetBusData 方法,寫入不屬於廠商定義的標頭或功能清單的組態空間。 驅動程式也可以使用 IRP_MN_READ_CONFIG 要求或 BUS_INTERFACE_STANDARD 的 GetBusData 方法來讀取裝置的功能。 若要使用IRP_MN_READ_CONFIG或IRP_MN_WRITE_CONFIG,驅動程式必須在PASSIVE_LEVEL執行。 如需驅動程式可以查詢的功能和對應結構清單,請參閱 PCI結構 一節。
驅動程式可以使用 IRP_MN_READ_CONFIG 要求或 BUS_INTERFACE_STANDARD 的 GetBusData 方法,從擴充 PCI 裝置組態空間 (讀取超過 256 個字節的組態數據) 。 同樣地,驅動程式可以使用 IRP_MN_WRITE_CONFIG 要求或 BUS_INTERFACE_STANDARD 的 SetBusData 方法來寫入擴充 PCI 裝置設定空間。 如果裝置沒有擴充的設定空間,或平臺未定義裝置上擴充設定空間的路徑,則讀取要求會傳回0xFFFF,而寫入要求將沒有任何作用。 若要判斷作業是否成功,驅動程式可以檢查讀取或寫入的位元元組數目。
PCI Express 和 PCI-X 模式 2 支援大於 256 個字節的擴充 PCI 裝置設定空間。 驅動程式可以讀取和寫入此設定空間,但只能使用適當的硬體和 BIOS 支援。 在 ACPI BIOS 中,根總線必須具有PNP0A08或PNP0A03的 PNP 識別碼。 對於具有 PNP 識別碼為 PNP0A03 的根總線,具有函式 4 的 _DSM 方法應該指出目前的模式為 PCI-X 模式 2。 所有的網橋和裝置都應該是PCI Express,或在PCI-X模式2中運作。
此外,系統應該支援記憶體對應的設定空間存取。 這是藉由在系統 BIOS/韌體中定義 MCFG 數據表。 Windows Vista 和 Windows Server 2008 和更新版本的作業系統會自動支援記憶體對應的設定空間存取。
警告
HalGetBusDataByOffset 和 HalSetBusDataByOffset 會提供回溯相容性,但只有在無法使用上述兩種方法時才應該使用。