问题标签 [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.
c# - Pinvoke DeviceIoControl 参数
我正在使用DeviceIoControl
. 我已经查阅了相关的Pinvoke.net 页面以获取我的签名:
我以前从未见过object
,但MSDN 文档听起来很有希望:[MarshalAs(
UnmanagedType.AsAny
)]
一种动态类型,它在运行时确定对象的类型并将对象编组为该类型。该成员仅对平台调用方法有效。
我的问题是:使用此签名的“最佳”和/或“正确”方式是什么?
例如,IOCTL_STORAGE_QUERY_PROPERTY
expectedInBuffer
是一个STORAGE_PROPERTY_QUERY
结构。看来我应该能够定义该结构,创建一个new
实例,并将其传递给我的 Pinvoke 签名:
但是,我只是System.ExecutionEngineException
这样做了,所以我改为:
至少当我调用它时它没有抛出任何异常。那只是非常丑陋,而且是一个巨大的痛苦。编组器不能像我希望的那样处理向/从我的本地结构复制数据吗?
输出数据有时可能很棘手,因为它们不是固定大小的结构。我知道编组器不可能自动处理这个问题,而且我可以在需要的地方进行 HGlobal 和复制业务。
额外的:
这个问题起初看起来很有帮助,但最终只是一个不正确的常数。
我不反对使用unsafe
构造。(fixed
-sizestruct
成员需要这个。)
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?
c# - 如何通过 C#.net 中的 DeviceIoControl 使用 IOCTL_SCSI_MINIPORT?
我的任务是实施一个可靠的解决方案来检索硬盘驱动器的序列号。不幸的是,WMI 方法根本不可靠。所以我正在寻找另一种解决方案。
我找到了这个小软件,它完全符合我想在 C#.net 中实现的功能。幸运的是,源代码也是可用的。
基本上我想ReadIdeDriveAsScsiDriveInNT
在 C# 中实现来自 diskid32 的功能。
我如何与设备通信:
我如何创建句柄:
signedBuffer
包含与 diskid32 示例中的缓冲区完全相同的字节!Diskid32 返回该句柄\\.\Scsi2:
和DriveNumber = 0
结果,所以我使用相同的参数。
创建句柄时有所不同。我也尝试过 diskid32 中的内容。没有任何成功。
Win32Exception
当我调用DeviceIoControl
C#时,我总是得到一个,即Access denied
. 有人有想法吗?
c++ - 通过 DeviceIoControl 发送键盘输入
在过去的 3 个小时左右,我一直在尝试通过写入键盘设备来发送键盘输入。我已经成功找到并打开了键盘设备,但我卡在了最后一步。我不确切知道如何格式化 DeviceIoControl 参数,也不知道从哪里开始获取这些值。
目前,我在此处的另一个答案中发布了部分来自名为 Interception 的库的以下内容。我省略了所有设备打开的东西以节省空间。
如果在 DeviceIoControl 调用后调用 GetLastError,我会得到 ERROR_INVALID_FUNCTION(1) 的返回值。我认为这意味着 IOCTL_WRITE 不是正确的值,但我对如何找到正确的值一无所知,并且没有多少搜索让我更进一步。
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 )
{
}
windows-8 - DeviceIoControl() 函数在 Windows 7 和 Windows 8 中的工作方式不同
我正在尝试使用 DeviceIoControl 功能获取硬盘串行。并使用相同的参数调用它,它会在输出缓冲区中给出不同的值。
我把它称为
其中 hPhysicalDriveIOCTL = CreateFile (TEXT(deviceName), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
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 及更高版本中工作?
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-linux和https://reverseengineering.stackexchange.com/questions/1786/usb-dongle - 交通监控。看起来这些工具与 Windows 8.1 x64 不兼容。
c++ - SCSI INQUIRY 命令的 DeviceIoControl 返回错误 50
我正在尝试通过 IOCTL 命令访问 USB 扫描仪。这是在 Windows 7 上的。我之前没有处理过 IOCTL 编码,所以我首先根据我通过快速搜索找到的内容尝试了以下代码段。
我尝试了 Windows 7 的 32 位和 64 位版本,但两者的结果相同(错误 50:不支持该请求。)。有趣的是,第二个 DeviceIoControl 调用起作用并返回设备的 VID/PID 以及固件版本。
根据错误消息,我认为不支持此 IOCTL。但是,我调查了一下,发现这个 IOCTL 代码对于所有设备都是强制性的,所以一定是我做错了什么。应该如何修改此代码以使 INQUIRY 命令成功?
c++ - 查找文件的最后一个簇
我试图找到目标文件的最后一个集群并从中读取二进制数据。我从 CreateFile() 开始,并在 DeviceIoControl() 中使用了控制代码 FSCTL_GET_RETRIEVAL_POINTERS 的结果。
所以我真的不知道下一步该怎么做。如果我从中显示LARGE_INTEGER Lcn
,RETRIEVAL_POINTERS_BUFFER
我会得到一个代表当前范围的巨大数字。我也出现了一个开关错误情况,NO_ERROR
因此我假设所有集群数据都已成功读取。Lcn号怎么办才能帮我找到文件的最后一个簇?