예제 #1
0
 def __init__(self, path):
     base.HidDevice.__init__(self, path)
     self.dev = os.open(path, os.O_RDWR)
     self.desc = base.DeviceDescriptor()
     self.desc.path = path
     rd_file = open(
         os.path.join('/sys/class/hidraw', os.path.basename(path),
                      'device/report_descriptor'), 'rb')
     ParseReportDescriptor(rd_file.read(), self.desc)
     rd_file.close()
예제 #2
0
    def Enumerate():
        for hidraw in os.listdir('/sys/class/hidraw'):
            rd_path = (os.path.join('/sys/class/hidraw', hidraw,
                                    'device/report_descriptor'))
            uevent_path = os.path.join('/sys/class/hidraw', hidraw,
                                       'device/uevent')
            rd_file = open(rd_path, 'rb')
            uevent_file = open(uevent_path, 'rb')
            desc = base.DeviceDescriptor()
            desc.path = os.path.join('/dev/', hidraw)
            ParseReportDescriptor(rd_file.read(), desc)
            ParseUevent(uevent_file.read(), desc)

            rd_file.close()
            uevent_file.close()
            yield desc.ToPublicDict()
예제 #3
0
    def Enumerate():
        """See base class."""
        # Init a HID manager
        hid_mgr = iokit.IOHIDManagerCreate(None, None)
        if not hid_mgr:
            raise errors.OsHidError('Unable to obtain HID manager reference')
        iokit.IOHIDManagerSetDeviceMatching(hid_mgr, None)

        # Get devices from HID manager
        device_set_ref = iokit.IOHIDManagerCopyDevices(hid_mgr)
        if not device_set_ref:
            raise errors.OsHidError(
                'Failed to obtain devices from HID manager')

        num = iokit.CFSetGetCount(device_set_ref)
        devices = (IO_HID_DEVICE_REF * num)()
        iokit.CFSetGetValues(device_set_ref, devices)

        # Retrieve and build descriptor dictionaries for each device
        descriptors = []
        for dev in devices:
            d = base.DeviceDescriptor()
            d.vendor_id = GetDeviceIntProperty(dev,
                                               HID_DEVICE_PROPERTY_VENDOR_ID)
            d.product_id = GetDeviceIntProperty(
                dev, HID_DEVICE_PROPERTY_PRODUCT_ID)
            d.product_string = GetDeviceStringProperty(
                dev, HID_DEVICE_PROPERTY_PRODUCT)
            d.usage = GetDeviceIntProperty(dev,
                                           HID_DEVICE_PROPERTY_PRIMARY_USAGE)
            d.usage_page = GetDeviceIntProperty(
                dev, HID_DEVICE_PROPERTY_PRIMARY_USAGE_PAGE)
            d.report_id = GetDeviceIntProperty(dev,
                                               HID_DEVICE_PROPERTY_REPORT_ID)
            d.path = GetDevicePath(dev)
            descriptors.append(d.ToPublicDict())

        # Clean up CF objects
        cf.CFRelease(device_set_ref)
        cf.CFRelease(hid_mgr)

        return descriptors
예제 #4
0
    def Enumerate():
        hidraw_devices = []
        try:
            hidraw_devices = os.listdir('/sys/class/hidraw')
        except FileNotFoundError:
            raise errors.OsHidError('No hidraw device is available')

        for dev in hidraw_devices:
            rd_path = (os.path.join('/sys/class/hidraw', dev,
                                    'device/report_descriptor'))
            uevent_path = os.path.join('/sys/class/hidraw', dev,
                                       'device/uevent')
            rd_file = open(rd_path, 'rb')
            uevent_file = open(uevent_path, 'rb')
            desc = base.DeviceDescriptor()
            desc.path = os.path.join('/dev/', dev)
            ParseReportDescriptor(rd_file.read(), desc)
            ParseUevent(uevent_file.read(), desc)

            rd_file.close()
            uevent_file.close()
            yield desc.ToPublicDict()
예제 #5
0
파일: windows.py 프로젝트: google/pyu2f
 def __init__(self, path):
     """See base class."""
     base.HidDevice.__init__(self, path)
     self.dev = OpenDevice(path)
     self.desc = base.DeviceDescriptor()
     FillDeviceCapabilities(self.dev, self.desc)
예제 #6
0
파일: windows.py 프로젝트: google/pyu2f
    def Enumerate():
        """See base class."""
        hid_guid = GUID()
        hid.HidD_GetHidGuid(ctypes.byref(hid_guid))

        devices = setupapi.SetupDiGetClassDevsA(ctypes.byref(hid_guid), None,
                                                None, 0x12)
        index = 0
        interface_info = DeviceInterfaceData()
        interface_info.cbSize = ctypes.sizeof(DeviceInterfaceData)  # pylint: disable=invalid-name

        out = []
        while True:
            result = setupapi.SetupDiEnumDeviceInterfaces(
                devices, 0, ctypes.byref(hid_guid), index,
                ctypes.byref(interface_info))
            index += 1
            if not result:
                break

            detail_len = wintypes.DWORD()
            result = setupapi.SetupDiGetDeviceInterfaceDetailA(
                devices, ctypes.byref(interface_info), None, 0,
                ctypes.byref(detail_len), None)

            detail_len = detail_len.value
            if detail_len == 0:
                # skip this device, some kind of error
                continue

            buf = ctypes.create_string_buffer(detail_len)
            interface_detail = DeviceInterfaceDetailData.from_buffer(buf)
            interface_detail.cbSize = ctypes.sizeof(DeviceInterfaceDetailData)

            result = setupapi.SetupDiGetDeviceInterfaceDetailA(
                devices, ctypes.byref(interface_info),
                ctypes.byref(interface_detail), detail_len, None, None)

            if not result:
                raise ctypes.WinError()

            descriptor = base.DeviceDescriptor()
            # This is a bit of a hack to work around a limitation of ctypes and
            # "header" structures that are common in windows.  DevicePath is a
            # ctypes array of length 1, but it is backed with a buffer that is much
            # longer and contains a null terminated string.  So, we read the null
            # terminated string off DevicePath here.  Per the comment above, the
            # alignment of this struct varies depending on architecture, but
            # in all cases the path string starts 1 DWORD into the structure.
            #
            # The path length is:
            #   length of detail buffer - header length (1 DWORD)
            path_len = detail_len - ctypes.sizeof(wintypes.DWORD)
            descriptor.path = ctypes.string_at(
                ctypes.addressof(interface_detail.DevicePath), path_len)

            device = None
            try:
                device = OpenDevice(descriptor.path, True)
            except WindowsError as e:  # pylint: disable=undefined-variable
                if e.winerror == ERROR_ACCESS_DENIED:  # Access Denied, e.g. a keyboard
                    continue
                else:
                    raise e

            try:
                FillDeviceAttributes(device, descriptor)
                FillDeviceCapabilities(device, descriptor)
                out.append(descriptor.ToPublicDict())
            except WindowsError as e:
                continue  # skip this device
            finally:
                kernel32.CloseHandle(device)

        return out