指定驅動程式載入順序
對於大部分的系統,電腦上的裝置實體階層會決定 Windows 和 PnP 管理員載入驅動程式的順序。 Windows 和 PnP 管理員會設定從系統根裝置開始的裝置,然後設定根裝置的子裝置 (例如 PCI 配接器) 、這些裝置的子系等等。 如果先前未為另一部裝置載入驅動程式,則 PnP 管理員會在裝置設定時載入每個裝置的驅動程式。
INF 檔案中的設定可能會影響驅動程式載入順序。 本主題描述廠商應該在驅動程式INF AddService 指示詞所參考之 service-install-section中指定的相關值。 具體而言,本主題討論 StartType、 BootFlags、 LoadOrderGroup和 Dependencies 專案。
驅動程式應遵循下列規則來指定 StartType:
開機初期不需要 PnP 驅動程式
PnP 驅動程式應該有SERVICE_DEMAND_START (0x3) 的開始類型,指定 PnP 管理員可以在 PnP 管理員找到驅動程式服務的裝置時載入驅動程式。
啟動電腦所需的裝置驅動程式
如果裝置需要啟動電腦,裝置的驅動程式應該具有SERVICE_BOOT_START (0x0) 的啟動類型。
非開機啟動驅動程式 ,會偵測無法 PnP 列舉的裝置 ()
對於無法列舉 PnP 的裝置,驅動程式會呼叫 IoReportRootDevice 或 IoReportDetectedDevice將裝置回報給 PnP 管理員。 這類驅動程式應該具有啟動類型SERVICE_SYSTEM_START (0x01) ,因此 Windows 會在系統初始化期間載入驅動程式。
只有回報非 PnP 硬體的驅動程式應該設定此啟動類型。 如果驅動程式同時服務 PnP 和非 PnP 裝置,則應該設定此啟動類型。
服務控制管理員必須啟動的非 PnP 驅動程式
這類驅動程式應該具有啟動類型SERVICE_AUTO_START (0x02) 。 PnP 驅動程式不得設定此啟動類型。
應該撰寫 PnP 驅動程式,以便在 Windows 設定驅動程式服務的裝置時載入它。 相反地,每當 PnP 管理員判斷驅動程式服務不再存在裝置時,驅動程式都應該能夠卸載。 PnP 驅動程式應該依賴的唯一驅動程式載入順序如下:
子裝置的驅動程式取決於載入父裝置驅動程式的事實。
裝置堆疊中的驅動程式可能取決於載入其下方任何驅動程式的事實。
例如,函式驅動程式可以確定載入任何較低篩選驅動程式。
不過請注意,裝置堆疊中的驅動程式無法相依于在裝置的較低驅動程式之後循序載入,因為驅動程式可能先前在設定另一個裝置時已載入。
篩選群組中的篩選驅動程式無法預測其負載順序。 例如,如果裝置有三個已註冊的上層篩選驅動程式,這三個驅動程式都會在函式驅動程式之後載入,但可以在其上層篩選群組內以任何順序載入。
如果驅動程式在另一個驅動程式上具有明確的載入順序相依性,應該透過父/子關聯性來實作該相依性。 子裝置的驅動程式可以取決於載入子驅動程式之前所載入父裝置的驅動程式。
為了強化設定正確 StartType 值的重要性,下列清單說明 Windows 和 PnP 管理員如何使用 INF 檔案中的 StartType 專案:
在系統啟動時,作業系統載入器會先載入類型為 SERVICE_BOOT_START 的驅動程式,再將控制權傳輸至核心。 當核心取得控制權時,這些驅動程式會位於記憶體中。
開機啟動驅動程式會在大部分裝置設定之前載入,因此無法由裝置階層決定其載入順序。 開機啟動驅動程式可以使用 INF LoadOrderGroup 專案來排序其載入。 作業系統會忽略開機啟動驅動程式的 INF 相依性 專案。
PnP 管理員會呼叫SERVICE_BOOT_START驅動程式的 DriverEntry 常式,讓驅動程式可以服務開機裝置。
如果開機裝置有子裝置,則會列舉這些裝置。 如果子裝置的驅動程式也是開機啟動驅動程式,就會設定並啟動。 如果裝置的驅動程式並非所有開機啟動驅動程式,PnP 管理員會為裝置建立裝置節點 (開發節點) ,但尚未啟動裝置。
載入所有開機驅動程式並啟動開機裝置之後,PnP 管理員會設定其餘的 PnP 裝置並載入其驅動程式。
PnP 管理員會逐步執行 裝置樹 狀結構,並載入尚未啟動之 開發節點 的驅動程式, (也就是上一個步驟中任何未啟動的開發節點) 。 當每個裝置啟動時,PnP 管理員會列舉裝置的子系,如果有的話。
設定這些裝置時,PnP 管理員會載入裝置的驅動程式, 而不論 驅動程式的 StartType 值 (,除非在繼續啟動裝置之前SERVICE_DISABLED) StartType 。 這些驅動程式有許多是SERVICE_DEMAND_START驅動程式。
PnP 管理員會忽略因為 INF 相依性 專案和 LoadOrderGroup 專案而建立的登錄專案,而驅動程式會在此步驟中載入。 負載排序是以實體裝置階層為基礎。
在此步驟結束時,會設定所有裝置,但不是 PnP 列舉的裝置,以及這些裝置的子系除外。 (子系可能或可能不是 PnP-enumerable.)
PnP 管理員會載入尚未載入之 StartType 的驅動程式SERVICE_SYSTEM_START。
這些驅動程式會偵測並報告其非 PnP 裝置。 PnP 管理員會處理這些驅動程式之 INF LoadOrderGroup 專案結果的登錄專案。 它會忽略由於這些驅動程式的 INF 相 依性 專案而建立的登錄專案。
服務控制管理員會載入尚未載入之 StartType 的驅動程式SERVICE_AUTO_START。
服務控制管理員會處理服務 相依于服務 DependOnGroup 和 DependOnServices的服務資料庫資訊。 這項資訊來自 INF AddService專案中的相依性專案。 請注意,相 依性 資訊只會針對非 PnP 驅動程式處理,因為任何必要的 PnP 驅動程式都會在系統啟動的先前步驟中載入。 服務控制管理員會忽略 INF LoadOrderGroup 資訊。
如需服務控制管理員的詳細資訊,請參閱Microsoft Windows SDK檔。
根據開機案例,使用 BootFlags 在開機時升級驅動程式的 StartType
作業系統可以根據驅動程式INF 中指定的 BootFlags值,將驅動程式的StartType升階為開機啟動驅動程式。 您可以在 INF 檔案中指定下列數值的一或多個 (ORed) ,以十六進位值表示:
- 如果驅動程式應在網路開機時升級為開機啟動驅動程式,請指定 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD) 。
- 如果驅動程式應在從 VHD 開機時升級,請指定 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD)
- 如果在從 USB 磁片開機時應該升級驅動程式,請指定 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD) 。
- 如果在從 SD 儲存體開機時應升級驅動程式,請指定0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD)
- 如果在從 USB 3.0 控制器上的磁片開機時應升級驅動程式,請指定 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD) 。
- 如果在啟用測量開機時應升級驅動程式,請指定 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD) 。
- 如果在啟用驗證器開機時應升級驅動程式,請指定 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD) 。
- 如果驅動程式應在 WinPE 開機時升級,請指定 0x80 (CM_SERVICE_WINPE_BOOT_LOAD) 。
如需在開機時升級驅動程式 StartType 的詳細資訊,請視開機案例而定,請參閱 INF AddService 指示詞。