这里通过友好名称/设备描述符查询。
代码如下
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)