获取WinCE已加载驱动的信息

//=====================================================================
//TITLE:
//    WinCE驱动的动态加载
//AUTHOR:
//    norains
//DATE:
//    Monday 22- February-2010
//Environment:
//     WINDOWS CE 5.0
//=====================================================================

    

     WinCE驱动的调试,很多人的第一感觉就是:编写好DLL文件,接着在PB中添加相关注册表信息,然后将DLL文件包含进系统,最后生成系统,下载,调试。如果有误,那么依次按步骤重来。
 
  其实这种繁琐的操作完全可以不必要,因为在WinCE下驱动是可以动态加载和卸载的。
  
  驱动的加载和卸载非常简单,我们只需要如下两个函数:
  

[cpp] view plaincopy
  1. HANDLE ActivateDeviceEx(  
  2.   LPCWSTR lpszDevKey,   
  3.   LPCVOID lpRegEnts,   
  4.   DWORD cRegEnts,   
  5.   LPVOID lpvParam  
  6. );  
  7.   
  8. BOOL DeactivateDevice(  
  9.   HANDLE hDevice  
  10. );  

  
  前者是加载,后者是卸载。
  
  我们首先来看一下加载函数。这函数很简单,lpszDevKey指向的是驱动信息在注册表的位置。比如,我之前文章所提到的虚拟串口的驱动的注册表信息如下:
  
  [HKEY_LOCAL_MACHINE/Drivers/Builtin/VirtualSerial]
      "Prefix"="VSP"
      "Dll"="VirtualSerial.dll"
      "Order"=dword:0
      "Index"=dword:1
      "Map_Port"="COM1:"
  
  那么对于这个信息而言,lpszDevkey的取值为TEXT("Drivers//Builtin//VirtualSerial")。对于系统而言,驱动的Root Key为HKEY_LOCAL_MACHINE,故这里并不需要特别指出。换而言之,驱动的信息只能放置于HKEY_LOCAL_MACHINE,因为我们无法另外指定Root Key。
  
  接下来再看看别的参数。lpRegEnts和cRegEnts是和BUS有关的,但我们接下来的例子并没有用上,所以这里直接可以忽略,直接赋值NULL即可。其实,如果不使用这两个形参的话,我们还可以选择ActivateDevice。
  
  lpvParam指向的是传给驱动XXX_Init函数的形参,如果有特别需求,我们可以通过该指针进行传递。
  
  函数功能很简单。我们写一个功能简单的驱动,来测试该函数是否有效。


  驱动代码如下:  
  

