# Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Microsoft OS 2.0 Descriptor generation utilities. Classes to help generate Microsoft OS 2.0 descriptors. Based on documentation here: https://msdn.microsoft.com/en-us/library/windows/hardware/dn385747.aspx """ import uuid import usb_constants import usb_descriptors class PlatformCapabilityDescriptor(usb_descriptors.Descriptor): """Microsoft OS 2.0 platform capability descriptor. """ def __init__(self, **kwargs): super(PlatformCapabilityDescriptor, self).__init__(**kwargs) self._descriptor_set = None @property def descriptor_set_size(self): if self._descriptor_set is None: return 0 return len(self._descriptor_set.Encode()) def SetDescriptorSet(self, descriptor_set): self._descriptor_set = descriptor_set PlatformCapabilityDescriptor.AddComputedField('bLength', 'B', 'struct_size') PlatformCapabilityDescriptor.AddFixedField( 'bDescriptorType', 'B', usb_constants.DescriptorType.DEVICE_CAPABILITY) PlatformCapabilityDescriptor.AddFixedField( 'bDevCapabilityType', 'B', usb_constants.CapabilityType.PLATFORM) PlatformCapabilityDescriptor.AddFixedField('bReserved', 'B', 0) PlatformCapabilityDescriptor.AddFixedField( 'MS_OS_20_Platform_Capability_ID', '16s', uuid.UUID('{D8DD60DF-4589-4CC7-9CD2-659D9E648A9F}').bytes_le) PlatformCapabilityDescriptor.AddField('dwWindowsVersion', 'I') PlatformCapabilityDescriptor.AddComputedField( 'wMSOSDescriptorSetTotalLength', 'H', 'descriptor_set_size') PlatformCapabilityDescriptor.AddField('bMS_VendorCode', 'B') PlatformCapabilityDescriptor.AddField('bAltEnumCode', 'B', default=0) class DescriptorSetHeader(usb_descriptors.DescriptorContainer): """Microsoft OS 2.0 descriptor set header. """ pass DescriptorSetHeader.AddComputedField('wLength', 'H', 'struct_size') DescriptorSetHeader.AddFixedField('wDescriptorType', 'H', 0x00) DescriptorSetHeader.AddField('dwWindowsVersion', 'I') DescriptorSetHeader.AddComputedField('wTotalLength', 'H', 'total_size') class ConfigurationSubsetHeader(usb_descriptors.DescriptorContainer): """Microsoft OS 2.0 configuration subset header. """ pass ConfigurationSubsetHeader.AddComputedField('wLength', 'H', 'struct_size') ConfigurationSubsetHeader.AddFixedField('wDescriptorType', 'H', 0x01) ConfigurationSubsetHeader.AddField('bConfigurationValue', 'B') ConfigurationSubsetHeader.AddFixedField('bReserved', 'B', 0) ConfigurationSubsetHeader.AddComputedField('wTotalLength', 'H', 'total_size') class FunctionSubsetHeader(usb_descriptors.DescriptorContainer): """Microsoft OS 2.0 function subset header. """ pass FunctionSubsetHeader.AddComputedField('wLength', 'H', 'struct_size') FunctionSubsetHeader.AddFixedField('wDescriptorType', 'H', 0x02) FunctionSubsetHeader.AddField('bFirstInterface', 'B') FunctionSubsetHeader.AddFixedField('bReserved', 'B', 0) FunctionSubsetHeader.AddComputedField('wSubsetLength', 'H', 'total_size') class CompatibleId(usb_descriptors.Descriptor): """Microsoft OS 2.0 compatible ID descriptor. """ pass CompatibleId.AddComputedField('wLength', 'H', 'struct_size') CompatibleId.AddFixedField('wDescriptorType', 'H', 0x03) CompatibleId.AddField('CompatibleID', '8s') CompatibleId.AddField('SubCompatibleID', '8s', default='')