重新加载驱动的方法
2011-06-05 20:55
253 查看
因一产品的串口上同时接着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 );
}
}
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 );
}
}
相关文章推荐
- insmod加载驱动后开机重启后没有驱动的解决方法
- java 几种加载驱动的方法
- 【转】突破安全软件加载驱动的方法
- 解决“Visual Studio 要求设计器使用文件中的第一个类。移动类代码使之成为文件中的第一个类,然后尝试重新加载设计器。”方法
- 关于arm-linux下编译加载ch341串口驱动的方法与问题
- mysql 主主同步故障 重新加载方法
- linux 加载intel S5000VSA RAID卡驱动方法
- python重新加载模块的方法有哪些
- S3C2410上webcam驱动方法(1)--补丁驱动,模块加载
- 重新加载驱动模块的方法
- 手动加载驱动的方法
- Android WebView在屏幕旋转后,不重新加载URL及禁止横屏的方法
- SilverLight中图片不能重新加载的处理方法
- 转 一个wince流驱动动态加载方法
- LINUX驱动学习:加载模块时出现Device or resource busy的解决方法
- Linux系统自带spi驱动加载及应用程序编写方法详解
- window.location.href和window.location.reload()方法在ajax提交后返回页面重新加载时候的区别
- Qt5.7不能加载MySql驱动问题.(需要重新编译驱动)
- LINUX驱动学习:加载模块时出现Device or resource busy的解决方法
- Eclipse不重启Tomcat实现重新加载修改类的方法