Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
0e6c36f
Move top level obviously Windows API bindings from hwPortUtils
SaschaCowley Jul 28, 2025
d0421aa
Tidy and make more conformant to rest of winBindings
SaschaCowley Jul 28, 2025
4a3b580
Move advapi32 and setupapi functions out of hwPortUtils
SaschaCowley Jul 28, 2025
7330373
Moved bthprops bindings out of hwPortUtils
SaschaCowley Jul 28, 2025
59554a1
Move hid.dll bindings into winBindings
SaschaCowley Aug 5, 2025
e1f0c85
Fix typo in winBindings.setupapi
SaschaCowley Aug 11, 2025
0e2d55e
Docs for bthprops
SaschaCowley Aug 11, 2025
fd02d88
Docs for cfgmgr32
SaschaCowley Aug 11, 2025
270b2d6
Docs for hid
SaschaCowley Aug 11, 2025
f4acfd5
Fix docs for setupapi
SaschaCowley Aug 11, 2025
d2895a6
Fix up docs for advapi32
SaschaCowley Aug 11, 2025
16a858b
Fix up changes
SaschaCowley Aug 11, 2025
45c2f62
Fix incorrect types
SaschaCowley Aug 12, 2025
89977a6
Pre-commit auto-fix
pre-commit-ci[bot] Aug 12, 2025
5199593
Start adding backward compat layer
SaschaCowley Aug 12, 2025
705e03a
Merge branch 'hwPortUtilsWinBindings' of https://github.com/nvaccess/…
SaschaCowley Aug 12, 2025
89fbc76
Add shim for bthprops
SaschaCowley Aug 12, 2025
4469701
Shim for cfgmgr32
SaschaCowley Aug 12, 2025
50cf1ee
hid
SaschaCowley Aug 12, 2025
d646911
Shim for setupapi
SaschaCowley Aug 12, 2025
07c29bb
Fix SetupDiEnumDeviceInfo
SaschaCowley Aug 12, 2025
1c9db49
Move MAX_DEVICE_ID_LEN and CR_SUCCESS to winBindings.cfgmgr32
SaschaCowley Aug 13, 2025
d2accbd
Move setupapi constants out of hwPortUtils
SaschaCowley Aug 13, 2025
b3c5fcc
Move system error codes out of hwPortUtils
SaschaCowley Aug 13, 2025
e4cbef6
Move last stragglers to setupapi
SaschaCowley Aug 13, 2025
2577068
Make getattr more maintainable
SaschaCowley Aug 13, 2025
69267c0
Tidy
SaschaCowley Aug 13, 2025
dfd66e1
Fix up changes
SaschaCowley Aug 13, 2025
417e915
Apply suggestions from code review
SaschaCowley Aug 14, 2025
869a53a
Add copyright header and docstring to winBindings.hid
SaschaCowley Aug 14, 2025
c63572d
Fix order of imports in hwPortUtils
SaschaCowley Aug 14, 2025
df9ba74
Merge branch 'master' into hwPortUtilsWinBindings
SaschaCowley Aug 18, 2025
a149bdb
Merge branch 'master' into hwPortUtilsWinBindings
SaschaCowley Aug 20, 2025
39e22b4
Shaddow imports from winBindings.advapi32
SaschaCowley Aug 20, 2025
d5998c3
Shaddow imports from winBindings.bthprops
SaschaCowley Aug 20, 2025
0fcef5b
Shaddow imports from winBindings.hid
SaschaCowley Aug 20, 2025
4d6e810
Shaddow imports from winBindings.setupapi
SaschaCowley Aug 20, 2025
d69f508
Sort moved symbols
SaschaCowley Aug 20, 2025
cb948bb
WIP deprecation handler
SaschaCowley Aug 20, 2025
ce9a635
Mostly working migration to reuseable handler
SaschaCowley Aug 22, 2025
2eeeeb3
Moved symbol support
SaschaCowley Aug 22, 2025
2aa3999
Handle literals or values from the same module
SaschaCowley Aug 22, 2025
8329343
Add documentation and tidy
SaschaCowley Aug 25, 2025
a5df850
Move to using new system
SaschaCowley Aug 25, 2025
35aa879
mend
SaschaCowley Aug 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Move hid.dll bindings into winBindings
  • Loading branch information
SaschaCowley committed Aug 12, 2025
commit 59554a18a06cb2a313336f28f3a096930b8b8c95
42 changes: 20 additions & 22 deletions source/hwPortUtils.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,23 @@
import math
import typing
import winreg
from ctypes.wintypes import DWORD, ULONG, USHORT, WCHAR
from ctypes.wintypes import DWORD, WCHAR

from comtypes import GUID

