[Device] Add setupapi SetupDiClassNameFromGuid winproxy

This commit is contained in:
lucasg
2020-04-12 18:55:05 +02:00
committed by hakril
parent e74089cda3
commit 0ee191c981
4 changed files with 103 additions and 10 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ from windows.winobject.device import DeviceManager
def main():
for device_class in DeviceManager.enumerate_active_class():
print("-Class : %s" % (device_class))
print("-[%s] Class %s" % (device_class.guid, device_class.name))
# for device in device_class.devices:
# print(" -Device : %s" % (device.name))
+8
View File
@@ -3158,3 +3158,11 @@ FindCloseParams = ((1, 'hFindFile'),)
CM_Enumerate_ClassesPrototype = WINFUNCTYPE(CR_STATUS, DWORD, POINTER(GUID), DWORD)
CM_Enumerate_ClassesParams = ((1, 'ClassIndex'), (1, 'pGUID'), (1,'Params'),)
SetupDiClassNameFromGuidAPrototype = WINFUNCTYPE(BOOL, POINTER(GUID), LPCSTR, DWORD , POINTER(DWORD))
SetupDiClassNameFromGuidAParams = ((1, 'ClassGuid'),(1, 'ClassName'),(1, 'ClassNameSize'),(1, 'RequiredSize'))
SetupDiClassNameFromGuidWPrototype = WINFUNCTYPE(BOOL, POINTER(GUID), LPCWSTR, DWORD , POINTER(DWORD))
SetupDiClassNameFromGuidWParams = ((1, 'ClassGuid'),(1, 'ClassName'),(1, 'ClassNameSize'),(1, 'RequiredSize'))
+54 -2
View File
@@ -4,6 +4,59 @@ from windows.generated_def import windef
import windows.generated_def as gdef
class DeviceClass(object):
def __init__(self, guid):
self._guid = guid
self._name = None
# self._devices = None
# self._h_devs = None
@property
def name(self):
if not self._name:
self._name = self._get_class_name()
return self._name
@property
def guid(self):
return self._guid
# @property
# def devices(self):
# if not self._devices:
# with OpenDeviceClass(self):
# self._devices = list(do for do in self._get_devices())
# return self._devices
# def _get_devices(self):
# if not self._h_devs:
# return
# device_index = 0
# while True:
# device_data = winproxy.SetupDiEnumDeviceInfo(self._h_devs, device_index)
# if not device_data:
# return # stop iterating
# device_index+=1
# yield DeviceObject.from_device_info(self._h_devs, device_data)
def _get_class_name(self):
return winproxy.SetupDiClassNameFromGuidW(self.guid)
class DeviceManager(object):
@staticmethod
@@ -28,8 +81,7 @@ class DeviceManager(object):
if not class_guid:
return # stop iterating
#yield DeviceClass(class_guid)
yield class_guid
yield DeviceClass(class_guid)
+40 -7
View File
@@ -1,21 +1,54 @@
import ctypes
from ctypes import wintypes
import windows.generated_def as gdef
from ..apiproxy import ApiProxy, NeededParameter, is_implemented
from ..error import succeed_on_zero
from ..error import succeed_on_zero, fail_on_zero
MAX_CLASS_NAME_LEN = 32
class SetupApiProxy(ApiProxy):
APIDLL = "SetupApi"
default_error_check = staticmethod(succeed_on_zero)
# @SetupApiProxy()
# def SetupDiClassNameFromGuidA(Guid):
# return SetupDiClassNameFromGuidA.ctypes_function()
@SetupApiProxy()
def SetupDiClassNameFromGuidA(Guid):
"""
Given a class Guid, return the name associated or raise an Exception
"""
# @SetupApiProxy()
# def SetupDiClassNameFromGuidW(Guid):
# return SetupDiClassNameFromGuidW.ctypes_function()
class_name = ctypes.create_string_buffer(MAX_CLASS_NAME_LEN)
success = SetupDiClassNameFromGuidA.ctypes_function(
ctypes.byref(Guid),
ctypes.cast(ctypes.byref(class_name), wintypes.LPCSTR),
MAX_CLASS_NAME_LEN,
None
)
raw_class_name = bytes(class_name)
return raw_class_name.decode("utf-8").rstrip("\x00")
@SetupApiProxy(error_check=fail_on_zero)
def SetupDiClassNameFromGuidW(Guid):
"""
Given a class Guid, return the name associated or raise an Exception
"""
class_name = ctypes.create_unicode_buffer(MAX_CLASS_NAME_LEN)
success = SetupDiClassNameFromGuidW.ctypes_function(
ctypes.byref(Guid),
ctypes.cast(ctypes.byref(class_name), wintypes.LPCWSTR),
MAX_CLASS_NAME_LEN,
None
)
raw_class_name = bytes(class_name)
return raw_class_name.decode("utf-16-le").rstrip("\x00")
# @SetupApiProxy()
# def SetupDiGetClassDevsA(Guid):