Python 查询设备管理器设备(cfgmgr32)

这里通过友好名称/设备描述符查询。

代码如下

 

from ctypes import *
cfg = windll.cfgmgr32
adv = windll.Advapi32

CM_DRP_DEVICEDESC     =   0x00000001 
CM_DRP_HARDWAREID     =   0x00000002 
CM_DRP_COMPATIBLEIDS  =   0x00000003 
CM_DRP_UNUSED0        =   0x00000004 
CM_DRP_SERVICE        =   0x00000005 
CM_DRP_CLASS          =   0x00000008 
CM_DRP_CLASSGUID      =   0x00000009 
CM_DRP_DRIVER         =   0x0000000A 
CM_DRP_CONFIGFLAGS    =   0x0000000B 
CM_DRP_MFG            =   0x0000000C 
CM_DRP_FRIENDLYNAME   =   0x0000000D 

NULL = 0

def get_dev_prop(devInst, prop, mz = False):
    buf = (c_wchar*1024)()
    blen = c_int(1024)
    cr = cfg.CM_Get_DevNode_Registry_PropertyW(devInst, prop, NULL, buf, byref(blen), 0)
    if cr == 0:
        if not mz:
            return buf.value
        else:
            s = buf[:]
            s = s[:s.find('\x00\x00')]
            s = s.replace("\x00", "\n")
            return s
    else:
        return ""


def get_dev_desc(devInst):
    return get_dev_prop(devInst, CM_DRP_DEVICEDESC)

def get_dev_hwId(devInst):
    return get_dev_prop(devInst, CM_DRP_HARDWAREID)

def get_dev_name(devInst):
    return get_dev_prop(devInst, CM_DRP_FRIENDLYNAME)


def is_device_exist(dev_name):
    def enum_child_and_subling(devInst, name_list):
        devParent = c_int(devInst)
        devChild = c_int(0)
        devNextChild = c_int(0)
        if cfg.CM_Get_Child(byref(devChild), devParent, 0) == 0:
            str_friendly_name = get_dev_name(devChild.value)
            str_description = get_dev_desc(devChild.value)
            
            if "" != str_friendly_name:
                #print("friendly_name : " + str_friendly_name)
                name_list.append(str_friendly_name)
            elif "" != str_description:
                #print("description : " + str_description)
                name_list.append(str_description)
            
            enum_child_and_subling(devChild.value, name_list)
            while cfg.CM_Get_Sibling(byref(devNextChild), devChild, 0) == 0:
                devChild.value = devNextChild.value
                str_friendly_name = get_dev_name(devChild.value)
                str_description = get_dev_desc(devChild.value)
            
                if "" != str_friendly_name:
                    #print("friendly_name : " + str_friendly_name)
                    name_list.append(str_friendly_name)
                elif "" != str_description:
                    #print("description : " + str_description)
                    name_list.append(str_description)
                enum_child_and_subling(devChild.value, name_list)


    devInst = c_int(0)
    devInstNext = c_int(0)
    dev_inst_list = []
    dev_name_list = []

    if 0 == cfg.CM_Locate_DevNodeW(byref(devInst), 0, 0):
        dev_inst_list.append(devInst.value)
        while 0 == cfg.CM_Get_Sibling(byref(devInstNext), devInst, 0):
            devInst.value = devInstNext.value
            dev_inst_list.append(devInst.value)
    else:
        return 0
            
    for child in dev_inst_list:
        dev_child(child,dev_name_list)
    
    for name in dev_name_list:
        #print(name)
        if name == dev_name:
            return 1
            
    return 0
    
    
device_name = "EM120R-GL"
if 1 == is_device_exist(device_name):
    print("find device named : " + device_name)
else:
    print("find no device named : " + device_name)

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
禁用设备管理器中的显卡设备需要管理员权限,因此需要先获取管理员权限。以下是一个禁用显卡设备的示例代码: ```c++ #include <Windows.h> #include <cfgmgr32.h> int main() { // 获取管理员权限 if (!IsUserAnAdmin()) { ShellExecute(NULL, "runas", __FILE__, NULL, NULL, SW_SHOWNORMAL); return 0; } // 枚举设备 CONFIGRET cr = CR_SUCCESS; ULONG ulSize = 0; cr = CM_Get_Device_ID_List_Size(&ulSize, NULL, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); if (cr != CR_SUCCESS) { return 1; } PWSTR pszBuffer = new WCHAR[ulSize]; ZeroMemory(pszBuffer, ulSize * sizeof(WCHAR)); cr = CM_Get_Device_ID_List(NULL, pszBuffer, ulSize, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); if (cr != CR_SUCCESS) { delete[] pszBuffer; return 1; } // 禁用显卡设备 ULONG ulLength = wcslen(pszBuffer); for (ULONG i = 0; i < ulLength; i += wcslen(pszBuffer + i) + 1) { DEVINST devInst; cr = CM_Locate_DevNode(&devInst, pszBuffer + i, CM_LOCATE_DEVNODE_NORMAL); if (cr == CR_SUCCESS) { ULONG ulStatus = 0; ULONG ulProblemNumber = 0; cr = CM_Get_DevNode_Status(&ulStatus, &ulProblemNumber, devInst, 0); if (cr == CR_SUCCESS && (ulStatus & DN_HAS_PROBLEM) == 0) { cr = CM_Disable_DevNode(devInst, CM_DISABLE_POLITE); if (cr == CR_SUCCESS) { printf("Device %ws is disabled.\n", pszBuffer + i); } else { printf("Failed to disable device %ws.\n", pszBuffer + i); } } } } delete[] pszBuffer; return 0; } ``` 该代码首先获取管理员权限,然后枚举设备列表,对于每个设备,如果它没有故障,就禁用它。禁用设备需要使用 `CM_Disable_DevNode` 函数,第二个参数可以指定禁用方式,这里使用的是 `CM_DISABLE_POLITE`,表示要先关闭设备上已打开的所有句柄,然后再禁用设备

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值