zoukankan      html  css  js  c++  java
  • 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, 00, 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藏私货了,反正我的版本没有.)

  • 相关阅读:
    2021-04-02:给定一个正方形或者长方形矩阵matrix,实现zigzag打印。[[0,1,2],[3,4,5],[6,7,8]]的打印顺序是0,1,3,6,4,2,5,7,8。
    2021-04-01:给定一个正方形矩阵matrix,原地调整成顺时针90度转动的样子。[[a,b,c],[d,e,f],[g,h,i]]变成[[g,d,a],[h,e,b],[i,f,c]]。
    2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v的最长子数组长度。
    2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
    2021-03-29:无序数组arr,子数组-1和1的数量一样多,请问最长子数组的长度是多少?
    04Null和Undefined
    03数据类型
    win10 命令行下 重启虚拟网卡
    JavaScript注释及命名规范
    第一个javascrpt代码
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298673.html
Copyright © 2011-2022 走看看