问题标签 [deviceiocontrol]

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.

0 投票
1 回答
513 浏览

kernel32 - Kernel32.dll - DeviceIOControl 在 Win 10 中尝试获取字符串描述符时返回 false

我目前正在使用 kernel32.dll 中的 DeviceIOControl API 来获取已连接 USB 设备列表的字符串描述符。

我们使用此函数来获取描述符详细信息,例如语言 ID、序列号、制造商和产品字符串。仅在请求序列号时,返回的状态为 TRUE,我们得到预期值。但语言 ID、制造商和产品字符串的状态返回 false。

我使用以下方法检查了 DeviceIoControl 返回的错误状态:

它返回 31 作为错误代码,这意味着设备无法正常工作/设备的驱动程序未正确安装。

我尝试了所有明显的解决方案,例如重新安装设备的驱动程序并重新启动 PC 等,但似乎没有一个有效。我确信设备或代码中没有问题,因为它在 Windows 7 PC 中完美运行。另外,由于我能够获得序列号,我认为设备句柄也是正确的。

我无法继续进行任何进一步的调试。Windows 10 中的 DeviceIoControl 功能是否有一些更新?还是在 Windows 10 中更改语言 ID、制造商和产品字符串的方式?

0 投票
1 回答
2847 浏览

windows - 如何通过直接在设备上执行 DeviceIoControl() 来获取 USB 设备描述符?

我想在我的系统上获取 USB 设备的设备描述符。我正在 Windows 中创建一个用户空间应用程序(非托管,本机 c++)。从这些描述符中,我想识别广告牌设备并解析广告牌功能描述符(解析 bos 描述符)。

这是我的方法。

  1. 通过以下方式获取系统上的 USB 设备SetupDiGetClassDevs(&GUID_CLASS_USB_DEVICE,...)
  2. 使用获取每个设备的设备路径SetupDiGetDeviceInterfaceDetail()
  3. 在设备路径上使用CreateFile()以获取设备的句柄。
  4. 使用和句柄发出IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTIONIOCTL以获取设备描述符。DeviceIoControl()

我被困在第四步(getLastError() - Invalid Function)。
其他项目(例如来自 Intel 的示例代码),枚举系统上的所有 USB 控制器、根集线器、端口和接口,并在根集线器的句柄上发出 IOCTL,指定设备连接到的端口号。

我不想关心系统的 USB 层次结构。使用设置 API 在系统中获取 USB 设备更不容易出错且更容易。但是,我在任何地方都看不到直接向他们发出 IOCTL。

更新1

来自docs.microsoft.com:I/O
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION控制请求检索与指定端口索引关联的设备的一个或多个描述符。此请求以 USB 集线器设备(GUID_DEVINTERFACE_USB_HUB) 为目标。因此,这个可以为我提供 USB 设备的设备描述符的 ioctl 应该由 USB 集线器处理,而不是由 USB 设备处理。

因此,其他解决方案将集线器的句柄传递给 DeviceIoControl(),如Intel 源代码的第 68 行所示(在此处链接)。

相反,我想使用上面第 3 步(设备的句柄)中获得的句柄来获取设备描述符。因此,IOCTL 可能不同,或者可能有一种方法可以获取集线器的句柄,以及使用 USB 设备的句柄连接设备的端口索引。

在我看来,设备描述符是 USB 设备的固有属性,因此必须有一种方法可以直接从 USB 设备获取它。

0 投票
1 回答
1010 浏览

python - 在 win32file.DeviceIoControl 上解压结构

我正在尝试理解和使用 win32file。我需要获取 USN 期刊,并且很难理解我在网上找到的代码片段。这是我找到的代码片段 -

现在,当谈到 C 和它的结构时,我真的很生疏。我现在所理解的format是 96 字节缓冲区,它将从DeviceIoControl

所以我试图改变格式来'QQQQQQQQQQQQQQQQQQQ'看看会发生什么(看看是因为我对实际发生的事情一无所知),结果out_buffer这次我得到了更大的结果。所以我想打开它-

