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)中有谈到,驱动的卸载可以通过调用DeactivateDevice函数。但在那篇文章中,我们传递给DeactivateDevice函数的句柄形参是ActivateDeviceEx函数返回的。如果不是我们主动调用ActivateDeviceEx函数,而是系统自己加载的驱动,我们能不能动态卸载呢?
答案是肯定的。
难点只在于,我们如何获取已加载的驱动句柄。具体点来说,如果我想卸载串口的驱动,并且我也只知道它名为"COM1:",我如何将它转换为句柄?
其实问题并不难,因为微软早就为我们准备好了,我们只要调用FindFirstDevice函数即可。该函数的原型如下:
- HANDLE FindFirstDevice(
- DeviceSearchType searchType,
- LPCVOID pvSearchParam,
- PDEVMGR_DEVICE_INFORMATION pdi
- );
形参只有三个,很简单。
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,它可以智能判断传入的形参是否带":",进而选择相应的搜索方式。闲话不多说,我们来看看该函数的完整实现:
- BOOL Unload(const TSTRING &strDev)
- {
- BOOL bRes = FALSE;
- HANDLE hFind = INVALID_HANDLE_VALUE;
- __try
- {
- if(strDev.empty() != FALSE)
- {
- __leave;
- }
- //确定搜索的方式
- DeviceSearchType searchType;
- if(strDev[strDev.size() - 1] == ':')
- {
- searchType = DeviceSearchByLegacyName;
- }
- else
- {
- searchType = DeviceSearchByDeviceName;
- }
- DEVMGR_DEVICE_INFORMATION devInfo = {0};
- devInfo.dwSize = sizeof(devInfo);
- //寻找驱动的句柄
- hFind = FindFirstDevice(searchType,strDev.c_str(),&devInfo);
- if(hFind == INVALID_HANDLE_VALUE)
- {
- __leave;
- }
- //卸载驱动
- bRes = DeactivateDevice(devInfo.hDevice);
- }
- __finally
- {
- FindClose(hFind);
- }
- return bRes;
- }
函数写完之后,剩下的事情就异常简单了。比如我们需要卸载设备的串口驱动,只要简单地写下这行代码:
- Unload(TEXT("COM1:"));
WinCE驱动的动态卸载相关推荐
- WinCE驱动的动态加载
//===================================================================== //TITLE: // WinCE驱动的动态加载 ...
- WinCE驱动编写小结
原文:: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1334401 1.基础知识: 1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作 ...
- WinCE驱动编写小结(转载)
1.基础知识: 1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件细节,在应用程序看来硬件只是一个设备文件,应用程序可以像 ...
- WinCE驱动调试助手V2.5
http://www.cnblogs.com/we-hjb/archive/2008/12/15/1280822.html http://blog.chinaunix.net/u1/49088/sho ...
- Windows CE下流驱动的动态加载
Windows CE下流驱动的动态加载 闲话少说,进入正题.查找EVC的帮助,发现函数ActivateDevice()可用来加载驱动程序.而这个函数的使用是相当简单的.我就不多说了,贴上一段帮助最能说 ...
- 请wince驱动调试助手的作者sunrain_hjb以及wince开发者进来看看
作者:gooogleman(www.gooogleman.com站长) 时间:2011-05-09 09:43:54 嘿嘿,也有一阵子没有来这里了,即使来了也瞄一眼就走了,时间改变了太多事情了. ...
- 【转】WinCE驱动开发问题精华集锦
[转]WinCE驱动开发问题精华集锦 WinCE驱动开发问题精华集锦 如何让系统加载自己写的驱动程序? 两种办法: 1.在[HKEY_LOCAL_MACHINE\Drivers\BuiltI ...
- WinCE驱动开发问题精华集锦 [转]
WinCE驱动开发问题精华集锦 [转] 原文 http://blog.mcuol.com/User/basicygp/Article/4340_1.htm 在mediaplayer全屏播放的时候,我 ...
- 我的第一个WinCE驱动--流式驱动【转】
我的第一个WinCE驱动--流式驱动[转] 2008-10-29 14:00 转做WinCE驱动已经有两个月了,却没有做过一个真正的WinCE平台下的驱动,心里都有些急了,很想尝试下,好尽快融入Win ...
最新文章
- Windows下更改mysql data目录
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
- C++11模版元编程的应用
- P3980-[NOI2008]志愿者招募【费用流】
- 桂林理工计算机与科学技术,桂林理工大学信息科学与工程学院
- 素数五个为一行的_对标交流 ▏潍坊市心理咨询师协会名誉理事长、潍坊医学院王力教授一行到昌邑市妇幼保健院指导交流工作...
- HDU2032 杨辉三角【入门+趣味程序】
- python批量打印mathcad_Print Conducto全能批量打印工具
- 深入搜索引擎的关键——索引
- android 调用百度地图,高德地图第三方APP进行导航
- WebService学习总结(6)——WebService常用接口
- 零基础入门学习的UG模具设计技巧
- 分享一个数据库在线文档系统
- 在Hive中使用过的函数记录(百分比、截取字符串、分组TOP N、日期转换、日期是第几周)
- zigbee应用实践
- 百度街景瓦片下载器1.1.5
- 新手必看!纯干货!模具设计ug开启刀具半径补偿2种方法
- 用华为手机现在还不知道这5种实用功能,几千块白花了,太浪费了
- 三分搜索--hdu2241 考研路茫茫——早起看书
- html是什么1003无标题,爱特漫画1003无标题
热门文章
- R语言安装;Rstudio安装
- 花旗linux 内核 如何调试,揭秘首个运行在Linux平台的核心银行系统
- 【Git、GitHub、GitLab】五 git中裸仓库.git下的内容
- 坏掉的项链Broken Necklace
- 【SP26073】DIVCNT1 - Counting Divisors 题解
- SSM项目中整合WebService
- 浅谈高斯消元的实现和简单应用
- extern、static
- Date Picker控件:
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]48.TPM的目的和使用方法