[Device] Add cfgmgr.CM_Enumerate_Classes winproxy

This commit is contained in:
lucasg
2020-04-12 18:29:31 +02:00
committed by hakril
parent ef580c675f
commit e74089cda3
8 changed files with 216 additions and 4 deletions
+18
View File
@@ -0,0 +1,18 @@
import windows
from windows.winobject.device import DeviceManager
def main():
for device_class in DeviceManager.enumerate_active_class():
print("-Class : %s" % (device_class))
# for device in device_class.devices:
# print(" -Device : %s" % (device.name))
# for resource in device.resources:
# print(' -%s : [0x%08x - 0x%08x] (0x%04x)' % (resource.type, resource.start, resource.end, resource.flags))
if __name__ == '__main__':
main()
+64
View File
@@ -2199,3 +2199,67 @@ SPC_MINIMAL_CRITERIA_OBJID = make_flag("SPC_MINIMAL_CRITERIA_OBJID", "1.3.6.1.4.
SPC_FINANCIAL_CRITERIA_OBJID = make_flag("SPC_FINANCIAL_CRITERIA_OBJID", "1.3.6.1.4.1.311.2.1.27")
SPC_LINK_OBJID = make_flag("SPC_LINK_OBJID", "1.3.6.1.4.1.311.2.1.28")
SPC_SIGINFO_OBJID = make_flag("SPC_SIGINFO_OBJID", "1.3.6.1.4.1.311.2.1.30")
CR_SUCCESS = make_flag('CR_SUCCESS' , 0x00000000)
CR_DEFAULT = make_flag('CR_DEFAULT' , 0x00000001)
CR_OUT_OF_MEMORY = make_flag('CR_OUT_OF_MEMORY' , 0x00000002)
CR_INVALID_POINTER = make_flag('CR_INVALID_POINTER' , 0x00000003)
CR_INVALID_FLAG = make_flag('CR_INVALID_FLAG' , 0x00000004)
CR_INVALID_DEVNODE = make_flag('CR_INVALID_DEVNODE' , 0x00000005)
CR_INVALID_DEVINST = make_flag('CR_INVALID_DEVINST' , CR_INVALID_DEVNODE)
CR_INVALID_RES_DES = make_flag('CR_INVALID_RES_DES' , 0x00000006)
CR_INVALID_LOG_CONF = make_flag('CR_INVALID_LOG_CONF' , 0x00000007)
CR_INVALID_ARBITRATOR = make_flag('CR_INVALID_ARBITRATOR' , 0x00000008)
CR_INVALID_NODELIST = make_flag('CR_INVALID_NODELIST' , 0x00000009)
CR_DEVNODE_HAS_REQS = make_flag('CR_DEVNODE_HAS_REQS' , 0x0000000A)
CR_DEVINST_HAS_REQS = make_flag('CR_DEVINST_HAS_REQS' , CR_DEVNODE_HAS_REQS)
CR_INVALID_RESOURCEID = make_flag('CR_INVALID_RESOURCEID' , 0x0000000B)
CR_DLVXD_NOT_FOUND = make_flag('CR_DLVXD_NOT_FOUND' , 0x0000000C)
CR_NO_SUCH_DEVNODE = make_flag('CR_NO_SUCH_DEVNODE' , 0x0000000D)
CR_NO_SUCH_DEVINST = make_flag('CR_NO_SUCH_DEVINST' , CR_NO_SUCH_DEVNODE)
CR_NO_MORE_LOG_CONF = make_flag('CR_NO_MORE_LOG_CONF' , 0x0000000E)
CR_NO_MORE_RES_DES = make_flag('CR_NO_MORE_RES_DES' , 0x0000000F)
CR_ALREADY_SUCH_DEVNODE = make_flag('CR_ALREADY_SUCH_DEVNODE' , 0x00000010)
CR_ALREADY_SUCH_DEVINST = make_flag('CR_ALREADY_SUCH_DEVINST' , CR_ALREADY_SUCH_DEVNODE)
CR_INVALID_RANGE_LIST = make_flag('CR_INVALID_RANGE_LIST' , 0x00000011)
CR_INVALID_RANGE = make_flag('CR_INVALID_RANGE' , 0x00000012)
CR_FAILURE = make_flag('CR_FAILURE' , 0x00000013)
CR_NO_SUCH_LOGICAL_DEV = make_flag('CR_NO_SUCH_LOGICAL_DEV' , 0x00000014)
CR_CREATE_BLOCKED = make_flag('CR_CREATE_BLOCKED' , 0x00000015)
CR_NOT_SYSTEM_VM = make_flag('CR_NOT_SYSTEM_VM' , 0x00000016)
CR_REMOVE_VETOED = make_flag('CR_REMOVE_VETOED' , 0x00000017)
CR_APM_VETOED = make_flag('CR_APM_VETOED' , 0x00000018)
CR_INVALID_LOAD_TYPE = make_flag('CR_INVALID_LOAD_TYPE' , 0x00000019)
CR_BUFFER_SMALL = make_flag('CR_BUFFER_SMALL' , 0x0000001A)
CR_NO_ARBITRATOR = make_flag('CR_NO_ARBITRATOR' , 0x0000001B)
CR_NO_REGISTRY_HANDLE = make_flag('CR_NO_REGISTRY_HANDLE' , 0x0000001C)
CR_REGISTRY_ERROR = make_flag('CR_REGISTRY_ERROR' , 0x0000001D)
CR_INVALID_DEVICE_ID = make_flag('CR_INVALID_DEVICE_ID' , 0x0000001E)
CR_INVALID_DATA = make_flag('CR_INVALID_DATA' , 0x0000001F)
CR_INVALID_API = make_flag('CR_INVALID_API' , 0x00000020)
CR_DEVLOADER_NOT_READY = make_flag('CR_DEVLOADER_NOT_READY' , 0x00000021)
CR_NEED_RESTART = make_flag('CR_NEED_RESTART' , 0x00000022)
CR_NO_MORE_HW_PROFILES = make_flag('CR_NO_MORE_HW_PROFILES' , 0x00000023)
CR_DEVICE_NOT_THERE = make_flag('CR_DEVICE_NOT_THERE' , 0x00000024)
CR_NO_SUCH_VALUE = make_flag('CR_NO_SUCH_VALUE' , 0x00000025)
CR_WRONG_TYPE = make_flag('CR_WRONG_TYPE' , 0x00000026)
CR_INVALID_PRIORITY = make_flag('CR_INVALID_PRIORITY' , 0x00000027)
CR_NOT_DISABLEABLE = make_flag('CR_NOT_DISABLEABLE' , 0x00000028)
CR_FREE_RESOURCES = make_flag('CR_FREE_RESOURCES' , 0x00000029)
CR_QUERY_VETOED = make_flag('CR_QUERY_VETOED' , 0x0000002A)
CR_CANT_SHARE_IRQ = make_flag('CR_CANT_SHARE_IRQ' , 0x0000002B)
CR_NO_DEPENDENT = make_flag('CR_NO_DEPENDENT' , 0x0000002C)
CR_SAME_RESOURCES = make_flag('CR_SAME_RESOURCES' , 0x0000002D)
CR_NO_SUCH_REGISTRY_KEY = make_flag('CR_NO_SUCH_REGISTRY_KEY' , 0x0000002E)
CR_INVALID_MACHINENAME = make_flag('CR_INVALID_MACHINENAME' , 0x0000002F)
CR_REMOTE_COMM_FAILURE = make_flag('CR_REMOTE_COMM_FAILURE' , 0x00000030)
CR_MACHINE_UNAVAILABLE = make_flag('CR_MACHINE_UNAVAILABLE' , 0x00000031)
CR_NO_CM_SERVICES = make_flag('CR_NO_CM_SERVICES' , 0x00000032)
CR_ACCESS_DENIED = make_flag('CR_ACCESS_DENIED' , 0x00000033)
CR_CALL_NOT_IMPLEMENTED = make_flag('CR_CALL_NOT_IMPLEMENTED' , 0x00000034)
CR_INVALID_PROPERTY = make_flag('CR_INVALID_PROPERTY' , 0x00000035)
CR_DEVICE_INTERFACE_ACTI = make_flag('CR_DEVICE_INTERFACE_ACTIVE', 0x00000036)
CR_NO_SUCH_DEVICE_INTERF = make_flag('CR_NO_SUCH_DEVICE_INTERFACE', 0x00000037)
CR_INVALID_REFERENCE_STR = make_flag('CR_INVALID_REFERENCE_STRING', 0x00000038)
CR_INVALID_CONFLICT_LIST = make_flag('CR_INVALID_CONFLICT_LIST' , 0x00000039)
CR_INVALID_INDEX = make_flag('CR_INVALID_INDEX' , 0x0000003A)
CR_INVALID_STRUCTURE_SIZ = make_flag('CR_INVALID_STRUCTURE_SIZE', 0x0000003B)
+3
View File
@@ -3155,3 +3155,6 @@ FindNextFileWParams = ((1, 'hFindFile'), (1, 'lpFindFileData'))
FindClosePrototype = WINFUNCTYPE(BOOL, HANDLE)
FindCloseParams = ((1, 'hFindFile'),)
CM_Enumerate_ClassesPrototype = WINFUNCTYPE(CR_STATUS, DWORD, POINTER(GUID), DWORD)
CM_Enumerate_ClassesParams = ((1, 'ClassIndex'), (1, 'pGUID'), (1,'Params'),)
+1
View File
@@ -165,6 +165,7 @@ SIZE_T = c_size_t
PSIZE_T = POINTER(SIZE_T)
PVOID = c_void_p
NTSTATUS = DWORD
CR_STATUS = DWORD
TDHSTATUS = ULONG
DNS_STATUS = ULONG
LSTATUS = LONG#Registryfunctionsreturnvalue|typedef_Return_type_success_(return==ERROR_SUCCESS)LONGLSTATUS;
+36
View File
@@ -0,0 +1,36 @@
import windows
from windows import winproxy
from windows.generated_def import windef
import windows.generated_def as gdef
class DeviceManager(object):
@staticmethod
def enumerate_active_class():
return list(DeviceManager.enumerate_class())
# return list(filter(lambda dc: len(dc.devices) > 0, DeviceManager.enumerate_class()))
@staticmethod
def enumerate_class():
def _gen_all_class_guid():
"""
Return every registered device classes in the system, generator-style
"""
class_index = 0
while True:
class_guid = winproxy.CM_Enumerate_Classes(class_index, 0)
class_index+=1
if not class_guid:
return # stop iterating
#yield DeviceClass(class_guid)
yield class_guid
return (dc for dc in _gen_all_class_guid())
+6 -4
View File
@@ -1,7 +1,9 @@
from .advapi32 import *
from .cfgmgr32 import *
from .crypt32 import *
from .cryptui import *
from .dbghelp import *
from .dnsapi import *
from .iphlpapi import *
from .kernel32 import *
from .ktmw32 import *
@@ -9,12 +11,12 @@ from .ntdll import *
from .ole32 import *
from .oleacc import *
from .psapi import *
from .setupapi import *
from .shell32 import *
from .shlwapi import *
from .tdh import *
from .user32 import *
from .version import *
from .virtdisk import *
from .wevtapi import *
from .wintrust import *
from .tdh import *
from .dnsapi import *
from .virtdisk import *
from .wintrust import *
+48
View File
@@ -0,0 +1,48 @@
import ctypes
import windows.generated_def as gdef
from ..apiproxy import ApiProxy, NeededParameter, is_implemented
from ..error import succeed_on_zero, no_error_check
class CfgMgr32Proxy(ApiProxy):
APIDLL = "CfgMgr32"
default_error_check = staticmethod(succeed_on_zero)
# We suppress error checks since CM_Enumerate_Classes return either :
# - CR_SUCCESS on success
# - usually CR_NO_SUCH_VALUE on an invalid class index
@CfgMgr32Proxy(error_check=no_error_check)
def CM_Enumerate_Classes(ClassIndex, Params):
"""
Given a class index, either return the class GUID or None.
"""
guid = gdef.GUID()
cr_status = CM_Enumerate_Classes.ctypes_function(ClassIndex, ctypes.byref(guid), Params)
if cr_status != gdef.CR_SUCCESS:
return None
return guid
# @CfgMgr32Proxy()
# def CM_Get_First_Log_Conf(hDevInst):
# return CM_Get_First_Log_Conf.ctypes_function(hDevInst)
# @CfgMgr32Proxy()
# def CM_Get_Next_Res_Des(hRes, ResourceType):
# return CM_Get_Next_Res_Des.ctypes_function(hRes, ResourceType)
# @CfgMgr32Proxy()
# def CM_Get_Res_Des_Data_Size(hRes):
# return CM_Get_Res_Des_Data_Size.ctypes_function(hRes)
# @CfgMgr32Proxy()
# def CM_Get_Res_Des_Data(hRes, ResourceSize):
# return CM_Get_Res_Des_Data.ctypes_function(hRes, ResourceSize)
# @CfgMgr32Proxy()
# def CM_Free_Res_Des_Handle(hRes):
# return CM_Free_Res_Des_Handle.ctypes_function(hRes)
+40
View File
@@ -0,0 +1,40 @@
import ctypes
import windows.generated_def as gdef
from ..apiproxy import ApiProxy, NeededParameter, is_implemented
from ..error import succeed_on_zero
class SetupApiProxy(ApiProxy):
APIDLL = "SetupApi"
default_error_check = staticmethod(succeed_on_zero)
# @SetupApiProxy()
# def SetupDiClassNameFromGuidA(Guid):
# return SetupDiClassNameFromGuidA.ctypes_function()
# @SetupApiProxy()
# def SetupDiClassNameFromGuidW(Guid):
# return SetupDiClassNameFromGuidW.ctypes_function()
# @SetupApiProxy()
# def SetupDiGetClassDevsA(Guid):
# return SetupDiGetClassDevsA.ctypes_function()
# @SetupApiProxy()
# def SetupDiEnumDeviceInfo(hDevInfo, NumDevice):
# return SetupDiEnumDeviceInfo.ctypes_function()
# @SetupApiProxy()
# def SetupDiGetDeviceRegistryPropertyA(hDevInfo, DevData, Property, PropertyType):
# return SetupDiGetDeviceRegistryPropertyA.ctypes_function()
# @SetupApiProxy()
# def SetupDiGetDeviceRegistryPropertyW(hDevInfo, DevData, Property, PropertyType):
# return SetupDiGetDeviceRegistryPropertyW.ctypes_function()
# @SetupApiProxy()
# def SetupDiDestroyDeviceInfoList(hDevInfo):
# return SetupDiDestroyDeviceInfoList.ctypes_function(hDevInfo)