設備管理器是如何載入驅動程式的呢?這裡用到了一個重要的函式ActivateDeviceEx。
ActivateDeviceEx是指:
n 由設備管理器,也就是Device.exe來載入設備驅動;
n 註冊表枚舉時,用這個函式來讀取啟動時應當載入的驅動程式信息;
n ActivateDeviceEx將使用註冊表中的Dll,Prefix,Index,Flags項。
ActivateDevice也能用來載入設備驅動,其實它內部也是調用了ActivateDevice
Ex。ActivateDeviceEx函式的主要功能就是用來載入驅動程式,它讀取參數lpszDevKey中描述的註冊表鍵來獲取驅動程式的DLL名稱、設備名前綴和其他相關信息(包括IOCTL等),這個函式可以用來替代ActivateDevice和RegisterDevice。
還以powerbutton為例,下面是註冊表中它的相關內容。
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PM]
"Prefix"="PWR"
"Dll"="pm.dll"
"Order"=dword:0
"Ioctl"=dword:4
"Index"=dword:0
"IClass"=multi_sz:"{A32942B7-920C-486b-B0E6-92A702A99B35}"
根據以上信息可以看出,在載入驅動程式時,調用ActivateDeviceEx函式的步驟為:
(1)ActivateDeviceEx(“\\HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\PM”,…)
(2)ActivateDeviceEx函式將在\\HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\PM鍵下尋找DLL的名稱,在此也就是pm.dll,然後讀取設備名前綴PWR以及index:0和其他信息。這裡的index就是在前綴後面要添加上的序列號,如果是1,設備就是PWR1,它是用來妥善處理多重類似驅動設備在系統中被載入的情況。Index如果沒有定義,設備管理器將為其指定一個空閒的索引號。
(3)ActivateDeviceEx將把設備添加到已激活設備列表中去。這時,如果沒有定義index號,設備管理器必須指定一個空閒的索引號給設備,在添加完之後,設備管理器才將設備驅動載入到自己的進程上下文中。
下面是ActivateDeviceEx的函式原型:
HANDLE ActivateDeviceEx(
LPCWSTR lpszDevKey,
LPCVOID lpRegEnts,
DWORD cRegEnts,
LPVOID lpvParam
);
參數解釋:
lpszDevKey
lpRegEnts