如何使用ctypes访问USB设备信息?

1 投票
1 回答
1185 浏览
提问于 2025-05-01 07:52

我正在用Python和ctypes来访问一些关于连接到电脑的USB设备的信息。请问我能从一个.dll文件中获取这些信息吗?我想知道一些像设备挂载位置、厂商等信息。

举个例子:

>>> import ctypes import windll
>>> windll.kernel32
<WindDLL 'kernel32', handle 77590000 at 581b70>

但是我怎么知道哪个.dll文件是正确的呢?我在网上查了查,但似乎没有找到相关的信息。

暂无标签

1 个回答

2

最后我用了一个更简单的方法。

我使用了Python自带的winreg模块来访问Windows注册表。HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices这个地方记录了所有已挂载的设备(无论是当前连接的还是不连接的)。所以我从这里获取所有设备的信息。要检查某个设备是否当前连接,我只需要用os.path.exists来查看这个设备的存储盘符(比如G:)。这个存储盘符可以从MountedDevices这个键里获取。

示例:

# Make it work for Python2 and Python3
if sys.version_info[0]<3:
    from _winreg import *
else:
    from winreg import *

# Get DOS devices (connected or not)
def get_dos_devices():
    ddevs=[dev for dev in get_mounted_devices() if 'DosDevices' in dev[0]]
    return [(d[0], regbin2str(d[1])) for d in ddevs]

# Get all mounted devices (connected or not)
def get_mounted_devices():
    devs=[]
    mounts=OpenKey(HKEY_LOCAL_MACHINE, 'SYSTEM\MountedDevices')
    for i in range(QueryInfoKey(mounts)[1]):
        devs+=[EnumValue(mounts, i)]
    return devs

# Decode registry binary to readable string
def regbin2str(bin):
    str=''
    for i in range(0, len(bin), 2):
        if bin[i]<128:
            str+=chr(bin[i])
    return str

然后只需运行:

get_dos_devices()

撰写回答