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函数即可。该函数的原型如下:

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

  
  
  函数写完之后,剩下的事情就异常简单了。比如我们需要卸载设备的串口驱动,只要简单地写下这行代码:
  
[cpp]  view plain copy
  1. Unload(TEXT("COM1:"));  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值