日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

WinCE流驱动加载的控制

發布時間:2025/4/16 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinCE流驱动加载的控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前段時間整理了《 WinCE下調試串口的動態復用》,基本實現了調試串口與普通功能串口之間的動態切換。其中實現的方法有點欠缺,在重新燒錄或者升級系統后,導致系統無法正常啟動。這算是個BUG。該功能加上才幾天,就陸續有好幾個同事碰到。本來想著使用方便的,沒想到反而增添了一些麻煩。

????? 這個問題在實現時曾考慮到,發布版本的日志里也加了說明,如果啟用了調試串口,那么在燒錄或者升級系統前,須禁用調試串口。說實在的,確實有點麻煩,不小心就忘了做這個工作。而問題的根源是實現機制不太合理。調試串口的配置被分散在兩處,一處是存儲在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流驱动加载的控制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。