SetupApi函数
+ -

Devcon Rescan命令代码实现 使用SetupAPI函数实现设备管理器重新搜索枚举系统子设备

2022-01-27 164 0

在Windows的设备管理器工具栏有一个小电脑的图标,点击后,系统会强制设备管理器树进行更新并重新枚举卸载掉(devcon的remove用法)的设备并安装驱动程序。
这个功能在devcon.exe的源代码中有,其对应的devcon命令为

devcon.exe resan

函数原型:

  • CM_Locate_DevNode_Ex,获取设备根(pDeviceID=NULL)节点的句柄

    CMAPI CONFIGRET WINAPI
    CM_Locate_DevNode_Ex(
      OUT PDEVINST  pdnDevInst,
      IN DEVINSTID  pDeviceID  OPTIONAL,
      IN ULONG  ulFlags,
      IN HMACHINE  hMachine
      );
    
  • CM_Reenumerate_DevNode_Ex,枚举该节点下的所有子设备

    CMAPI CONFIGRET WINAPI
    CM_Reenumerate_DevNode_Ex(
     IN DEVINST  dnDevInst,
     IN ULONG  ulFlags,
     IN HMACHINE  hMachine
     );
    

源代码实现:

int cmdRescan(_In_ LPCTSTR BaseName, _In_opt_ LPCTSTR Machine, _In_ DWORD Flags, _In_ int argc, _In_reads_(argc) PTSTR argv[])
/*++

Routine Description:

    RESCAN
    rescan for new devices

Arguments:

    BaseName  - name of executable
    Machine   - machine name, must be NULL
    argc/argv - remaining parameters

Return Value:

    EXIT_xxxx

--*/
{

    //
    // reenumerate from the root of the devnode tree
    // totally CM based
    //
    int failcode = EXIT_FAIL;
    HMACHINE machineHandle = NULL;
    DEVINST devRoot;

    UNREFERENCED_PARAMETER(BaseName);
    UNREFERENCED_PARAMETER(Flags);
    UNREFERENCED_PARAMETER(argc);
    UNREFERENCED_PARAMETER(argv);

    if(Machine) {
        if(CM_Connect_Machine(Machine,&machineHandle) != CR_SUCCESS) {
            return failcode;
        }
    }

    if(CM_Locate_DevNode_Ex(&devRoot,NULL,CM_LOCATE_DEVNODE_NORMAL,machineHandle) != CR_SUCCESS) {
        goto final;
    }

    FormatToStream(stdout,Machine ? MSG_RESCAN : MSG_RESCAN_LOCAL);

    if(CM_Reenumerate_DevNode_Ex(devRoot, 0, machineHandle) != CR_SUCCESS) {
        goto final;
    }

    FormatToStream(stdout,MSG_RESCAN_OK);

    failcode = EXIT_OK;

final:
    if(machineHandle) {
        CM_Disconnect_Machine(machineHandle);
    }

    return failcode;
}

0 篇笔记 写笔记

WDDM 子设备描述符
子设备的描述信息是能过函数BddDdiQueryDeviceDescriptor实现的。 InitialData.DxgkDdiQueryDeviceDescriptor = BddDdiQueryDeviceDescriptor;严格来说,这个DxgkDdiQueryDev......
WDDM 子设备的枚举过程
这里的子设备指的是显示适配器(display adapter)的子设备。显示适配器子设备的枚举是通过显示端口驱动程序(display port driver), 显示Mini端口驱动程序(display miniport driver), and video present network (Vi......
WDDM 子设备关状态
WDDM中使用来DxgkDdiQueryChildStatus查询子设备的状态 InitialData.DxgkDdiQueryChildStatus = BddDdiQueryChildStatus;和其它的回调函数一样,最终的处理函数其实是BASIC_DIS......
Windows 中“设备管理器”中的错误代码
https://support.microsoft.com/zh-cn/topic/windows-%E4%B8%AD-%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%86%E5%99%A8-%E4%B8%AD%E7%9A%84%E9%94%99%E8%AF%AF%E4%BB%A......
WDDM 枚举子设备
枚举子设备是通过子函数BddDdiQueryChildRelations实现的InitialData.DxgkDdiQueryChildRelations = BddDdiQueryChildRelations;函数原型为:NTSTATUS DxgkddiQueryChild......
Devcon Rescan命令代码实现
在Windows的设备管理器工具栏有一个小电脑的图标,点击后,系统会强制设备管理器树进行更新并重新枚举卸载掉(devcon的remove用法)的设备并安装驱动程序。这个功能在devcon.exe的源代码中有,其对应的devcon命令为devcon.exe resan函数原型:CM_Locate......
获取设备管理器中设备状态SetupDiGetDeviceRegistryProperty
#include#include #include #include #include #include
常见的错误码:10 启动失败22 设备已经被禁用45 设备未在线该错误码定义在:C:Program Files (x86)Windows Kits10Include10.0.18362.0sharedcfg.h详见:#define CM_PROB_NOT_CONFIGUR......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!