问题标签 [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 回答
8838 浏览

c# - Pinvoke DeviceIoControl 参数

我正在使用DeviceIoControl. 我已经查阅了相关的Pinvoke.net 页面以获取我的签名:

我以前从未见过object,但MSDN 文档听起来很有希望:[MarshalAs(UnmanagedType.AsAny)]

一种动态类型,它在运行时确定对象的类型并将对象编组为该类型。该成员仅对平台调用方法有效。

我的问题是:使用此签名的“最佳”和/或“正确”方式是什么?

例如,IOCTL_STORAGE_QUERY_PROPERTYexpectedInBuffer是一个STORAGE_PROPERTY_QUERY结构。看来我应该能够定义该结构,创建一个new实例,并将其传递给我的 Pinvoke 签名:

但是,我只是System.ExecutionEngineException这样做了,所以我改为:

至少当我调用它时它没有抛出任何异常。那只是非常丑陋,而且是一个巨大的痛苦。编组器不能像我希望的那样处理向/从我的本地结构复制数据吗?

输出数据有时可能很棘手,因为它们不是固定大小的结构。我知道编组器不可能自动处理这个问题,而且我可以在需要的地方进行 HGlobal 和复制业务。

额外的:

这个问题起初看起来很有帮助,但最终只是一个不正确的常数。

我不反对使用unsafe构造。(fixed-sizestruct成员需要这个。)

0 投票
1 回答
820 浏览

c++-cli - DeviceIoControl works in C++ and C# but return ERROR_INVALID_FUNCTION when called in C++/CLI

I am trying to enumerate the MFT to get list of file names.

This code works when used in a Win32 project:

But when I use the same code in C++/CLI, DeviceIoControl gives false and GetLastError gives ERROR_INVALID_FUNCTION. When the same code is translated into C#, it works.

Any idea what is happening?

0 投票
1 回答
2596 浏览

c# - 如何通过 C#.net 中的 DeviceIoControl 使用 IOCTL_SCSI_MINIPORT?

我的任务是实施一个可靠的解决方案来检索硬盘驱动器的序列号。不幸的是,WMI 方法根本不可靠。所以我正在寻找另一种解决方案。

我找到了这个小软件,它完全符合我想在 C#.net 中实现的功能幸运的是,源代码也是可用的。

基本上我想ReadIdeDriveAsScsiDriveInNT在 C# 中实现来自 diskid32 的功能。

我如何与设备通信:

我如何创建句柄:

signedBuffer包含与 diskid32 示例中的缓冲区完全相同的字节!Diskid32 返回该句柄\\.\Scsi2:DriveNumber = 0结果,所以我使用相同的参数。

创建句柄时有所不同。我也尝试过 diskid32 中的内容。没有任何成功。

Win32Exception当我调用DeviceIoControlC#时,我总是得到一个,即Access denied. 有人有想法吗?

0 投票
0 回答
1282 浏览

c++ - 通过 DeviceIoControl 发送键盘输入

在过去的 3 个小时左右,我一直在尝试通过写入键盘设备来发送键盘输入。我已经成功找到并打开了键盘设备,但我卡在了最后一步。我不确切知道如何格式化 DeviceIoControl 参数,也不知道从哪里开始获取这些值。

目前,我在此处的另一个答案中发布了部分来自名为 Interception 的库的以下内容。我省略了所有设备打开的东西以节省空间。

如果在 DeviceIoControl 调用后调用 GetLastError,我会得到 ERROR_INVALID_FUNCTION(1) 的返回值。我认为这意味着 IOCTL_WRITE 不是正确的值,但我对如何找到正确的值一无所知,并且没有多少搜索让我更进一步。

0 投票
0 回答
1338 浏览

windows - 带有 IOCTL_DISK_GET_LENGTH_INFO 的 Windows DeviceIoContro() 需要很长时间

使用 IOCTL_DISK_GET_LENGTH_INFO 调用 DeviceIoContro() 在 Windows 中在未安装的驱动器上保持一分钟或更长时间。我正在尝试调查和打印在线驱动器的长度。这种保持行为在用户界面中是不可接受的。有没有人有解决这个问题的好方法?

我在 Windows 中使用物理磁盘名称调用,例如“\\.\PhysicalDrive0”。它停止的驱动器是 DVD 驱动器,即可移动驱动器。我不在乎 Windows 是否可以在足够的时间内启动驱动器。实际上,驱动器中没有磁盘,Windows 显然等待了很长时间才能尝试使驱动器上线。如果驱动器没有旋转,我希望它立即失败。

提前致谢。

斯科特·摩尔

代码是:

int testsize( /** 要设置的驱动器号/ int drive, / * 返回磁盘大小 */ long long *size )

{

}

0 投票
0 回答
1253 浏览

windows-8 - DeviceIoControl() 函数在 Windows 7 和 Windows 8 中的工作方式不同

我正在尝试使用 DeviceIoControl 功能获取硬盘串行。并使用相同的参数调用它,它会在输出缓冲区中给出不同的值。

我把它称为

其中 hPhysicalDriveIOCTL = CreateFile (TEXT(deviceName), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

0 投票
1 回答
1091 浏览

c++ - OID_802_11_BSSID_LIST 的 DeviceIoControl 错误 87

我正在尝试从网络 GUID 获取可用的访问点,但我总是收到 DeviceIoControl() 的错误 87(错误参数)。这让我疯狂了一段时间,因为我不知道哪个参数是错误的!我已经搜索了几个小时,但找不到解决方案。代码如下:

我正在尝试使用 wsGuid = L"\\.\{8D36491D-C393-4D71-B10A-153C4FA69AEE}" 获取此列表,这是一个 Broadcom 802.11n 网络适配器。

编辑:我在 Win7 工作中尝试它。我知道它已被弃用(因此我还使用 WlanGetNetworkBssList() 为更高版本添加了可移植性,并且运行良好)。我在调试旧版本时遇到错误(在同一个 win7 工作站中),问题可能是:如果代码正确,NDIS IOCTL 是否仍在 Win7 及更高版本中工作?

0 投票
1 回答
326 浏览

winapi - 调试 USB 读取

我正在调试一些使用第 3 方 64 位 DLL 访问自定义 USB 设备的代码。我的环境是 Windows 8.1 x64 上的 Microsoft Visual Studio 2012。

根据不完整且不可靠的文档,DLL 应该发出 USBDEVFS_CONTROL ioctl 以从连接的 USB 设备读取 1 个字节。该定义涉及

这里bmRequestType, bRequest, wValue, 和wIndex是设备制造商提供的常量,是包含特定命令ByteArray的缓冲区。uint8_t[64]

DLL 接受特定于应用程序的参数,将它们打包到ByteArray, 并调用ksproxy.ax-> Kernelbase.dll-> ntdll.dll。我在用户模式下看到的最后一个反汇编是

根据文档,使用分步调试器,我可以很容易地看到它的ByteArray构造完全符合预期。但我找不到该usbdevfs_ctrltransfer结构或其 Windows 等效项。

具体来说,我们怀疑wIndex文档中指定的 的值适用于旧版本的硬件,并且 Windows DLL 实际上使用0x0400而不是0x0402.

任何提示(包括硬件或软件 USB 嗅探器、仿真器等)我们如何尝试验证此无符号短路将不胜感激。

更新

阅读https://reverseengineering.stackexchange.com/questions/2416/how-to-reverse-engineer-simple-usb-device-windows-linuxhttps://reverseengineering.stackexchange.com/questions/1786/usb-dongle - 交通监控。看起来这些工具与 Windows 8.1 x64 不兼容。

0 投票
1 回答
1731 浏览

c++ - SCSI INQUIRY 命令的 DeviceIoControl 返回错误 50

我正在尝试通过 IOCTL 命令访问 USB 扫描仪。这是在 Windows 7 上的。我之前没有处理过 IOCTL 编码,所以我首先根据我通过快速搜索找到的内容尝试了以下代码段。

我尝试了 Windows 7 的 32 位和 64 位版本,但两者的结果相同(错误 50:不支持该请求。)。有趣的是,第二个 DeviceIoControl 调用起作用并返回设备的 VID/PID 以及固件版本。

根据错误消息,我认为不支持此 IOCTL。但是,我调查了一下,发现这个 IOCTL 代码对于所有设备都是强制性的,所以一定是我做错了什么。应该如何修改此代码以使 INQUIRY 命令成功?

0 投票
1 回答
379 浏览

c++ - 查找文件的最后一个簇

我试图找到目标文件的最后一个集群并从中读取二进制数据。我从 CreateFile() 开始,并在 DeviceIoControl() 中使用了控制代码 FSCTL_GET_RETRIEVAL_POINTERS 的结果。

所以我真的不知道下一步该怎么做。如果我从中显示LARGE_INTEGER LcnRETRIEVAL_POINTERS_BUFFER我会得到一个代表当前范围的巨大数字。我也出现了一个开关错误情况,NO_ERROR因此我假设所有集群数据都已成功读取。Lcn号怎么办才能帮我找到文件的最后一个簇?