查询设备管理器的外部接口

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
FIND = 1


def get_dev_prop(devInst, prop, mz=False):
    buf = (c_wchar * 1024)()
    bLength = c_int(1024)
    cr = cfg.CM_Get_DevNode_Registry_PropertyW(devInst, prop, NULL, buf, byref(bLength), 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 enum_child_and_subliming(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_subliming(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_subliming(devChild.value, name_list)


def get_device_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 False

    for child in dev_inst_list:
        enum_child_and_subliming(child, dev_name_list)

    return dev_name_list


deviceNames = ["PCI 到 PCI 桥", "卷"]
devList = get_device_list()
findDeviceList = []
for name in devList:
    for findDeviceName in deviceNames:
        if findDeviceName in name:
            findDeviceList.append(name)

if len(findDeviceList) > 0:
    print("find devices:" + str(findDeviceList))
else:
    print("find no device!")


输出结果:find devices:['卷管理器', '卷', '卷', '卷', 'PCI 到 PCI 桥', 'PCI 到 PCI 桥', 'PCI 到 PCI 桥']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值