问题标签 [usb-mass-storage]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - 在WinXP中查找哪个驱动器对应哪个USB大容量存储设备
我有几个 USB 驱动器连接到 WinXP SP3 计算机,我需要以编程方式区分它们 -我需要找到哪个驱动器号对应于哪个设备(在这种情况下,一个设备〜一个卷)。我可以使用 获取他们的卷 ID 和驱动器mountvol
号,如下所示:
此外,使用devcon或设备管理器,我可以看到设备 ID:
但是,我还没有找到一种方法来链接设备 ID 和卷 ID/字母,就像“安全删除硬件”对话框一样(因此我认为这是可能的):
(来源:piskvor.org)
如您所见,这些设备与我在 devcon 中看到的设备相同,并且与 mountvol 看到的卷相同;但到目前为止,我还没有找到它们之间的联系。
我发现了一些相关的 问题,但这些问题似乎使用“你首先找到的是你的 USB 设备”的方法,这在我的情况下不是很有用,因为会有几个类似的设备(相同的供应商,通常是相同的产品类型) 连接的。
编辑:
@MSalters的回答看起来很有希望:在 XP 上,HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
有REG_BINARY
值\DosDevices\x:
(x
[AZ] 在哪里);注释是正确设备的 (UTF-16) 名称(例如
\DosDevices\A:
= " \??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\"
,对应于
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
上面在设备列表中看到的)。
会看看这是否是要走的路。
winapi - 为什么移除多卷 USB 设备时只有一条 WM_DEVICECHANGE 消息?
我正在编写一个应用程序,通过侦听WM_DEVICECHANGE 消息来检测某个 USB 大容量存储设备何时插入以及何时拔出。
我还注册了我的应用程序来监听WM_DEVICECHANGE
消息DBT_DEVTYP_DEVICEINTERFACE
(使用RegisterDeviceNotification API 调用),当插入或拔出 USB 大容量存储设备时,我会同时收到DBT_DEVICEARRIVAL
和消息。DBT_DEVICEREMOVECOMPLETE
现在,当插入具有多个卷的 USB 设备,然后再拔下时,就会出现问题。
插入设备后,我收到以下消息:
WM_DEVICECHANGE
(DBT_DEVICEARRIVAL
类型DBT_DEVTYP_DEVICEINTERFACE
)WM_DEVICECHANGE
(DBT_DEVICEARRIVAL
类型DBT_DEVTYP_VOLUME
)WM_DEVICECHANGE
(DBT_DEVICEARRIVAL
类型DBT_DEVTYP_VOLUME
)
以及拔出时的以下消息:
WM_DEVICECHANGE
(DBT_DEVICEREMOVECOMPLETE
类型DBT_DEVTYP_VOLUME
)WM_DEVICECHANGE
(DBT_DEVICEREMOVECOMPLETE
类型DBT_DEVTYP_DEVICEINTERFACE
)
因此,即使有两卷,也只有一条删除消息。为什么??
我有两个问题:
- 如何将
DBT_DEVTYP_DEVICEINTERFACE
消息与DBT_DEVTYP_VOLUME
消息相关联(本质上,我如何知道哪个VOLUME消息对应于哪个DEVICEINTERFACE消息 - 因为我为设备获取了它们)? - 有没有办法让 Windows 通知我两个卷删除?
usb - Accessing backing storage file from both Host machine and emulating machine when using USB Gadget
I have an embedded machine that is running g_file_storage. I would like to be able to access the backing store in read only mode from the machine while g_file_storage is running and a host machine is dropping files into this backing store.
Any idea how one can achieve that? I know that it is not advisable, but would like to try it anyway, and I simply need read access. Won't need to modify the backing store while it is connected
linux - 在Linux中查找哪个驱动器对应哪个USB大容量存储设备
我有几个 USB 大容量存储闪存驱动器连接到 Ubuntu Linux 计算机(Ubuntu 10.04.1,内核 2.6.32-25-386),我需要以编程方式区分它们(如果可能,从 bash,但我不害怕或者编译) - 我需要找到哪个块设备对应于哪个物理设备(例如/dev/sdb1
- > USB端口1中的设备;在我的情况下,一个设备〜一个卷)。
换句话说,我知道我有三个硬件设备插入 USB 端口;它们中的每一个都在系统中显示为 USB 大容量存储设备(如 lsusb 所示),被创建为块设备 ( /dev/sdb1
) 并由 UUID ( /media/1234-5678
) 自动挂载。
我不是试图找到块设备和挂载点之间的关系;我正在尝试查找块设备和USB设备之间的关系,有没有办法?
为什么?磁盘上会有一些写入,完成时间不可预测。我需要给操作员一些指示,例如“您现在可以移除端口 2(左起第二个)中的磁盘”。我已经找到了哪个物理端口对应于该特定机器上的哪个端口号,并且从挂载点查找块设备很简单;现在我坚持将逻辑 USB 端口映射到块设备。
我可以看到带有 lsusb 的磁盘:
我可以看到它们已安装(通过它们的 UUID):
现在,所有驱动器都是来自同一制造商的相同型号,所以我无法区分它们,我不能保证它们会以特定顺序插入。
我找到/sys/bus/usb/devices
了(USB 设备列表),但它似乎与我从 lsusb 获得的数据相同 - 我没有看到那里的磁盘映射。
还有/sys/block/sdb
and /sys/block/sdb/sdb1
(块设备及其第一个分区;与sdc
and类似sdd
),但同样,我没有看到到设备的映射。
linux - 文件级 USB 大容量存储
挑战:我有一个 Linux 手持设备,它记录数据并将其存储到磁盘中。它应该通过 USB 与 Windows 应用程序交换这些数据。当用户可以访问此数据时(例如通过 USB 大容量存储),必须对其进行加密。它应该开箱即用,适用于各种操作系统,也适用于 citrix 终端会话等。
计划:我使用FUSE在用户空间创建一个文件系统,并通过大容量存储将其提供给 Windows。每当 Windows 访问一个文件时,我都会收到一个回调并即时加密数据。此外,我们可以有一些动态内容——例如,当一些密码被写入文件时,会显示更多内容。
问题:当使用大容量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录)。为什么?
[...] 它提供了一个简单的接口来读取和写入数据扇区——很像用于访问任何硬盘驱动器的低级接口 [...]。操作系统可能会将 USB 驱动器视为硬盘驱动器,并且可以使用它们喜欢的任何文件系统对其进行格式化。(来自维基百科)
所以没有机会通过大容量存储来拥有动态文件系统......这似乎是为什么我的安卓手机在连接到 PC 时会卸载手机上的所有数据的原因。
选项:
- 在用户空间中创建一个“块设备” - 类似于 FUSE(当我想动态提供文件时,需要一个反向 FAT 驱动程序)
- 实现我自己的 nbd-server 以创建块设备(还需要反向 FAT 驱动程序吗?)
- 我将加密文件保存到一个分区,并将这个分区传递给大容量存储小工具(问题是性能和缺乏动态交互)
- 不要提供大容量存储设备并注意其他想法(eth over USB)
目前,只有最后一个选项似乎是现实的 - 或者你有另一个提示给我吗?
我将感激不尽!
查理
windows - USB 大容量存储设备的制造商字符串和产品字符串
我想提取特定大容量 USB 设备的制造商字符串和产品字符串,比如说 C:。我可以通过枚举所有 USB 设备来提取制造商字符串和产品字符串,但现在我不知道如何将特定 USB 驱动器与制造商 ID 和产品 ID 相关联。我在 Windows 平台上并使用 Visual Studio 进行开发。
任何帮助将不胜感激。
法鲁克-
java - 以编程方式关闭 Android 设备上的 USB 存储
在许多安卓设备上,当设备插入计算机的 USB 端口时,甚至在某些 USB 充电设备上,手机会进入 USB 存储模式。当设备处于此模式时,android 应用程序无法访问 sdcard。是否有任何方法(1)检测设备何时处于此模式,以及(2)以编程方式关闭 USB 存储,至少暂时关闭,以便我的 android 应用程序可以访问 sdcard?
我看过其他 SO 问题,但答案还不够(例如,Android: Detecting USB)。
android - 如何在 Android 中以编程方式关闭 USB 大容量存储?
我想在 Android 中打开/关闭 USB 大容量存储。
我尝试了下面的代码。它不工作。有人可以帮我吗?
要禁用大容量存储,我使用了这个:
为了启用大容量存储,我使用了这个:
上面的代码虽然不起作用。我需要为此传递任何意图吗?
android - 安卓 USB 大容量存储
所以,我知道如何检测 USB 大容量存储设备的连接和断开连接。到现在为止还挺好。
但是现在我有一个问题,一旦我在我的应用程序中退出 USB 模式,MediaStore 开始扫描媒体,我等待扫描完成,然后我尝试从 MediaStore 访问一些内容。我存储图像和视频的 ID,并在扫描完成后尝试获取这些项目的 URI。
但是现在,当我使用存储的 ID 查询这些文件的 URI 时,一些文件的 URI 显示为空。这就是我的问题,因为他们不应该这样。
有没有人指出我错过了什么?
android - 当设备连接为大容量存储时,如何检测和处理我的应用程序?
我用 SD 资源开发游戏。当我将设备作为 MASS STORAGE 连接时,设备崩溃。这是因为当我将设备作为大容量存储设备插入 PC 时,设备无法访问 SD 卡。所以我尝试了不同的方法来解决。
目前我正在实现一个广播接收器,我正在处理动作 ACTION_MEDIA_BAD_REMOVAL(如果手动移除 SD 卡)和 ACTION_MEDIA_SHARED(如果设备作为大容量存储连接,它应该处理动作,但它没有)。
当检测到这两个操作时,我会发送一条错误消息并完成应用程序。
当我手动移除 SD 卡时,它可以工作,但不能作为大容量存储。
同样在每一帧上,我都会使用这种方法检查每一帧上的 SD 卡是否在设备上。
什么时候是 0 它没有 SD 卡,我也发送错误消息并完成应用程序。
但 Stills 在 USB 大容量存储模式下不起作用。
我的问题是:如何检测设备何时连接为 USB 大容量存储?
我应该使用哪些类?
我可以实现哪些侦听器来调用我的错误消息活动并完成我的应用程序?