前段时间整理了《 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流驱动加载的控制相关推荐

  1. U盘加载硬盘控制卡驱动安装Windows 2003 指南

    U盘加载硬盘控制卡驱动安装Windows 2003 指南 http://www.dell.com/Support/Article/cn/zh/cnbsd1/SLN263067 posted on 20 ...

  2. 服务器怎么用u盘加载硬盘驱动,戴尔服务器安装用U盘加载硬盘控制卡驱动.pdf

    戴尔服务器安装用U盘加载硬盘控制卡驱动 支持9G,10G,11G 安装windows2003,并且2003 最好带SP2 补丁,不然可能出现蓝屏死机等现象.8G 暂时没有测 试. 使用该软件后,U 盘 ...

  3. WinCE流驱动基础知识小结

    WinCE流驱动基础知识小结 1.基础知识: 1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件细节,在应用程序看来硬件只 ...

  4. WinCE 流驱动一步一步来(理论基础)

    WinCE 流驱动一步一步来(理论基础) 在WinCE.net中,最简单的一个驱动程序莫过于一个内置(Built-in)设备的流接口驱动.对于一个不支持热拔插的设备,最快捷的方法就是为其实现一个内置的 ...

  5. JDBC中驱动加载的过程分析

    JDBC中驱动加载的过程分析 作者:kenty  来源:博客园  发布时间:2007-08-20 15:01  阅读:1100 次  原文链接   [收藏]    本篇从java.sql.Driver ...

  6. linux设备和驱动加载的先后顺序

    点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  7. USB 3G驱动和USB HOST驱动加载

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  8. 木马核心技术剖析读书笔记之木马驱动加载与启动

    Windows 系统启动过程 基于 UEFI 的启动过程 UEFI 固件接口可以实现 BIOS 固件接口类似的功能,逐步成为主流的固件接口之一.它主要提供一组在操作系统启动之前在所有平台上一致的服务, ...

  9. 征途2无法显示服务器列表,解决win10系统玩征途2提示“DriverCommlnit驱动加载失败”的方法...

    征途2是一款众所周知的角色扮演类游戏,它在玩法上延续了征途1的总体风格,但是在画面和音效上比征途1的要提高了很多,其独特的玩法吸引了众多的玩家.但是又部分用户反映,在win10系统上运行征途2的游戏时 ...

最新文章

  1. 2、ESXI安装出错
  2. python待遇如何-老男孩学Python后就业如何?Python待遇高吗?
  3. GPU(CUDA)学习日记(十三)------ CUDA内存简介
  4. 8086中断系统——《x86汇编语言:从实模式到保护模式》读书笔记04
  5. python opencv实现目标区域裁剪
  6. 通过MULE集成服务的几种方式
  7. LeetCode Find the Duplicate Number 找重复出现的数(技巧)
  8. flash cs3 代码提示 应该加强
  9. Oracle表空间的查询与创建
  10. RT-Thread I/O设备模型
  11. bugku 杂项 就五层你能解开吗_长春老旧小区加装电梯,你家符合条件吗?_媒体_澎湃新闻...
  12. Java啤酒生产系统描述_Java描述设计模式(03):工厂方法模式
  13. Kali Linux渗透测试实战 1.3 渗透测试的一般化流程
  14. linux 五笔输入法下载软件,极点五笔Linux版|极点五笔输入法官方linux版_最火软件站...
  15. sterm机器人编程_STEAM智能编程机器人
  16. 利用picasa2简单制作超炫壁画
  17. Socket 简介及面试题
  18. 大学生职业生涯规划书性格特征_大学生职业生涯规划书自我分析范文
  19. Vulkan编程指南翻译 第六章 着色器和管线 第2节 SPIR-V 概述
  20. 计算机专业群名有内涵,有内涵高大上的群名

热门文章

  1. 005_MySQL数据类型
  2. android 日历下面备注,怎样在日历的下面加备注?
  3. fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...
  4. ERC721关于NFT的学习和理解
  5. 2020计算机考研初试考试先后顺序,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  6. java中有ClockPane类吗,JavaFX实现简易时钟效果(二)
  7. 使用python下载文件_详解使用Python下载文件的几种方法
  8. 图标适配大小_主题真的是大吃一鲸适配全EMUI
  9. Docker容器私有仓库——Harbor私有仓库的搭建
  10. Python基础数据类型之set集合