天天看點

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,裝置管理器就不會加載該驅動。

      通過以上方法的改進,調試序列槽的動态複用就更友善了。