def _set_voice(self, val): try: val = GUID(val) except: val = self._enginesList[0].gModeID mode = None for mode in self._enginesList: if mode.gModeID == val: break if mode is None: raise ValueError("no such mode: %s" % val) self._currentMode = mode self._ttsAudio = CoCreateInstance(CLSID_MMAudioDest, IAudioMultiMediaDevice) self._ttsAudio.DeviceNumSet( nvwave.outputDeviceNameToID(config.conf["speech"]["outputDevice"], True)) self._ttsCentral = POINTER(ITTSCentralW)() self._ttsEngines.Select(self._currentMode.gModeID, byref(self._ttsCentral), self._ttsAudio) self._ttsAttrs = self._ttsCentral.QueryInterface(ITTSAttributes) #Find out rate limits hasRate = bool(mode.dwFeatures & TTSFEATURE_SPEED) if hasRate: try: oldVal = DWORD() self._ttsAttrs.SpeedGet(byref(oldVal)) self._ttsAttrs.SpeedSet(TTSATTR_MINSPEED) newVal = DWORD() self._ttsAttrs.SpeedGet(byref(newVal)) self._minRate = newVal.value self._ttsAttrs.SpeedSet(TTSATTR_MAXSPEED) self._ttsAttrs.SpeedGet(byref(newVal)) # ViaVoice (and perhaps other synths) doesn't seem to like the speed being set to maximum. self._maxRate = newVal.value - 1 self._ttsAttrs.SpeedSet(oldVal.value) if self._maxRate <= self._minRate: hasRate = False except COMError: hasRate = False if hasRate: if not self.isSupported('rate'): self.supportedSettings.insert(1, SynthDriver.RateSetting()) else: if self.isSupported("rate"): self.removeSetting("rate") #Find out pitch limits hasPitch = bool(mode.dwFeatures & TTSFEATURE_PITCH) if hasPitch: try: oldVal = WORD() self._ttsAttrs.PitchGet(byref(oldVal)) self._ttsAttrs.PitchSet(TTSATTR_MINPITCH) newVal = WORD() self._ttsAttrs.PitchGet(byref(newVal)) self._minPitch = newVal.value self._ttsAttrs.PitchSet(TTSATTR_MAXPITCH) self._ttsAttrs.PitchGet(byref(newVal)) self._maxPitch = newVal.value self._ttsAttrs.PitchSet(oldVal.value) if self._maxPitch <= self._minPitch: hasPitch = False except COMError: hasPitch = False if hasPitch: if not self.isSupported('pitch'): self.supportedSettings.insert(2, SynthDriver.PitchSetting()) else: if self.isSupported('pitch'): self.removeSetting('pitch') #Find volume limits hasVolume = bool(mode.dwFeatures & TTSFEATURE_VOLUME) if hasVolume: try: oldVal = DWORD() self._ttsAttrs.VolumeGet(byref(oldVal)) self._ttsAttrs.VolumeSet(TTSATTR_MINVOLUME) newVal = DWORD() self._ttsAttrs.VolumeGet(byref(newVal)) self._minVolume = newVal.value self._ttsAttrs.VolumeSet(TTSATTR_MAXVOLUME) self._ttsAttrs.VolumeGet(byref(newVal)) self._maxVolume = newVal.value self._ttsAttrs.VolumeSet(oldVal.value) if self._maxVolume <= self._minVolume: hasVolume = False except COMError: hasVolume = False if hasVolume: if not self.isSupported('volume'): self.supportedSettings.insert(3, SynthDriver.VolumeSetting()) else: if self.isSupported('volume'): self.removeSetting('volume')
def __init__(self, wlan_iface_info): self.description = wlan_iface_info.strInterfaceDescription self.guid = GUID(wlan_iface_info.InterfaceGuid) self.guid_string = str(wlan_iface_info.InterfaceGuid) self.state = wlan_iface_info.isState self.state_string = WLAN_INTERFACE_STATE_DICT[self.state]
class IRunningObjectTable(IUnknown): _iid_ = GUID('{00000010-0000-0000-C000-000000000046}') _idlflags_ = [] def __iter__(self): return self.EnumRunning()
class ISupportErrorInfo(IUnknown): _iid_ = GUID("{DF0B3D60-548F-101B-8E65-08002B2BD119}") _methods_ = [ COMMETHOD([], HRESULT, 'InterfaceSupportsErrorInfo', (['in'], POINTER(GUID), 'riid')) ]
class FontEvents(IDispatch): _case_insensitive_ = True 'Event interface for the Font object' _iid_ = GUID('{4EF6100A-AF88-11D0-9846-00C04FC29993}') _idlflags_ = ['hidden'] _methods_ = []
class StdPicture(CoClass): _reg_clsid_ = GUID('{0BE35204-8F91-11CE-9DE3-00AA004BB851}') _idlflags_ = [] _typelib_path_ = typelib_path _reg_typelib_ = ('{00020430-0000-0000-C000-000000000046}', 2, 0)
class TaskbarList(CoClass): _reg_clsid_ = GUID('{56FDF344-FD6D-11D0-958A-006097C9A090}') _idlflags_ = [] _typelib_path_ = typelib_path _reg_typelib_ = ('{683BF642-E9CA-4124-BE43-67065B2FA653}', 1, 0)
class Picture(IDispatch): _case_insensitive_ = True _iid_ = GUID('{7BF80981-BF32-101A-8BBB-00AA00300CAB}') _idlflags_ = [] _methods_ = []
class IShellLinkA(IUnknown): _iid_ = GUID('{000214EE-0000-0000-C000-000000000046}') _methods_ = [ COMMETHOD([], HRESULT, 'GetPath', ( ['in', 'out'], c_char_p, 'pszFile' ), ( ['in'], c_int, 'cchMaxPath' ), ( ['in', 'out'], POINTER(WIN32_FIND_DATAA), 'pfd' ), ( ['in'], DWORD, 'fFlags' )), COMMETHOD([], HRESULT, 'GetIDList', ( ['retval', 'out'], POINTER(LPITEMIDLIST), 'ppidl' )), COMMETHOD([], HRESULT, 'SetIDList', ( ['in'], LPCITEMIDLIST, 'pidl' )), COMMETHOD([], HRESULT, 'GetDescription', ( ['in', 'out'], c_char_p, 'pszName' ), ( ['in'], c_int, 'cchMaxName' )), COMMETHOD([], HRESULT, 'SetDescription', ( ['in'], c_char_p, 'pszName' )), COMMETHOD([], HRESULT, 'GetWorkingDirectory', ( ['in', 'out'], c_char_p, 'pszDir' ), ( ['in'], c_int, 'cchMaxPath' )), COMMETHOD([], HRESULT, 'SetWorkingDirectory', ( ['in'], c_char_p, 'pszDir' )), COMMETHOD([], HRESULT, 'GetArguments', ( ['in', 'out'], c_char_p, 'pszArgs' ), ( ['in'], c_int, 'cchMaxPath' )), COMMETHOD([], HRESULT, 'SetArguments', ( ['in'], c_char_p, 'pszArgs' )), COMMETHOD(['propget'], HRESULT, 'Hotkey', ( ['retval', 'out'], POINTER(c_short), 'pwHotkey' )), COMMETHOD(['propput'], HRESULT, 'Hotkey', ( ['in'], c_short, 'pwHotkey' )), COMMETHOD(['propget'], HRESULT, 'ShowCmd', ( ['retval', 'out'], POINTER(c_int), 'piShowCmd' )), COMMETHOD(['propput'], HRESULT, 'ShowCmd', ( ['in'], c_int, 'piShowCmd' )), COMMETHOD([], HRESULT, 'GetIconLocation', ( ['in', 'out'], c_char_p, 'pszIconPath' ), ( ['in'], c_int, 'cchIconPath' ), ( ['in', 'out'], POINTER(c_int), 'piIcon' )), COMMETHOD([], HRESULT, 'SetIconLocation', ( ['in'], c_char_p, 'pszIconPath' ), ( ['in'], c_int, 'iIcon' )), COMMETHOD([], HRESULT, 'SetRelativePath', ( ['in'], c_char_p, 'pszPathRel' ), ( ['in'], DWORD, 'dwReserved' )), COMMETHOD([], HRESULT, 'Resolve', ( ['in'], c_int, 'hwnd' ), ( ['in'], DWORD, 'fFlags' )), COMMETHOD([], HRESULT, 'SetPath', ( ['in'], c_char_p, 'pszFile' )), ] def GetPath(self, flags=SLGP_SHORTPATH): buf = create_string_buffer(MAX_PATH) # We're not interested in WIN32_FIND_DATA self.__com_GetPath(buf, MAX_PATH, None, flags) return buf.value def GetDescription(self): buf = create_string_buffer(1024) self.__com_GetDescription(buf, 1024) return buf.value def GetWorkingDirectory(self): buf = create_string_buffer(MAX_PATH) self.__com_GetWorkingDirectory(buf, MAX_PATH) return buf.value def GetArguments(self): buf = create_string_buffer(1024) self.__com_GetArguments(buf, 1024) return buf.value def GetIconLocation(self): iIcon = c_int() buf = create_string_buffer(MAX_PATH) self.__com_GetIconLocation(buf, MAX_PATH, byref(iIcon)) return buf.value, iIcon.value
# Used in SPL add-on until merged into NVDA directly (Joseph Lee) from nvdaBuiltin.gui.nvdaControls import * from . import accPropServer import oleacc import winUser import comtypes from comtypes import GUID # Apart from certain controls from check list box and friends, it is identical to NVDA Core version. # GUIDS for IAccessible properties that can be overridden by means of annotation. #Use these to look up the GUID needed when implementing a server. #Number of digits Format: "{8-4-4-4-12}" PROPID_ACC_NAME = GUID("{608d3df8-8128-4aa7-a428-f55e49267291}") PROPID_ACC_VALUE = GUID("{123fe443-211a-4615-9527-c45a7e93717a}") PROPID_ACC_DESCRIPTION = GUID("{4d48dfe4-bd3f-491f-a648-492d6f20c588}") PROPID_ACC_ROLE = GUID("{CB905FF2-7BD1-4C05-B3C8-E6C241364D70}") PROPID_ACC_STATE = GUID("{A8D4D5B0-0A21-42D0-A5C0-514E984F457B}") PROPID_ACC_HELP = GUID("{c831e11f-44db-4a99-9768-cb8f978b7231}") PROPID_ACC_KEYBOARDSHORTCUT = GUID("{7d9bceee-7d1e-4979-9382-5180f4172c34}") PROPID_ACC_DEFAULTACTION = GUID("{180c072b-c27f-43c7-9922-f63562a4632b}") PROPID_ACC_VALUEMAP = GUID("{da1c3d79-fc5c-420e-b399-9d1533549e75}") PROPID_ACC_ROLEMAP = GUID("{f79acda2-140d-4fe6-8914-208476328269}") PROPID_ACC_STATEMAP = GUID("{43946c5e-0ac0-4042-b525-07bbdbe17fa7}") PROPID_ACC_FOCUS = GUID("{6eb335df-1c29-4127-b12c-dee9fd157f2b}") PROPID_ACC_SELECTION = GUID("{b99d073c-d731-405b-9061-d95e8f842984}") PROPID_ACC_PARENT = GUID("{474c22b6-ffc2-467a-b1b5-e958b4657330}") PROPID_ACC_NAV_UP = GUID("{016e1a2b-1a4e-4767-8612-3386f66935ec}") PROPID_ACC_NAV_LEFT = GUID("{228086cb-82f1-4a39-8705-dcdc0fff92f5}")
class ShellLink(CoClass): 'ShellLink class' _reg_clsid_ = GUID('{00021401-0000-0000-C000-000000000046}') _idlflags_ = [] _com_interfaces_ = [IShellLinkW, IShellLinkA]
class IStream(ISequentialStream): _iid_ = GUID('{0000000C-0000-0000-C000-000000000046}') _idlflags_ = []
class IEnumString(IUnknown): _iid_ = GUID('{00000101-0000-0000-C000-000000000046}') _idlflags_ = []
DISPATCH_METHOD = 1 DISPATCH_PROPERTYGET = 2 DISPATCH_PROPERTYPUT = 4 DISPATCH_PROPERTYPUTREF = 8 tagINVOKEKIND = c_int INVOKE_FUNC = DISPATCH_METHOD INVOKE_PROPERTYGET = DISPATCH_PROPERTYGET INVOKE_PROPERTYPUT = DISPATCH_PROPERTYPUT INVOKE_PROPERTYPUTREF = DISPATCH_PROPERTYPUTREF INVOKEKIND = tagINVOKEKIND ################################ # helpers IID_NULL = GUID() riid_null = byref(IID_NULL) # 30. December 1899, midnight. For VT_DATE. _com_null_date = datetime.datetime(1899, 12, 30, 0, 0, 0) ################################################################ # VARIANT, in all it's glory. VARENUM = c_int # enum VT_EMPTY = 0 VT_NULL = 1 VT_I2 = 2 VT_I4 = 3 VT_R4 = 4 VT_R8 = 5 VT_CY = 6
class ITaskbarList(IUnknown): _case_insensitive_ = True _iid_ = GUID('{56FDF342-FD6D-11D0-958A-006097C9A090}') _idlflags_ = []
class IDispatch(IUnknown): _iid_ = GUID("{00020400-0000-0000-C000-000000000046}") _methods_ = [ COMMETHOD([], HRESULT, 'GetTypeInfoCount', (['out'], POINTER(UINT))), COMMETHOD( [], HRESULT, 'GetTypeInfo', (['in'], UINT, 'index'), (['in'], LCID, 'lcid', 0), ## Normally, we would declare this parameter in this way: ## (['out'], POINTER(POINTER(ITypeInfo)) ) ), ## but we cannot import comtypes.typeinfo at the top level (recursive imports!). (['out'], POINTER(POINTER(IUnknown)))), STDMETHOD( HRESULT, 'GetIDsOfNames', [POINTER(IID), POINTER(c_wchar_p), UINT, LCID, POINTER(DISPID)]), STDMETHOD(HRESULT, 'Invoke', [ DISPID, POINTER(IID), LCID, WORD, POINTER(DISPPARAMS), POINTER(VARIANT), POINTER(EXCEPINFO), POINTER(UINT) ]), ] def GetTypeInfo(self, index, lcid=0): """Return type information. Index 0 specifies typeinfo for IDispatch""" import comtypes.typeinfo result = self._GetTypeInfo(index, lcid) return result.QueryInterface(comtypes.typeinfo.ITypeInfo) def GetIDsOfNames(self, *names, **kw): """Map string names to integer ids.""" lcid = kw.pop("lcid", 0) assert not kw arr = (c_wchar_p * len(names))(*names) ids = (DISPID * len(names))() self.__com_GetIDsOfNames(riid_null, arr, len(names), lcid, ids) return ids[:] def _invoke(self, memid, invkind, lcid, *args): var = VARIANT() argerr = c_uint() dp = DISPPARAMS() if args: array = (VARIANT * len(args))() for i, a in enumerate(args[::-1]): array[i].value = a dp.cArgs = len(args) if invkind in (DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYPUTREF): dp.cNamedArgs = 1 dp.rgdispidNamedArgs = pointer(DISPID(DISPID_PROPERTYPUT)) dp.rgvarg = array self.__com_Invoke(memid, riid_null, lcid, invkind, dp, var, None, argerr) return var._get_value(dynamic=True) def Invoke(self, dispid, *args, **kw): """Invoke a method or property.""" # Memory management in Dispatch::Invoke calls: # http://msdn.microsoft.com/library/en-us/automat/htm/chap5_4x2q.asp # Quote: # The *CALLING* code is responsible for releasing all strings and # objects referred to by rgvarg[ ] or placed in *pVarResult. # # For comtypes this is handled in DISPPARAMS.__del__ and VARIANT.__del__. _invkind = kw.pop("_invkind", 1) # DISPATCH_METHOD _lcid = kw.pop("_lcid", 0) if kw: raise ValueError("named parameters not yet implemented") result = VARIANT() excepinfo = EXCEPINFO() argerr = c_uint() if _invkind in (DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYPUTREF): # propput array = (VARIANT * len(args))() for i, a in enumerate(args[::-1]): array[i].value = a dp = DISPPARAMS() dp.cArgs = len(args) dp.cNamedArgs = 1 dp.rgvarg = array dp.rgdispidNamedArgs = pointer(DISPID(DISPID_PROPERTYPUT)) else: array = (VARIANT * len(args))() for i, a in enumerate(args[::-1]): array[i].value = a dp = DISPPARAMS() dp.cArgs = len(args) dp.cNamedArgs = 0 dp.rgvarg = array try: self.__com_Invoke(dispid, riid_null, _lcid, _invkind, byref(dp), byref(result), byref(excepinfo), byref(argerr)) except COMError, err: (hresult, text, details) = err.args if hresult == DISP_E_EXCEPTION: details = (excepinfo.bstrDescription, excepinfo.bstrSource, excepinfo.bstrHelpFile, excepinfo.dwHelpContext, excepinfo.scode) raise COMError(hresult, text, details) elif hresult == DISP_E_PARAMNOTFOUND: # MSDN says: You get the error DISP_E_PARAMNOTFOUND # when you try to set a property and you have not # initialized the cNamedArgs and rgdispidNamedArgs # elements of your DISPPARAMS structure. # # So, this looks like a bug. raise COMError(hresult, text, argerr.value) elif hresult == DISP_E_TYPEMISMATCH: # MSDN: One or more of the arguments could not be # coerced. # # Hm, should we raise TypeError, or COMError? raise COMError(hresult, text, ("TypeError: Parameter %s" % (argerr.value + 1), args)) raise return result._get_value(dynamic=True)
class ITaskbarList2(ITaskbarList): _case_insensitive_ = True _iid_ = GUID('{602D4995-B13A-429B-A66E-1935E44F4317}') _idlflags_ = []
class Font(IDispatch): _case_insensitive_ = True _iid_ = GUID('{BEF6E003-A874-101A-8BBA-00AA00300CAB}') _idlflags_ = [] _methods_ = []
class ITaskbarList3(ITaskbarList2): _case_insensitive_ = True _iid_ = GUID('{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}') _idlflags_ = []
class IFont(IUnknown): _case_insensitive_ = True 'Font Object' _iid_ = GUID('{BEF6E002-A874-101A-8BBA-00AA00300CAB}') _idlflags_ = ['hidden']
class DbgEngEventCallbacks(CoClass): _reg_clsid_ = GUID('{EAC5ACAA-7BD0-4f1f-8DEB-DF2862A7E85B}') _reg_threading_ = "Both" _reg_progid_ = "PyDbgEngLib.DbgEngEventCallbacks.1" _reg_novers_progid_ = "PyDbgEngLib.DbgEngEventCallbacks" _reg_desc_ = "Callback class!" _reg_clsctx_ = comtypes.CLSCTX_INPROC_SERVER _com_interfaces_ = [DbgEng.IDebugEventCallbacks, DbgEng.IDebugOutputCallbacks, comtypes.typeinfo.IProvideClassInfo2, comtypes.errorinfo.ISupportErrorInfo, comtypes.connectionpoints.IConnectionPointContainer] def IDebugOutputCallbacks_Output(self, arg1, arg2, arg3 = None): # >= v0.5.1 if arg3 == None: unknown = None mask = arg1 text = arg2 # <= 0.4.2 else: unknown = arg1 mask = arg2 text = arg3 self._pyDbgEng = PyDbgEng.fuzzyWuzzy self._pyDbgEng.output_callbacks_sink.Output(unknown, mask, text) return S_OK def IDebugEventCallbacks_Breakpoint(self, unknown, bp = None): # >= v0.5.1 if bp == None: bp = unknown unknown = None return self._pyDbgEng.Breakpoint(unknown, bp) def IDebugEventCallbacks_ChangeDebuggeeState(self, unknown, flags, arg = None): # >= v0.5.1 if arg == None: arg = flags flags = unknown unknown = None return self._pyDbgEng.ChangeDebuggeeState(unknown, flags, arg) def IDebugEventCallbacks_ChangeEngineState(self, unknown, flags, arg = None): # >= v0.5.1 if arg == None: arg = flags flags = unknown unknown = None return self._pyDbgEng.ChangeEngineState(unknown, flags, arg) def IDebugEventCallbacks_Exception(self, unknown, exception, firstChance = None): # >= v0.5.1: if firstChance == None: firstChance = exception exception = unknown unknown = None return self._pyDbgEng.Exception(unknown, exception, firstChance) def IDebugEventCallbacks_GetInterestMask(self, unknown = None, mask = None): # Superhack! self._pyDbgEng = PyDbgEng.fuzzyWuzzy # For v0.5.1 and on if unknown == None and mask == None: return self._pyDbgEng.GetInterestMask() # For v0.4 and lower mask[0] = self._pyDbgEng.GetInterestMask() return S_OK def IDebugEventCallbacks_LoadModule(self, unknown, imageFileHandle, baseOffset, moduleSize, moduleName, imageName, checkSum, timeDateStamp = None): # >= v0.5.1 if timeDateStamp == None: timeDateStamp = checkSum checkSum = imageName imageName = moduleName moduleName = moduleSize moduleSize = baseOffset baseOffset = imageFileHandle imageFileHandle = unknown unknown = None return self._pyDbgEng.LoadModule(unknown, imageFileHandle, baseOffset, moduleSize, moduleName, imageName, checkSum, timeDateStamp) def IDebugEventCallbacks_UnloadModule(self, unknown, imageBaseName, baseOffset = None): # >= 0.5.1 if baseOffset == None: baseOffset = imageBaseName imageBaseName = unknown unknown = None return self._pyDbgEng.UnloadModule(unknown, imageBaseName, baseOffset) def IDebugEventCallbacks_CreateProcess(self, unknown, imageFileHandle, handle, baseOffset, moduleSize, moduleName, imageName, checkSum, timeDateStamp, initialThreadHandle, threadDataOffset, startOffset = None): # >= 0.5.1 if startOffset == None: startOffset = threadDataOffset threadDataOffset = initialThreadHandle initialThreadHandle = timeDateStamp timeDataStamp = checkSum checkSum = imageName imageName = moduleName moduleName = moduleSize moduleSize = baseOffset baseOffset = handle handle = imageFileHandle imageFileHandle = unknown unknown = None return self._pyDbgEng.CreateProcess(unknown, imageFileHandle, handle, baseOffset, moduleSize, moduleName, imageName, checkSum, timeDateStamp, initialThreadHandle, threadDataOffset, startOffset) def IDebugEventCallbacks_ExitProcess(self, unknown, exitCode = None): # >= 0.5.1 if exitCode == None: exitCode = unknown unknown = None return self._pyDbgEng.ExitProcess(unknown, exitCode) def IDebugEventCallbacks_SessionStatus(self, unknown, status = None): # >= 0.5.1 if status == None: status = unknown unknown = None return self._pyDbgEng.SessionStatus(unknown, status) def IDebugEventCallbacks_ChangeSymbolState(self, unknown, flags, arg = None): # >= 0.5.1 if arg == None: arg = flags flags = unknown unknown = None return self._pyDbgEng.ChangeSymbolState(unknown, flags, arg) def IDebugEventCallbacks_SystemError(self, unknown, error, level = None): # >= 0.5.1 if level == None: level = error error = unknown unknown = None return self._pyDbgEng.SystemError(unknown, error, level) def IDebugEventCallbacks_CreateThread(self, unknown, handle, dataOffset, startOffset = None): # >= 0.5.1 if startOffset == None: startOffset = dataOffset dataOffset = handle handle = unknown unknown = None return self._pyDbgEng.CreateThread(handle, unknown, dataOffset, startOffset) def IDebugEventCallbacks_ExitThread(self, unknown, exitCode = None): # >= 0.5.1 if exitCode == None: exitCode = unknown unknown = None return self._pyDbgEng.ExitThread(unknown, exitCode)
class IPicture(IUnknown): _case_insensitive_ = True 'Picture Object' _iid_ = GUID('{7BF80980-BF32-101A-8BBB-00AA00300CAB}') _idlflags_ = ['hidden']
HANDLE, POINTER(SP_DEVICE_INTERFACE_DATA), POINTER(SP_DEVICE_INTERFACE_DETAIL_DATA), DWORD, POINTER(DWORD), POINTER(SP_DEVINFO_DATA) ] CM_Get_Child = windll.CfgMgr32.CM_Get_Child CM_Get_Child.restype = DWORD CM_Get_Child.argtypes = [POINTER(DWORD), DWORD, ULONG] CM_Get_Sibling = windll.CfgMgr32.CM_Get_Sibling CM_Get_Sibling.restype = DWORD CM_Get_Sibling.argtypes = [POINTER(DWORD), DWORD, ULONG] GUID_DEVINTERFACE_USB_DEVICE = GUID('{A5DCBF10-6530-11D2-901F-00C04FB951ED}') GUID_DEVINTERFACE_DISK = GUID('{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}') DIGCF_PRESENT = 2 DIGCF_DEVICEINTERFACE = 16 class MscContext(BaseUsbContext): def __init__(self): super(MscContext, self).__init__('Windows-MSC', USB_CLASS_MSC) def listDevices(self, vendor): return (dev for dev in _listDevices() if dev.idVendor == vendor) def openDevice(self, device): return _MscDriver(device.handle)