令我惊讶的是,我得到了——

所以我添加了另一个“Q”来增加大小并得到相同的结果。我不明白为什么“qqqqqLLLLqqqqq”有效而“QQQQQQQQQQQQQQQQQQQ”无效。所以我的问题是——

  • 我的理解是,如果缓冲区大于输出,我们可以解包,那么为什么解包不起作用?

  • 每次我想从 DeviceIoControl 中获取一些东西时,我是否必须记住这些格式?

向我指出资源也是一个额外的好处,因为我需要在代码的基础上阅读 USN 期刊,而且我认为 hit-and-try 不会让我到任何地方

0 投票
2 回答
735 浏览

c++ - 给定文件的“参考号”,获取文件的完整路径

我想使用 Windows 的更改日志来跟踪一些文件更改。我设法使用示例代码访问所述日记并从中读取记录。我现在面临的问题是该记录只包含相关文件名,而不是它的绝对路径。我尝试将 FSCTL_GET_NTFS_FILE_RECORD 与 DeviceIoControl 一起使用来检查我是否可以通过这种方式获取绝对路径,但是对 DeviceIoControl 的调用总是返回相同的文件记录,缓冲区中有“FILE0”,并且我给它的参考号没有它的 HighPart(例如,我给出的参考编号为 0x001400000015adec,当函数返回时,输出的参考编号为 0x000000000015adec)。

这是我的代码(我在 Windows 10 上运行)

有什么我做错了吗?还是有另一种方法可以使用 USN_RECORD 实例获取文件的完整路径?

0 投票
0 回答
303 浏览

scsi - 物理驱动器上 SCSI 读取 (10) 的最大传输大小

请参阅此处,IOCTL_STORAGE_QUERY_PROPERTY 和 StorageAdapterProperty 可用于获取每个 SCSI Read(10) 命令的最大传输大小。

这段代码中,从 lba 开始读取 16 个扇区。我尝试修改数字,在我的 Win7 环境中,最大数字是通过 SATA 的 256 个扇区和通过桥接器(SATA-USB)到 SSD 的 128 个扇区,这与使用 IOCTL_STORAGE_QUERY_PROPERTY 和 StorageAdapterProperty 的结果相匹配。

据我所知,在安装操作系统(win7、win10、macOS)时,设备最多可以接收 2048 个扇区的 SCSI Read(10) 命令。我想知道哪一层限制了传输大小(操作系统/设备驱动程序......),有没有办法绕过该层以一次发送超过限制的 SCSI Read(10) 命令?

0 投票
0 回答
241 浏览

windows - 如何使用 CreateFile("\\\\.\\LCD") 打开所有连接的 LCD 显示器的句柄?

DeviceIOControl()用来向设备驱动程序发送 IOCTL 系统请求。我的问题是它的第一个参数,设备路径

例如,要打开一个监视器句柄,我可以使用路径名 ,"\\\\.\\LCD"创建句柄 usingCreateFile()并将此句柄放入DeviceIOControl().

但是,由于我有 2 台显示器连接到我的笔记本电脑,我想知道 Windows 上的LCD 设备命名约定。如何命名第二个 LCD 设备路径以打开另一个句柄,或枚举所有 LCD 设备路径(如果我有更多)?

此外,是否可以使用 Windows 内置应用程序查找所有设备路径?

提前致谢。

0 投票
0 回答
1413 浏览

c - 我将如何读取 C (*not* C++) 中的 NTFS 主文件表?

我需要一种简单、轻量级的方法来读取 Windows 服务器上的 NTFS MFT,仅使用 C。我的目标是以编程方式为我的公司正在构建的应用程序返回一组目录及其权限。

我在 StackOverflow 和其他地方研究过的所有其他答案都涉及使用 C++ 或其他语言,并且通常非常臃肿。我很确定只需几行代码就可以完成我想要的工作,使用 Windows API 调用 CreateFile(获取根卷的句柄)和 DeviceIoControl(读取 MFT)。但我找不到一个简单的 C 解决方案来做到这一点。

