ActivateDeviceEx

設備管理器是如何載入驅動程式的呢?這裡用到了一個重要的函式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
字元串指針,指向註冊表中包含驅動信息的鍵,這個鍵應當包含驅動程式的DLL名、前綴、索引和入口點等信息。
lpRegEnts
指向REGINI結構體數組,這個數組中定義了一些需要被添加到激活設備列表中的信息(ActivateDevice),這些信息填寫後,驅動程式才被載入。如果是匯流排驅動的話,這裡應該設定成NULL。
cRegEnts
lpRegEnts指向REGINI結構體的數組中元素的個數。
lpvParam
通過這個指針向已經載入的驅動程式傳遞參數,而不必將參數保留在註冊表中,這個參數將以第2參數的角色被傳遞到XXX_Init(Device Manager)函式入口中。
返回值
如果返回具體設備的句柄,則代表操作成功,否則為失敗。設備句柄可以在調DeactivateDevice函式的時候作為參數使用。

相關詞條

熱門詞條

聯絡我們