WinCE流驱动加载的控制
????? 這個問題在實現時曾考慮到,發布版本的日志里也加了說明,如果啟用了調試串口,那么在燒錄或者升級系統前,須禁用調試串口。說實在的,確實有點麻煩,不小心就忘了做這個工作。而問題的根源是實現機制不太合理。調試串口的配置被分散在兩處,一處是存儲在NAND Flash的特定區域,另一處是注冊表中。系統啟動時,OAL根據Flash中保存的狀態,確定是否啟用調試串口,而驅動加載時又根據注冊表的狀態,確定是否加載調試串口的驅動。兩處保存的狀態不同步時,問題就出現了。問題分析清楚了,解決方法自然就有了,保證兩處的狀態一致即可。
????? 調試串口的配置由存儲在NAND Flash中的參數決定,系統啟動時根據該值,動態修改調試串口對應的注冊表配置,確保在啟用調試串口時,不再加載它所對應的驅動,也就不會產生沖突,導致系統無法正常啟動了。
????? 在驅動注冊表中,Flags是用于控制流驅動的加載行為的。其中DEVFLAGS_NOLOAD即表示不要加載該驅動。所以,在合適的地方添加如下代碼,即可控制調試串口驅動的加載。
?1?void?DisableDebugSerial(BOOL?bDisable)?2?{
?3?????HKEY?Key;
?4?????DWORD?Status;
?5?????DWORD?Disposition;
?6?????DWORD?Value;
?7?????DWORD?Flags;
?8?
?9?????Status?=?RegCreateKeyEx(HKEY_LOCAL_MACHINE,?L"Drivers\\BuiltIn\\Serial3",?0,?NULL,?0,?0,?NULL,?&Key,?&Disposition);
10?
11?????if?(Status?==?ERROR_SUCCESS)
12?????{
13?????????Value?=?bDisable???DEVFLAGS_NONE?:?DEVFLAGS_NOLOAD;
14?????????RegSetValueEx(Key,?DEVLOAD_FLAGS_VALNAME,?0,?DEVLOAD_FLAGS_VALTYPE,?(PBYTE)&Value,?sizeof(Value));
15?????????RegCloseKey(Key);
16?????}
17?}
?????? 如果禁用了調試串口,則將Flag是設置為DEVFLAGS_NONE,設備管理器將正常加載驅動。如果沒有禁用調試串口,則將Flags設置為DEVFLAGS_NOLOAD,設備管理器就不會加載該驅動。
????? 通過以上方法的改進,調試串口的動態復用就更方便了。
?
[FLAGS:驅動加載配置]
注冊表里每個驅動可以包含一個鍵FLAGS, 這個配置決定了驅動的加載.下面是WinCE5.0的FLAGS的可選配置,(可以多項相與得到復合值)說明如下:
DEVFLAGS_NONE
注冊表沒有指定FLAGS
DEVFLAGS_UNLOAD
指示設備管理器執行完Init后卸掉驅動,并且返回成功.總線枚舉驅動都這么干.
DEVFLAGS_LOADLIBRARY
通知設備管理器使用LoadLibrary代替LoadDriver.2者的區別:LoadLibrary加載的可以paged out.
DEVFLAGS_NOLOAD
指示設備管理器,驅動將不會被加載.
DEVFLAGS_NAKEDENTRIES
指 示設備管理器前綴不要用.可以用前綴來active,但找函數入口點時候不要用前綴. 比如電池驅動指定這個標記后,設備管理器會用BAT這個前綴去實現驅動,但在調用接口時候不會默認的用BAT_Init,.BAT_***,而是自己去找 入口點. 這樣的目的是可以自由修改驅動接口函數名,可以不要和前綴相同了.
DEVFLAGS_BOOTPHASE_1
要求加載驅動時候,必須BootPhase大于1. BootPhase就是啟動階段的意思. 設備管理器啟動是分階段的.BootPhase1在找注冊表.;BootPhase2 加載驅動;BootPhase3開始運行.(題外話,也可以只分2個階段.)
DEVFLAGS_IRQ_EXCLUSIVE
在訪問IRQ時候再加載.
WinCE6.0在此的基礎上增加了幾個
DEVFLAGS_LOAD_AS_USERPROC
這個是重頭戲, 指示設備管理器,把驅動給加載到user mode. 設備管理器會創建一個Reflector.這個就是WinCE6.0主要的改進了.現在我也不懂, 后面再說說這個.
DEVFLAGS_NOUNLOAD
阻止驅動被卸載.
DEVFLAGS_TRUSTEDCALLRERONLY
指示設備管理器限制驅動只能被信任的應用程序open. 在WinCE5.0的文檔里面也說有這個,但代碼中沒有發現,所以5.0應該是沒有實現.(時空錯亂?還是文檔設計先行?還是ms藏私貨了,反正我的版本沒有.)
?
總結
以上是生活随笔為你收集整理的WinCE流驱动加载的控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinCE中sources文件中targ
- 下一篇: 阿拉伯系统的建立