重新加载驱动的方法

本文介绍了一个用于解决设备冲突问题的代码段,该设备同时支持红外数据传输(IRDA)和外接串口。当启动并测试外接串口时,设备无法正常工作。通过重新加载设备,先解除IRDA的设备句柄,使其失效,从而允许外接串口正常运行。
摘要由CSDN通过智能技术生成

  因一产品的串口上同时接着IRDA和外接串口,默认功能为IRDA。启动之后如果测试外接串口,就不能打开设备端口,所以写了一段代码先Deinit此设备再加载,这样IRDA使用的设备句柄已经无效,IRDA功能不再有效。但外接串口可以使用,代码如下:

pcsDevName为设备名,如果COM2:pcsDevKey为设备的注册表,两者给其一即可。

void ReLoadDevice2Test( TCHAR * pcsDevName, TCHAR * pcsDevKey )
{
 HKEY hKey=NULL;
 TCHAR csKeyName[MAX_PATH];
 TCHAR csDevice[MAX_PATH];
 TCHAR csName[MAX_PATH];
 int i;
 DWORD dwSize=0;
 DWORD dwType;


 for( i=1; i<100;i++ )
 {
  if( i < 10 )
   wsprintf( csKeyName, L"Drivers\\Active\\0%d",i );
  else
   wsprintf( csKeyName, L"Drivers\\Active\\%d",i );

  wprintf( L"trying %s",csKeyName);
  if( ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE,  csKeyName, 0,  0, &hKey ) )
  {
   //NKDbgPrintfW(L"[%s]\r\n",csKeyName);

   dwSize=sizeof(csDevice);
   if( ERROR_SUCCESS != RegQueryValueEx( hKey,  L"Key", NULL, &dwType, (LPBYTE)csDevice, &dwSize) )
    csDevice[0]=0;
    ;
    //NKDbgPrintfW(L"\"Key\"=%s\r\n",csDevice);

   dwSize=sizeof(csDevice);
   if( ERROR_SUCCESS != RegQueryValueEx( hKey,  L"Name", NULL, &dwType, (LPBYTE)csName, &dwSize) )
    csName[0]=0;
    ;
   //NKDbgPrintfW(L"\"Name\"=%s\r\n",csName);

   //NKDbgPrintfW(L"\r\n");
   
   if( pcsDevName  && csName[0] )
   {
    if( !wcscmp( pcsDevName  , csName ) )
    {
     break;
     
    }
   }
   else if( pcsDevKey && csDevice[0] )
   {
    if( !wcscmp( pcsDevKey , csDevice ) )
    {
     break;
    }
   }
   RegCloseKey( hKey );
   hKey=NULL;
  }
 }
 if( hKey )
 {
  //The device is found, read out Hnd and deactivate it.
  DWORD  dwDevHnd;
  dwSize=sizeof(dwDevHnd);
  if( ERROR_SUCCESS == RegQueryValueEx( hKey,  L"Hnd", NULL, &dwType, (LPBYTE)&dwDevHnd, &dwSize) )
  {
   DeactivateDevice( (HANDLE)dwDevHnd );
   
   //Because pcsDevKey maybe NULL, csDevice is used.
   ActivateDevice( csDevice ,NULL  );
  }
  RegCloseKey( hKey );
 }
 else if( pcsDevKey )
 {
  ActivateDevice( pcsDevKey, NULL  );
 }
}

转载于:https://www.cnblogs.com/ceblog/archive/2011/06/05/ReloadDriver.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值