请注意,尽管我多年来一直是 C#/.NET 开发人员(并且还了解其他语言,包括 Java 和 Python),但我对低级 C 编程和 Windows API 调用还是相当陌生。我也意识到也有一个免费的 Mft2Csv 可以做到这一点。但是我无法使用实际的源代码进行逆向工程(GitHub 只有可执行文件和支持文件)。

我还意识到我可以使用 C# .NET 命名空间 System.IO 和 System.Security.AccessControl 来解析目录树。但这对于我的目的来说太慢了。

0 投票
0 回答
274 浏览

deviceiocontrol - Windows 10 中是否有与 deviceiocontrol 相关的任何变化?

在 windows 10 上使用命令 CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_USB_INDEX(0x0000) + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) 调用 ::DeviceIoControl 时收到错误代码 6。在 windows 10 版本 1809 上出现错误,但相同的代码在 windows 10 版本 1803 上运行。 windows 10补丁有变化吗?我正在与 USB 端口上的硬件通信。

0 投票
2 回答
1300 浏览

winapi - 创建符号链接 - 重解析点缓冲区中存在的数据无效

目标:使用带有 FSCTL_SET_REPARSE_POINT 的 DeviceIoControl 创建符号链接

我知道有CreateSymbolicLink WinApi 调用,它可以工作,但我不能将它用于我的目的。

问题:当我调用 DeviceIOControl(hNewSymLink,FSCTL_SET_REPARSE_POINT ...

'c:' 驱动器是 NTFS,操作系统是 Windows 10,我正在以管理员身份进行调试。

最初,我尝试按照https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/b41f1cbf-10df-4a47-98d4-1c52a833d913将 REPARSE_DATA_BUFFER 放在一起 以达到上述效果。

在 test3() 中,我阅读了良好符号链接的结构并尝试使用它来创建新的,但结构被拒绝,再次出现相同的错误。

当我检查结构时,它看起来很好。文档声明相同的 REPARSE_DATA_BUFFER 用于获取和设置,因此我希望能够使用从现有符号链接(使用 MKLINK 系统命令创建)检索到的格式良好的结构来创建另一个。

显然我错过了一些东西 - 任何提示将不胜感激。

0 投票
1 回答
69 浏览

usb - 有没有办法强制 Windows 重新读取 USB DeviceDescriptor?

我的 CDC USB 设备上需要 8 位带外数据(配置/噪声读数),我想我可以bcdDeviceDeviceDescriptor...事件”——即使你DeviceIOCtl在集线器上使用“重新读取” DeviceDescriptor​​(它不会在我的设备中遇到断点,并且在插入后它会坚持一个常量 bcdDevice——我知道 MSB 需要>2,但似乎都被缓存了)。

A.有没有办法“强制”Windows 重新读取bcdDevice(最好在端口打开时)?或者任何其他字符串或字节(它们似乎都被缓存了)?

B.有没有办法“强制”Windows阅读(并接受逐字记录的内容)BaudRate(我想我可以使用BaudRate状态的MSB,但Windows不相信这是一个有效的数字,所以它只是报告“9600,我猜”——除非我关闭并重新打开端口,否则不会读取它——然后它会尝试设置波特率而不被告知)?

C.在没有 Windows 玩愚蠢游戏的情况下,有没有其他方法可以让我的设备输入/输出 1 个字节?我真的不希望我的设备显示为 2 个 com 端口(一个用于配置,一个用于数据),但是我必须弄清楚哪个是哪个,这会让用户感到困惑——任何其他寄存器/USB 消息——DSR, CTS, RI, CD但我需要再输入 4 位,至少输出 3 位——而且它需要是“原始的”——没有“如果CD,那么DSR必须是 OK”——(一旦配置,“ UseTermination/ InvertData/ DriveStrength" 存储在设备的闪存中,所以它只是一个串行端口,但我需要读取 " noiselevel" [8 bits req'd],并设置这些寄存器——仅在请求时!——在调试设备时) ...