如何用程序实现“rescan windows device manager"

        本文主要介绍两种”检测硬件设备“的方法,即”rescan windows device manager“。

一、调Windows DDK的API实现

        先用CM_Locate_DevNode得到设备管理树的根结点,然后用CM_Reenumerate_DevNode以这个根结点为参数刷新它就搞定!在MSDN里面可以查到这两个函数的用法,相关的知识里面也有。(该方法转自点击打开链接,原代码因为版本问题,在我的host编译不过,有小许改动,另外参考msdn:CM_Locate_DevNodeCM_Reenumerate_DevNode)其中,CM——Config Manager。

新建一个默认的win32控制台工程,修改main.cpp如下:

<span style="font-size:14px;">#include "stdafx.h"
#include <windows.h>
#include <cfgmgr32.h>
#pragma comment(lib,"cfgmgr32") 


int main()
{
	DEVINST   devInst;
	CONFIGRET   status;

	//得到设备管理树的根结点 
	status = CM_Locate_DevNode(&devInst, NULL,CM_LOCATE_DEVNODE_NORMAL);
	if (status != CR_SUCCESS)
	{
		printf("CM_Locate_DevNode   failed:   %x\n ", status);
		return   FALSE;
	}

	//刷新 
	status = CM_Reenumerate_DevNode(devInst, CM_REENUMERATE_ASYNCHRONOUS); //CM_REENUMERATE_ASYNCHRONOUS 异步方式可以立即响应
	if (status != CR_SUCCESS)
	{
		printf("CM_Reenumerate_DevNode   failed:   %x\n ", status);
		return   FALSE;
	}

    return 0;
}</span>


说明:

1,需要包含windows.h文件。

2,需要包含cfgmgr32.h文件(Config Manager 32)。

3,需要将cfgmgr32.lib静态加载进来,(#pragma comment(lib,"cfgmgr32") )参考百度百科:点击打开链接

事实上,应用程序调驱动程序的时候,也要“#include <setupapi.h>”和“#pragma comment(lib,"setupapi")”。

4,以上两条主要是包含DDI的库,它需要安装wdk。如果没安装wdk,也可以将cfgmgr32.h、cfgmgr32.lib和cfgmgr32.dll拷贝到你的工程目录下。因为CM_Locate_DevNode和CM_Reenumerate_DevNode被封装在cfgmgr32.dll中。

5,对于CM_Locate_DevNode函数,它的第二个参数表示设备句柄ID,如果为空,则指向根节点。

pDeviceID [in, optional]

A pointer to a NULL-terminated string representing a device instance ID. If this value is NULL, or if it points to a zero-length string, the function retrieves a device instance handle to the device at the root of the device tree.


二、借助devcon.exe

    参考我之前的博文:点击打开链接,在CMD中调用“devcon rescan”即可刷新设备管理器。在此基础上,我们通过一个bat文件封装对devcon的调用,然后再在程序中调用CreateFile打开运行这个bat文件即可。该方法参考博文:点击打开链接,具体步骤如下:

1,下载devcon.exe。该工具在wdk10中自带。

2,新建restart.dat文件,并输入“@devcon rescan”。

3,实现代码如下,同样的,先新建win32工程,修改main.cpp文件如下:

<span style="font-size:14px;">#include "stdafx.h"
#include <windows.h>

int main()
{
	STARTUPINFO si;
	memset(&si, 0, sizeof(STARTUPINFO));
	si.cb = sizeof(si);
	si.dwFlags = STARTF_USESHOWWINDOW;
	PROCESS_INFORMATION pi;
	BOOL res = CreateProcess(L"restart.bat", NULL, NULL, NULL, NULL, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
	if (TRUE == res)
	{
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
		return true;
	}
	else
	{
		return false;
	}
    return 0;
}</span>


注:本文属于windows pnp configuration manager 范畴,可以在MSDN中查看相关文章。另,网友的博客系列文章,是一个很好的smaple:仿91助手的PC与Android手机通讯,共4篇系列文章

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
devcon 绿色文版 DevCon 实用工具是一种命令行实用工具,可以替代设备管理器。使用 DevCon,您可以启用、禁用、重新启动、更新、删除和查询单个设备或一组设备。DevCon 提供与开发人员有关但无法在设备管理器看到的信息。   您可以将 DevCon 用于 Windows 2000 、Windows XP和Windows vista。不能将 Devcon 用于 Microsoft Windows 95、Windows 98、或 Windows Millennium Edition。 devcon.exe [-r] [-m:\\] [] -r if specified will reboot machine after command is complete, if needed. 目标机器名字. 命令(见下面). 传给命令的参数. For help on a specific command, type: devcon.exe help classfilter 允许修改class filters. classes 显示设备安装classes. disable 用指定的硬件名称或者instance ID禁用设备 driverfiles 列出设备安装的驱动文件. drivernodes 显示设备的所有节点的驱动. enable 用指定的硬件名称或者instance ID启用设备. find 用指定的硬件名称或者instance ID查找设备. findall 查找所有硬件设备包括不显示的. help 显示帮助信息. hwids 显示设备硬件ID. install 手动安装设备. listclass 显示所有设备的安装 class. reboot 重启本地机器. remove 用指定的硬件名称或者instance ID删除设备. rescan 从新扫描硬件信息. resources 显示设备使用的硬件资源. restart 用指定的硬件名称或者instance ID重启设备. stack 列出设备的驱动堆栈. status 列出设备的状态. update 手动更新设备驱动. updateNI 不显示用户界面的更新设备状态 SetHwID 添加、删除、编辑硬件ID的顺序. 现在看看例子: devcon -m:\\test find pci\* 如果你开启了test机器上的IPC$的话,就可以列出test上所有知道的PCI设备 devcon -r install %WINDIR%\Inf\Netloop.inf *MSLOOP 安装一个新的Microsoft loopback adaptor实例,如果要重启的话,该命令会自动重启 devcon classes 显示所有知道的安装类。包括未认识的设备如: "USB" 和描述名字如:"Universal Serial Bus controllers". devcon classfilter upper !filter1 !filter2 删除两个指定的classfilter . devcon classfilter lower !badfilter +goodfilter 用"goodfilter"替换"badfilter". devcon driverfiles =ports 列出被ports安装类使用的设备驱动文件 devcon disable *MSLOOP 禁用所有硬件ID结尾有"MSLOOP"的设备 devcon drivernodes @ROOT\PCI_HAL\PNP0A03 列出所有 ROOT\PCI_HAL\PNP0A03的兼容驱动.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值