PnP manager 如何載入正確 driver

PnP manager 會由 bus driver 得到 device ID、product ID 以及 instance ID,這三者合稱 device instance ID(DIID)。透過這個 DIID,PnP manager 到 registry 中的 HKLM\SYSTEM\CurrentControlSet\Enum 中尋找相對應的 entry。這個 entry 的內容有幾個比較重要:

ClassGUID:這是由 driver inf 檔案所指定的,待會會使用到它來找到 class key
Service:這是 function driver 的名稱
LowerFilters:底層的 filter driver 名稱
UpperFilters:上層的 filter driver 名稱

透過 ClassGUID,PnP manager 可以找到位於 HKLM\SYSTEM\CurrentControlSet\Control\Class 底下的 entry,這個 entry 同樣有 LowerFilters/UpperFilters 的 item。

PnP manager 載入 driver 的順序為:

1. 載入在 enumeration key 中的 lower filter driver
2. 載入在 class key 中的 lower filter driver
3. 載入在 enumeration key 中由 Service 指定的 function driver
4. 載入在 enumeration key 中的 upper filter driver
5. 載入在 class key 中的 upper filter driver

如果 PnP manager 無法找到正確的 driver,則它會傳 DIID 給 user-mode PnP manager,通知 user 進行手動安裝。這邊大致上就是讀取相對應的 inf 及 cab 檔(WHQL 產生的 signature 值存在此)來進行安裝。Inf 檔內容可見 \Windows\Inf 目錄。Cab 檔內容可見 \Windows\system32\Cabroot 目錄。

User-mode PnP manager 會讀取位於 cab 檔內的 signature 值,使用微軟的 private/public key pair 來解它,得出來的 hash 值與 driver file 的 hash 比對。如果兩值相等,代表此 driver 是 signed;反之則否。

留言

熱門文章