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 桥']