[cpp] view plaincopy
  1. DWORD g_dwParam = 0;  
  2. std::wstring g_strContext;  
  3.   
  4. BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)  
  5. {  
  6.     switch ( dwReason )   
  7.     {  
  8.         case DLL_PROCESS_ATTACH:  
  9.         break;  
  10.     }  
  11.     return TRUE;  
  12. }  
  13.   
  14.   
  15.   
  16. DWORD FKE_Init(  
  17.   LPCTSTR pContext,  
  18.   LPCVOID lpvBusContext  
  19. )  
  20. {  
  21.  printf("FKE_Init !/r/n");  
  22.   
  23.  if(pContext != NULL)  
  24.  {  
  25.   g_strContext = pContext;  
  26.  }  
  27.   
  28.  if(lpvBusContext != NULL)  
  29.  {  
  30.   g_dwParam = *(reinterpret_cast<const DWORD *>(lpvBusContext));  
  31.  }  
  32.  return TRUE;  
  33. }  
  34.   
  35.   
  36. BOOL FKE_Deinit(  
  37.     DWORD dwContext       
  38.     )  
  39. {  
  40.     
  41.  printf("FKE_Deinit !/r/n");  
  42.  return TRUE;  
  43. }  
  44.   
  45. DWORD FKE_Open(  
  46.     DWORD dwData,  
  47.     DWORD dwAccess,  
  48.     DWORD dwShareMode  
  49.     )  
  50. {  
  51.  return TRUE;  
  52. }  
  53.   
  54. BOOL FKE_Close(DWORD dwHandle)  
  55. {  
  56.  return TRUE;  
  57. }  
  58.   
  59.   
  60. BOOL FKE_IOControl(  
  61.     DWORD dwHandle,  
  62.     DWORD dwIoControlCode,  
  63.     PBYTE pBufIn,  
  64.     DWORD dwBufInSize,  
  65.     PBYTE pBufOut,  
  66.     DWORD dwBufOutSize,  
  67.     PDWORD pBytesReturned  
  68.     )  
  69. {   
  70.  return FALSE;  
  71. }  
  72.   
  73. DWORD FKE_Read(DWORD dwHandle, LPVOID pBuffer, DWORD dwNumBytes)  
  74. {  
  75.  std::vector<TCHAR> vtVal(MAX_PATH,0);  
  76.  _stprintf(&vtVal[0],TEXT("Context:%s/r/n Parameter:%d/r/n"),g_strContext.c_str(),g_dwParam);  
  77.   
  78.  int iLen = _tcslen(&vtVal[0]);  
  79.  memcpy(pBuffer,&vtVal[0],iLen * 2);  
  80.    
  81.  return iLen;  
  82. }  
  83.   
  84. DWORD FKE_Write(DWORD dwHandle, LPCVOID pBuffer, DWORD dwNumBytes)  
  85. {  
  86.  return 0;  
  87. }  
  88.   
  89.   
  90. DWORD FKE_Seek(DWORD dwHandle, long lDistance, DWORD dwMoveMethod)  
  91. {  
  92.  return FALSE;  
  93. }  
  94.   
  95. void FKE_PowerUp(void)  
  96. {  
  97.  return;  
  98. }  
  99.   
  100. void FKE_PowerDown(void)  
  101. {  
  102.  return;  
  103. }  
  104.   
  105.     


  代码意思很简单,就是在加载和卸载的时候,分别打印信息。然后还有两个全局变量,一个是g_strContext,用来保存成功加载时的注册表位置;另一个是g_dwParam,用来保存通过ActivateDeviceEx函数传递的第4个形参。而这两个全局变量的数值,之后我们可以通过ReadFile函数获得。只不过FKE_Read函数健壮性不高,没有判断缓冲区是否为空。但作为测试,还是够了。
  
  驱动方面大致如此,我们再来实例看看如何加载驱动。因为驱动的加载涉及到注册表的写入,所以我这里直接采用了CReg类。关于该类的代码,详情可参见:(http://blog.csdn.net/norains/archive/2007/06/20/1659925.aspx)
  
  我们先写注册表信息:  

[cpp] view plaincopy
  1.     #define DEV_KEY TEXT("Drivers//Builtin//FakeDriver")  
  2.   
  3. CReg reg;  
  4. reg.Create(HKEY_LOCAL_MACHINE,DEV_KEY);  
  5. reg.SetDW(TEXT("Order"),0);  
  6. reg.SetDW(TEXT("Index"),1);  
  7. reg.SetSZ(TEXT("Prefix"),TEXT("FKE"));  
  8. reg.SetSZ(TEXT("Dll"),TEXT("//Windows//Driver.dll"));  
  
  
  稍微说一下注册表写入数值的意思。Order是加载的顺序,其实手工加载的话可以无视该字段。Index是打开时的序号,与此相关的还有Prefix,为驱动名。Dll则简单了,则是我们编译好的驱动的存放路径。
  
  接下来就简单多了,我们加载驱动,然后传递一个DWORD的数值作为形参:  
[cpp] view plaincopy
  1. DWORD dwParam = 89;  
  2. HANDLE hd = ActivateDeviceEx(DEV_KEY,NULL,0,&dwParam);  
  3.   
  4. HANDLE hDriver = CreateFile(TEXT("FKE1:"),  
  5.    GENERIC_READ | GENERIC_READ,  
  6.    0,  
  7.    NULL,  
  8.    OPEN_EXISTING,  
  9.    FILE_ATTRIBUTE_NORMAL,  
  10.    NULL);  
  11.   
  12. std::vector<TCHAR> vtBuf(MAX_PATH);  
  13. DWORD dwRead = 0;  
  14. ReadFile(hDriver,&vtBuf[0],vtBuf.size(),&dwRead,NULL);  
  15.   
  16.     CloseHandle(hDriver);  
  17.    


  如果运行这段代码,你则会看到ReadFile之后,vtBuf则会存储到相应的数值。在我的平台上,某次运行时的数值如下:
  
  Context:Driver/Active/37 Parameter:89
  
  最后,就是卸载驱动。这个最简单,直接传递ActivateDeviceEx执行成功后返回的数值即可:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】详解冠状面_水平面_矢状面_窗宽_窗位

在接触人工智能医疗方面时&#xff0c;单是学习算法和代码原理还不够&#xff0c;需要一定的医学影像知识储备。 B超、CT、MR等都算是医疗影像&#xff0c;在现实生活中&#xff0c;从医院检查身体后拿到的胶片是处理过后的二维图像。这些医疗影像其实是三维的。 最常见的图片格…

js+ asp.Net ajax开发163邮箱效果(列表底色、多选拖动等)--checkBox多选

163邮件一个比较爽的功能就是可以通过多选邮件&#xff0c;拖动到左侧的文件夹列表&#xff0c;实现邮件归类的功能关于我对拖动分配的实现将在后文写出这里说说在CheckBox的选择中做得尝试和实现的效果、方法1。点击表格Title实现全选每行这个早有人做了,我这里借鉴一下 一块贴…

【转】医学图像中的窗宽、窗位!!

在CT等医学影像显示领域&#xff0c;我们经常会听到窗宽&#xff08;Window Width,简写WW&#xff09;、窗位&#xff08;Window Level,简写WL&#xff09;的概念&#xff0c;那么到底什么是窗宽、窗位&#xff0c;它们跟医学图像之间的关系又是什么&#xff1f; 先说一下CT值…

【Excel】使用VLOOKUP+IF实现多列条件匹配查询

excel中vlookup函数为精准匹配查找&#xff0c;但此函数局限于单列的精准匹配&#xff0c;如果需求是多列条件进行匹配&#xff0c;怎么通过vlookup函数实现呢&#xff1f; 思路&#xff1a;通过if函数将多列拼成一列再通过vlookup函数进行精准匹配 具体公式为VLOOKUP($F2&…

自己动手写TCC7901的GPIO驱动

// //TITLE: // 自己动手写TCC7901的GPIO驱动 //AUTHOR: // norains //DATE: // Monday 12-July-2010 //Environment: // Windows CE 5.0 TCC7901 // 如果你使用的是WinCE&#xff0c;然后又涉及到GPIO的操作&#xff0c;你会很尴尬地发现&#xff0c;WinCE根本就…

如何处理db2中文不显示

最近安装了db2 7.2一路装下来没有报错&#xff0c;但当打开db2时&#xff0c;不显示中文。郁闷&#xff01;请教了&#xff0c;单位资深专家&#xff0c;解决方法如下&#xff1a;SQLLIB\java\java12\jdk\jre\lib目录下font.properties.zh文件修改filename.\u5b8b\u4f53simsun.…

【转】DELPHI 对DICOM中的窗宽、窗位调整

在写这篇文章前72小时&#xff0c;我的多窗显示组件对于个别大W/C值的16位影像显示还是个问题&#xff0c;也发了帖子到PACS站询问过&#xff0c;更是在Google上猫刨了很久&#xff0c;终归一无所获&#xff0c;今天静下心来&#xff0c;用了2小时反复查看程序处理过程&#xf…

【转】解密Qt安装目录的结构

转自&#xff1a;C语言中文网 强力推荐 网址&#xff1a;http://c.biancheng.net/view/3866.html 了解 Qt 安装目录的结构虽然不是编程必须的&#xff0c;但是它能练就我们的内功&#xff0c;让我们对 Qt 的编程环境了如指掌。Windows 和 Linux 下 Qt 安装目录的结构非常相似…

大话WinCE与WinXP应用程序开发的差异性

// //TITLE: // 大话WinCE与WinXP应用程序开发的差异性 //AUTHOR: // norains //DATE: // Wednesday 21-April-2010 //Environment: // Windows CE 5.0 // Windows XP // "龙生龙&#xff0c;凤生凤&#xff0c;老鼠生的儿子会打洞"&#xff0c;所以无…

WinCE驱动的动态卸载

// //TITLE: // WinCE驱动的动态卸载 //AUTHOR: // norains //DATE: // Wednesday 21-April-2010 //Environment: // Windows CE 5.0 // 在之前的一篇《WinCE驱动的动态加载》(http://blog.csdn.net/norains/archive/2010/02/22/5316923.aspx)中有谈到&#xff0c;…

【转】09.认识一下Qt用到的开发工具

Qt 不是凭空产生的&#xff0c;它是基于现有工具链打造而成的&#xff0c;它所使用的编译器、链接器、调试器等都不是自己的&#xff0c;Qt 官方只是开发了上层工具。下面我们分几个部分讲解 Qt 使用到的工具链。 GNU 工具集 在上个世纪八十年代&#xff0c;计算机都是奢侈品…

冒个泡

好久没有上来了。也没有什么好说的。最近在做基于SVG开发的一个实时监测系统&#xff0c;感觉目前SVG性能还不是太好&#xff0c;客户端CPU不经意间就达到80%以上了。向老板提出辞职&#xff0c;不过老板没有同意&#xff0c;最终协商结果再做三个月&#xff0c;直到新人完全接…

发一个自己写的2440驱动1602的资料(电路+代码)

上个星期把MINI2440板上的富余数据线引了出来&#xff0c;看着以前丢下的1602突然有了想用ARM9驱动它的冲动&#xff0c;于是就开始干了。 代码是从以前刚学C51的时候改的&#xff0c;呵呵&#xff0c;看见以前写的代码真觉得很烂&#xff0c;现在已经整理好了。 虽说有点牛刀…

【转】10.Qt编程涉及的术语和名词

本节我们来介绍一下使用 Qt 编程过程中常用的术语和名字&#xff0c;它们不一定专属于 Qt&#xff0c;在其它的 C/C 开发过程中也会使用到。 Project Project 的中文翻译是“项目”或者“工程”&#xff0c;这里的项目是指为实现某个相对独立功能的程序代码合集&#xff0c;这…

VS2005开发WinCE6.0应用程序 更换SDK后工程的移植

在应用VS2005开发嵌入式应用程序的时候&#xff0c;一旦平台的SDK发生改变&#xff0c;原先的应用程序就打不开了。搞的偶是非常郁闷&#xff0c;一旦添加了或者更改了驱动程序&#xff0c;重新导出平台SDK以后都要重新建工程&#xff0c;再把代码拷贝到新的工程中&#xff0c;…

【转】17.Qt界面布局管理详解

在上一节&#xff0c;通过一个简单的应用程序&#xff0c;分析了 Qt 创建的 GUI 应用程序中各个文件的作用&#xff0c;剖析了可视化设计的UI文件是如何被转换为 C 的类定义&#xff0c;并自动创建界面的。这些是使用 Qt Creator 可视化设计用户界面&#xff0c;并使各个部分融…

SQL Server 清空或删除所有数据库表中的数据

方法一&#xff1a; --生成数据库脚本的方法最快,处理的也最好 sql2000企业管理器 --右键要清理的数据库 --所有任务 --生成SQL脚本 --<常规>里选择"生成全部对象脚本"","在脚本文件中包含说明性标题&quo…

linux mysql移植_linux 下mysql 移植设置方法

环境:db01:10.10.10.101db03:10.10.10.103需求:将db01上mysql做完整移植,迁移到db03详细步骤:1. 打包db01上/app目录并scp到db03上:#tar -cvzf mysql.tar.gz /app/;scp mysql.tar.gz 10.10.10.103:/root/2. copy db01上/etc/ld.so.conf.d/mysql.conf到db03相应目录下,即/etc/ld…

【转】18.Qt信号与槽机制详解

信号&#xff1a;事件 槽&#xff1a;事件处理函数 信号与槽&#xff08;Signal & Slot&#xff09;是 Qt 编程的基础&#xff0c;也是 Qt 的一大创新。因为有了信号与槽的编程机制&#xff0c;在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号&#xff0…

可以买的一本书:3D计算机图形学(原书第3版)

作  者&#xff08;英&#xff09;沃特&#xff08;Watt,A.) ,包宏 译出 版 社机械工业出版社图书定价&#xffe5;69.00 第1章 计算机图形学的数学基础 11.1 处理三维结构 11.1.1 计算机图形学中的三维仿射变换 11.1.2 改变坐标系的变换 61.2 结构变形变换 71.3 向量和计算机…