加載流驅動程序有三種方法:
第一種加載類型是在系統啟動的時候進行的。當Winows CE的平台啟動的時候,設備管理器(Device.exe)從註冊表的HKEY_LOCAL_MACHINE\Drivers\RootKey下面加載入口點,通常RootKey的值都被設置為Drivers\BuiltIn。然後設備管理器(Device.exe)通過\RootKey提供的入口點開始讀取 HKEY_LOCAL_MACHINE \Drivers\Builtin的內容,並加載已列出的驅動程式。
##CONTINUE##
第二種加載的類型是在設備管理程式自動檢測外圍設備設備與基於Windows CE平台的連接時進行的。
第三種加載類型是當設備管理器程序不能夠自動檢測或加載某一種驅動程式的時候,這個時候的可以使用系統提供的函數ActivateDeviceEx函數來加載驅動程序。
HANDLE ActivateDeviceEx(
LPCWSTR lpszDevKey,
LPCVOID lpRegEnts,
DWORD cRegEnts,
LPVOID lpvParam
);
lpszDevKey :[HKEY_LOCAL_MACHINE]下的登錄機碼名稱
lpvParam:傳送至驅動程式的Init函式中的指標。
傳回值:裝置的控制碼,可用來卸載Driver時傳送之參數!
以PCT661的PowerButton Driver為例:
方法一:
若在Platform.reg中已經有定義相關資訊,則必須在相關設定中加入"Flags"的參數,並將值定為4
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PWRBUTTON]
"Prefix"="PWR"
"Dll"="PwrButton.Dll"
"Order"=dword:2
"Ioctl"=dword:4
"KeyMuxTime"=dword:64 ; 100 ms
IF BSP_ATLAS_KEYPANEL_V3
"KeyMuxValue"=dword:C3 ; VK_APP3
ELSE
"KeyMuxValue"=dword:d ; VK_RETURN
"Flags"=dword:4
Flags設定為4表示系統開機時不去載入此driver!
有關Flags參數設定,可參考MSDN裡ActivateDeviceEx()說明!
接著就可以在AP中呼叫ActivateDeviceEx()
Step1 :
呼叫前須先將"Flags"的值設為0,Driver才能成功被載入:
if(RegCreateKeyEx( HKEY_LOCAL_MACHINE,szPWRBTNDevKey,0,_T("PWRBUTTON"),REG_OPTION_VOLATILE,0,NULL,&hKey,&dwDisposition) == ERROR_SUCCESS)
{
DisplayData(TEXT("RegCreateKeyEx Success"));
val = 0; RegSetValueEx(hKey,_T("Flags"),0,REG_DWORD,(PBYTE)&val,sizeof(DWORD));
RegCloseKey(hKey);
}
Step2 :
呼叫ActivateDeviceEx():
TCHAR szPWRBTNDevKey[] = _T("Drivers\\BuiltIn\\PWRBUTTON");
hDev = ActivateDeviceEx( szPWRBTNDevKey, NULL, 0, NULL );
方法二:
若沒有在Platfom.reg中設定Registry相關資料,則必須在載入前於Registry自行加入相關設定:
if(RegCreateKeyEx( HKEY_LOCAL_MACHINE,szKeyPADDevKey,0,
_T("KEYPAD"),REG_OPTION_VOLATILE,0,NULL,&hKey,&dwDisposition) == ERROR_SUCCESS)
{
RegSetValueEx(hKey,_T("Prefix"),0,REG_SZ,(const BYTE*)TEXT("PWR"),sizeof(TEXT("PWR")));
RegSetValueEx(hKey,_T("Dll"),0,REG_SZ,(const BYTE*)TEXT("touchpad.dll"),sizeof(TEXT("PwrButton.dll")));
val = 4;
RegSetValueEx(hKey,_T("Ioctl"),0,REG_DWORD,(PBYTE)&val,sizeof(DWORD));
val = 100;
RegSetValueEx(hKey,_T("KeyMuxTime"),0,REG_DWORD,(PBYTE)&val,sizeof(DWORD));
...............
RegCloseKey(hKey);
}
接著一樣再呼叫ActivateDeviceEx()
若想卸載Driver,則可以呼叫DeactivateDevice()
DeactivateDevice(hDev);
hDev為ActivateDeviceEx()之傳回值
問題:
* 有些Driver無法成功載入,如Bluetooth
* 有些Driver只能載入一次,卸載後無法再載入第二次,例如KEYPAD
2007年3月15日
wince下加載驅動程式
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言