import config
import hidpi
from winBindings.bthprops import BLUETOOTH_DEVICE_INFO
from winBindings.bthprops import BLUETOOTH_DEVICE_INFO, BluetoothGetDeviceInfo
from winBindings.hid import (
HIDD_ATTRIBUTES,
HidD_FreePreparsedData,
HidD_GetAttributes,
HidD_GetHidGuid,
HidD_GetManufacturerString,
HidD_GetPreparsedData,
HidD_GetProductString,
HidP_GetCaps,
)
from winBindings.setupapi import (
SetupDiDestroyDeviceInfoList,
HDEVINFO,
Expand Down Expand Up @@ -191,7 +201,7 @@ def listComPorts(onlyAvailable: bool = True) -> typing.Iterator[dict]:

def getBluetoothDeviceInfo(address):
devInfo = BLUETOOTH_DEVICE_INFO(address=address)
res = ctypes.windll["bthprops.cpl"].BluetoothGetDeviceInfo(None, ctypes.byref(devInfo))
res = BluetoothGetDeviceInfo(None, ctypes.byref(devInfo))
if res != 0:
raise ctypes.WinError(res)
return devInfo
Expand Down Expand Up @@ -382,18 +392,6 @@ def listUsbDevices(onlyAvailable: bool = True) -> typing.Iterator[dict]:
log.debug("Finished listing USB devices")


class HIDD_ATTRIBUTES(ctypes.Structure):
Comment thread
SaschaCowley marked this conversation as resolved.
_fields_ = (
("Size", ULONG),
("VendorID", USHORT),
("ProductID", USHORT),
("VersionNumber", USHORT),
)

def __init__(self, **kwargs):
super().__init__(Size=ctypes.sizeof(HIDD_ATTRIBUTES), **kwargs)


_getHidInfoCache: dict[str, dict] = {}


Expand Down Expand Up @@ -443,7 +441,7 @@ def _getHidInfo(hwId: str, path: str) -> dict[str, typing.Any]:
return info
try:
attribs = HIDD_ATTRIBUTES()
if ctypes.windll.hid.HidD_GetAttributes(handle, ctypes.byref(attribs)):
if HidD_GetAttributes(handle, ctypes.byref(attribs)):
info["vendorID"] = attribs.VendorID
info["productID"] = attribs.ProductID
info["versionNumber"] = attribs.VersionNumber
Expand All @@ -452,18 +450,18 @@ def _getHidInfo(hwId: str, path: str) -> dict[str, typing.Any]:
log.debugWarning("HidD_GetAttributes failed")
buf = ctypes.create_unicode_buffer(128)
nrOfBytes = ctypes.sizeof(buf)
if ctypes.windll.hid.HidD_GetManufacturerString(handle, buf, nrOfBytes):
if HidD_GetManufacturerString(handle, buf, nrOfBytes):
info["manufacturer"] = buf.value
if ctypes.windll.hid.HidD_GetProductString(handle, buf, nrOfBytes):
if HidD_GetProductString(handle, buf, nrOfBytes):
info["product"] = buf.value
pd = ctypes.c_void_p()
if ctypes.windll.hid.HidD_GetPreparsedData(handle, ctypes.byref(pd)):
if HidD_GetPreparsedData(handle, ctypes.byref(pd)):
try:
caps = hidpi.HIDP_CAPS()
ctypes.windll.hid.HidP_GetCaps(pd, ctypes.byref(caps))
HidP_GetCaps(pd, ctypes.byref(caps))
info["HIDUsagePage"] = caps.UsagePage
finally:
ctypes.windll.hid.HidD_FreePreparsedData(pd)
HidD_FreePreparsedData(pd)
finally:
winKernel.closeHandle(handle)
_getHidInfoCache[path] = info
Expand All @@ -483,7 +481,7 @@ def listHidDevices(onlyAvailable: bool = True) -> typing.Iterator[dict]:
global _hidGuid
if not _hidGuid:
_hidGuid = GUID()
ctypes.windll.hid.HidD_GetHidGuid(ctypes.byref(_hidGuid))
HidD_GetHidGuid(ctypes.byref(_hidGuid))

for g_hdi, idd, devinfo, buf in _listDevices(_hidGuid, onlyAvailable):
# hardware ID
Expand Down
56 changes: 56 additions & 0 deletions source/winBindings/hid.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from ctypes import POINTER, Structure, c_void_p, sizeof, windll
Comment thread
SaschaCowley marked this conversation as resolved.
from ctypes.wintypes import BOOLEAN, HANDLE, ULONG, USHORT

from comtypes import GUID
from hidpi import HIDP_CAPS, NTSTATUS

dll = windll.hid


class HIDD_ATTRIBUTES(Structure):
_fields_ = (
("Size", ULONG),
("VendorID", USHORT),
("ProductID", USHORT),
("VersionNumber", USHORT),
)

def __init__(self, **kwargs):
super().__init__(Size=sizeof(HIDD_ATTRIBUTES), **kwargs)


PHID_ATTRIBUTES = POINTER(HIDD_ATTRIBUTES)

HidD_GetAttributes = dll.HidD_GetAttributes
HidD_GetAttributes.argtypes = (HANDLE, PHID_ATTRIBUTES)
HidD_GetAttributes.restype = BOOLEAN

HidD_GetManufacturerString = dll.HidD_GetManufacturerString
HidD_GetManufacturerString.argtypes = (HANDLE, c_void_p, ULONG)
HidD_GetManufacturerString.restype = BOOLEAN

HidD_GetProductString = dll.HidD_GetProductString
HidD_GetProductString.argtypes = (HANDLE, c_void_p, ULONG)
HidD_GetProductString.restype = BOOLEAN

PHIDP_PREPARSED_DATA = c_void_p

HidD_GetPreparsedData = dll.HidD_GetPreparsedData
HidD_GetPreparsedData.argtypes = (HANDLE, PHIDP_PREPARSED_DATA)
HidD_GetPreparsedData.restype = BOOLEAN

PHIDP_CAPS = POINTER(HIDP_CAPS)

HidP_GetCaps = dll.HidP_GetCaps
HidP_GetCaps.argtypes = (PHIDP_PREPARSED_DATA, PHIDP_CAPS)
HidP_GetCaps.restype = NTSTATUS

HidD_FreePreparsedData = dll.HidD_FreePreparsedData
HidD_FreePreparsedData.argtypes = (PHIDP_PREPARSED_DATA,)
HidD_FreePreparsedData.restype = BOOLEAN

LPGUID = POINTER(GUID)

HidD_GetHidGuid = dll.HidD_GetHidGuid
HidD_GetHidGuid.argtypes = (LPGUID,)
HidD_GetHidGuid.restype = None