//=====================================================================
//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)中有谈到,驱动的卸载可以通过调用DeactivateDevice函数。但在那篇文章中,我们传递给DeactivateDevice函数的句柄形参是ActivateDeviceEx函数返回的。如果不是我们主动调用ActivateDeviceEx函数,而是系统自己加载的驱动,我们能不能动态卸载呢?

答案是肯定的。

难点只在于,我们如何获取已加载的驱动句柄。具体点来说,如果我想卸载串口的驱动,并且我也只知道它名为"COM1:",我如何将它转换为句柄?

其实问题并不难,因为微软早就为我们准备好了,我们只要调用FindFirstDevice函数即可。该函数的原型如下:

[cpp] view plaincopy
  1. HANDLE FindFirstDevice(
  2. DeviceSearchType searchType,
  3. LPCVOID pvSearchParam,
  4. PDEVMGR_DEVICE_INFORMATION pdi
  5. );

形参只有三个,很简单。

searchType指示的是pvSearchParam传入的类型,有如下数值可以选择:
     1.DeviceSearchByLegacyName:L"COM*" for all COMx: devices.
     2.DeviceSearchByDeviceName:L"COM*" for all COMx devices. 
     3.DeviceSearchByBusName:L"PCI_0_3*" for PCI_0_3_0, PCI_0_3_1 and so on. 
     4.DeviceSearchByGuid:Pointer to a GUID. 
     5.DeviceSearchByParent:Activation handle value from ActivateDeviceEx.

  简单点来说,如果我们传递给pvSearchParam的是"COM1:",那么searchType取值应该为DeviceSearchByLegacyName;如果是"COM1",则为DeviceSearchByDeviceName。
  
  Pdi是返回数据的存储缓存。这里有一个小细节需要注意,pdi.dwSize在函数调用前必须要设置,否则函数很可能无法执行成功。
  
  还有一点不要搞混,FindFirstDevice返回的句柄不能直接传递给DeactivateDevice函数,因为该句柄是用来给FindNextDevice使用的,和设备无关。而传递给DeactivateDevice函数的句柄,是pbi的hDevice成员。
  
  要点我们理清之后,剩下的函数实现就非常简单了。我们声明一个函数名为Unload,它可以智能判断传入的形参是否带":",进而选择相应的搜索方式。闲话不多说,我们来看看该函数的完整实现:
  

[cpp] view plaincopy
  1. BOOL Unload(const TSTRING &strDev)
  2. {
  3. BOOL bRes = FALSE;
  4. HANDLE hFind = INVALID_HANDLE_VALUE;
  5. __try
  6. {
  7. if(strDev.empty() != FALSE)
  8. {
  9. __leave;
  10. }
  11. //确定搜索的方式
  12. DeviceSearchType searchType;
  13. if(strDev[strDev.size() - 1] == ':')
  14. {
  15. searchType = DeviceSearchByLegacyName;
  16. }
  17. else
  18. {
  19. searchType = DeviceSearchByDeviceName;
  20. }
  21. DEVMGR_DEVICE_INFORMATION devInfo = {0};
  22. devInfo.dwSize = sizeof(devInfo);
  23. //寻找驱动的句柄
  24. hFind = FindFirstDevice(searchType,strDev.c_str(),&devInfo);
  25. if(hFind == INVALID_HANDLE_VALUE)
  26. {
  27. __leave;
  28. }
  29. //卸载驱动
  30. bRes = DeactivateDevice(devInfo.hDevice);
  31. }
  32. __finally
  33. {
  34. FindClose(hFind);
  35. }
  36. return bRes;
  37. }

  
  
  函数写完之后,剩下的事情就异常简单了。比如我们需要卸载设备的串口驱动,只要简单地写下这行代码:
  

[cpp] view plaincopy
  1. Unload(TEXT("COM1:"));

WinCE驱动的动态卸载相关推荐

  1. WinCE驱动的动态加载

    //===================================================================== //TITLE: //    WinCE驱动的动态加载 ...

  2. WinCE驱动编写小结

    原文:: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1334401 1.基础知识: 1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作 ...

  3. WinCE驱动编写小结(转载)

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

  4. WinCE驱动调试助手V2.5

    http://www.cnblogs.com/we-hjb/archive/2008/12/15/1280822.html http://blog.chinaunix.net/u1/49088/sho ...

  5. Windows CE下流驱动的动态加载

    Windows CE下流驱动的动态加载 闲话少说,进入正题.查找EVC的帮助,发现函数ActivateDevice()可用来加载驱动程序.而这个函数的使用是相当简单的.我就不多说了,贴上一段帮助最能说 ...

  6. 请wince驱动调试助手的作者sunrain_hjb以及wince开发者进来看看

    作者:gooogleman(www.gooogleman.com站长) 时间:2011-05-09 09:43:54 嘿嘿,也有一阵子没有来这里了,即使来了也瞄一眼就走了,时间改变了太多事情了.    ...

  7. 【转】WinCE驱动开发问题精华集锦

    [转]WinCE驱动开发问题精华集锦 WinCE驱动开发问题精华集锦  如何让系统加载自己写的驱动程序?    两种办法:  1.在[HKEY_LOCAL_MACHINE\Drivers\BuiltI ...

  8. WinCE驱动开发问题精华集锦 [转]

    WinCE驱动开发问题精华集锦 [转] 原文  http://blog.mcuol.com/User/basicygp/Article/4340_1.htm 在mediaplayer全屏播放的时候,我 ...

  9. 我的第一个WinCE驱动--流式驱动【转】

    我的第一个WinCE驱动--流式驱动[转] 2008-10-29 14:00 转做WinCE驱动已经有两个月了,却没有做过一个真正的WinCE平台下的驱动,心里都有些急了,很想尝试下,好尽快融入Win ...

最新文章

  1. Windows下更改mysql data目录
  2. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
  3. C++11模版元编程的应用
  4. P3980-[NOI2008]志愿者招募【费用流】
  5. 桂林理工计算机与科学技术,桂林理工大学信息科学与工程学院
  6. 素数五个为一行的_对标交流 ▏潍坊市心理咨询师协会名誉理事长、潍坊医学院王力教授一行到昌邑市妇幼保健院指导交流工作...
  7. HDU2032 杨辉三角【入门+趣味程序】
  8. python批量打印mathcad_Print Conducto全能批量打印工具
  9. 深入搜索引擎的关键——索引
  10. android 调用百度地图,高德地图第三方APP进行导航
  11. WebService学习总结(6)——WebService常用接口
  12. 零基础入门学习的UG模具设计技巧
  13. 分享一个数据库在线文档系统
  14. 在Hive中使用过的函数记录(百分比、截取字符串、分组TOP N、日期转换、日期是第几周)
  15. zigbee应用实践
  16. 百度街景瓦片下载器1.1.5
  17. 新手必看!纯干货!模具设计ug开启刀具半径补偿2种方法
  18. 用华为手机现在还不知道这5种实用功能,几千块白花了,太浪费了
  19. 三分搜索--hdu2241 考研路茫茫——早起看书
  20. html是什么1003无标题,爱特漫画1003无标题

热门文章

  1. R语言安装;Rstudio安装
  2. 花旗linux 内核 如何调试,揭秘首个运行在Linux平台的核心银行系统
  3. 【Git、GitHub、GitLab】五 git中裸仓库.git下的内容
  4. 坏掉的项链Broken Necklace
  5. 【SP26073】DIVCNT1 - Counting Divisors 题解
  6. SSM项目中整合WebService
  7. 浅谈高斯消元的实现和简单应用
  8. extern、static
  9. Date Picker控件:
  10. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]48.TPM的目的和使用方法