问题标签 [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 投票
0 回答
131 浏览

c++ - NTFS 系统中的最后一个集群

我需要澄清一下如何找到文件的最后一个簇。以下是一些关于我如何获取集群信息的代码片段。

我不确定我是否找到了正确的集群。为了找到最后一个集群,我首先找到了最后一个集群的大小Extents[lastExtentN].NextVcn.QuadPart-Extents[lastExtentN - 1].NextVcn.QuadPart然后我找到了Extents[lastExtentN].Lcn.QuadPart+ lengthOfCluster- 1 的位置。例如,在我的输出中,我得到:

我的代码和输出有意义吗?输出的数字是否以字节为单位?

0 投票
3 回答
892 浏览

c# - C# 调用具有复杂结构的 deviceIOControl

所以我正在尝试编写一个 C# 包装器来与我们的设备驱动程序之一对话。(创建单元测试)驱动程序是新的,但针对旧的 c++ 标头进行编码,因此定义了结构布局,并且不能真正改变。

所以我复制了设备期望 DeviceIOControl 传入的 c++ 结构。

更新 #3 - 将代码更改为具有相同问题的演示代码。还清理了问题以对其他人更有用,请参阅下面的答案

我的调用deviceIOControl失败,因为在驱动程序端它检查传入的缓冲区的大小。在 C# 端,我的对象太小,无法Marshal.SizeOf()返回52大小,当它应该是时852,如果我添加Size=StructLayout属性,该函数将“通过”,但我相当确定数据未正确传递。

我相当确定问题是public Points[] p = new Points[10];我认为 Marshal.StructToPtr() 没有正确编组它,因为它本质上是一个多维数组。

所以我想我的问题可能吗?似乎 C# 可能足够聪明,知道如何在内存中为该结构数组创建适量的空间.. 但也许不是?

我认为“可行”的替代方案。

  1. 编写自定义 serailizer,将对象转换为 byte[] 并返回,元数据为零。- 不理想。

  2. 是否可以编写一个混合的 clr c++ dll 并尝试将其用作楔子。但是我担心的是,我是否会遇到同样的问题,但只是在托管 c++ 中?或者即使在混合模式下,我也必须编写一个托管类来包装非托管对象以在 c# 中使用它。但是问题变成了如何将它传递给 deviceIOcontrol,如果我从 c# 中执行它,那么当前的问题是否会尝试正确编组?或者,如果我将它传递给调用 DeviceIOControl 的 C++ 调用,那么我需要知道如何获取传入的每个管理对象的未管理类型。

  3. 只需编写创建对象并调用 deviceIOControl 的 c++ 函数,更少的想法是参数可能会失控?

  4. 放弃并用 C++ 完成这一切,我实际上正在尝试为我的硬件编写单元测试,而 VS 中较新的 cpp 单元测试确实集成得相当好......

我也看到了这个较早的问题,并尝试了一下,但我认为我的场景有点不同。取消/编组包含结构数组的嵌套结构

更新 2 我应该澄清我正在尝试向驱动程序发送一个对象,而不是收到一个返回(至少还没有)

这就是我所说的。

0 投票
2 回答
3120 浏览

asynchronous - How to call DeviceIOControl code asynchronously?

I am trying to call DeviceIO functions asynchronously by using the OVERLAPPED structure as described on MSDN. I am using the FSCTL_ENUM_USN_DATA control code to enumerate the MFT of NTFS drives but i am not able to run it asynchronously. The file handle is created with FILE_FLAG_OVERLAPPED but there is no difference whether I use the overlapped structure with FILE_FLAG_OVERLAPPED or not. The function does not return immediately. Is seems to be synchronous in both cases. The example below shows the enumeration of the first 100.000 MFT entries on the C:\ drive. Since I am not so familiar with the usage of overlapped structures maybe I did something wrong. My question: How can I execute DeviceIoControl(hDevice, FSCTL_ENUM_USN_DATA,...) asynchronously? Thanks for any help.

0 投票
1 回答
549 浏览

c - 如何从 WinCE 5.0 的 Debug Serial 端口读取数据?

在我的项目中,我需要通过调试串行端口将一些命令输入到我的 WinCE 设备中。但是我发现我只能使用“printf”或“RETAILMSG”来输出我的调试信息,但我不能简单地调用“scanf”来获取调试串口的数据。

通过查找 MSDN,我发现了一个名为“OEMReadDebugByte”的函数。它是 WinCE 的 KERNEL 函数,但是当我尝试在我的 WinCE 应用程序中调用此函数时,Platform Builder 发布“错误 LNK2019:函数 wmain 中引用的无法解析的外部符号 OEMReadDebugByte

我可以在 KernelIoControl 中使用插入案例吗?如何 ?哪个文件定义了“KernelIoControl”?

或者......还有其他解决方案吗?

非常感谢!!!

谢谢!

0 投票
3 回答
2392 浏览

c++ - 获取 GPT 磁盘上 C++ 中特定分区的分区类型

我正在开展一个项目,该项目要求我在 Windows 驱动器上进行低级别操作,并且主要使用 Windows API 调用来执行此操作。但在我可以对驱动器进行操作之前,我需要知道其上存在的分区类型。

这在 MBR 格式化的磁盘上相当简单,因为

返回格式为的结构DRIVE_LAYOUT_INFORMATION_EX,其中包含 的数组PARTITION_INFORMATION_EX。在 MBR 磁盘上,该PARTITION_INFORMATION_EX.Mbr.PartitionType元素包含分区类型的唯一标识符,例如 for NTFSit is 0x07,for Extendedit is 0x05

但是,这在 GPT 磁盘上并不是那么简单。我知道我可以从 partition 的开头读取标识符,但我更喜欢使用 API 调用来处理这个问题,例如DeviceIoControl. 当我DeviceIoControl在 GPT 磁盘上运行时,它PARTITION_INFORMATION_EX.Mbr.PartitionType包含的值与通常存在的值完全不同。

请注意,GUID 对我来说毫无用处,因为它只告诉我分区的用途,而不告诉我它是什么类型的分区。我正在尝试确定驱动器是否为 NTFS、FAT 等。

0 投票
1 回答
1482 浏览

c++ - 如何通过 C++ 程序在 Windows server 2008/2012 上初始化磁盘

我们正在尝试通过 C++ 程序使用 Windows 服务器 2008/2012 上某些现有磁盘的属性来初始化磁盘。

我们正在使用磁盘管理控制代码DeviceIoControl()中的方法和IOCTL_DISK_CREATE_DISK代码IOCTL_DISK_SET_DRIVE_LAYOUT_EX, IOCTL_DISK_SET_PARTITION_INFO_EX来使磁盘可用。

通过搜索得到以下代码片段

除了最后一个带有错误 1 ​​的代码(即不正确的函数)之外,所有的调用DeviceIoControl()都成功了。IOCTL_DISK_SET_PARTITION_INFO_EX这可能是什么原因?

如果我们注释掉最后一个调用,磁盘被初始化为原始磁盘,但这不符合我们的要求。

以上示例仅适用于 MBR 分区样式。我们找不到 GPT 的任何样本,...样式。如果有人知道,请给一个链接。

0 投票
0 回答
763 浏览

c# - 用于 I2C 的 DeviceIoControlCE

几天来,我一直在努力解决一个问题。我需要你的帮助。

我正在尝试从运行 Windows CE7 的板上连接到 I2C。该板是边界设备Nitrogen6X。

我正在尝试用 C# 编写代码。

经过大量的谷歌搜索和反复试验,我现在可以用 I2C 完成几乎所有的事情(我的意思是我将大多数命令包装在有效的方法中)。当然,我还不能做的一件事是阅读/写作。我一直在尝试一些不同的实现,移植据说可以工作的 C 和 C++ 代码。无济于事。目前我正在将更多的精力放在我将在这里复制的两个实现上。

这些实现都不适合我。两者都进入错误管理部分,并且都报告错误号 87 (ERROR_INVALID_PARAMETER)。

有没有人在这类问题上有经验?有人能指出我做错了什么吗?

编辑 1:我可能应该提到,我试图通过简单地将示波器插入到板上的 I2C3:SDA 和 SCL 引脚上“查看”一些信号。I2C 总线上没有连接实际设备。我希望这会在发送第一个字节(地址+读/写)后给我一些错误,因为不会收到确认位。但是,我在代码中看到了错误 87,并且从示波器看到的信号没有变化(两者都在空闲时保持高电平)。

(代码片段如下)

第一个使用指针和东西,可能更接近 C++ 代码:

我正在处理的第二个选项是在托管和非托管之间编组:

编辑 2:我拥有的(据称)工作代码(我无法运行)来自我获得的驱动程序,它可能是部分专有的(因此我无法共享)。但是我在网上找到了 I2C 总线的标头,其中包含以下定义:

我最初尝试将“null”赋予参数,因为它在这里完成,但我仍然得到相同的错误代码。

编辑 3:来自同一个驱动程序,结构定义:

编辑 4:我尝试实现将 a 传递ref给我的结构的版本,正如@ctacke 在他的评论中所建议的那样。我仍然得到同样的错误,所以我想我一定做了与他想象的不同的事情。这是片段:

编辑5:
我在网上找到(http://em-works.googlecode.com/svn/trunk/WINCE600/PLATFORM/COMMON/SRC/SOC/COMMON_FSL_V2_PDK1_9/I2C/PDK/i2c_io.cpp)以下代码:

我不能声称理解 100%,但根据 Windows 命名约定(http://msdn.microsoft.com/en-us/library/windows/desktop/aa378932(v=vs.85).aspx)它会看来我应该发送的大小参数是我传输的总字节数,包括所有内容。我试图自己弄清楚这个数字,但到目前为止我还不能。或者,我想可以尝试对必须将它们转换为字节数组的结构做一些事情。只有我猜它需要有一个特定的字节顺序才能让系统理解它。
任何人都可以参与其中吗?

0 投票
1 回答
1811 浏览

c - 使用 DeviceIoControl 从应用程序向驱动程序发送数据

我可以将数据驱动程序发送到应用程序。

在应用程序中:

在驱动程序中:

结果打印"eeee"在应用程序控制台中。

但我不知道如何将应用数据发送给驱动程序。DeviceIoControl的3、4个参数是输入缓冲区和长度。
如果我char InputBuffer[1024] = "InputBuffer's data";在应用程序中添加,驱动程序如何接收此数据?我想用DbgPrint()用于来自应用程序的接受数据。


我想选择答案。请回答不评论。

0 投票
2 回答
309 浏览

c++ - 释放 DeviceIoControl 分配的内存

当调用DeviceIoControlwith 时,它用指向一些数据(数组)的指针IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS填充结构。虽然在我的代码中创建的结构已被我解除分配,但指针数组似乎令人不安。VOLUME_DISK_EXTENTSExtents

我应该释放那段记忆吗?我如何释放它?

0 投票
1 回答
529 浏览

windows - D 中的 Windows SCSI ReadCapacity16

我正在尝试使用 D 将 scsi ReadCapacity16 (0x9E) 发送到 Windows 上的卷。CDB 是规范的,我的 ReadCapacity16 在 Linux 上工作,scsi Inquiries 在 Windows 上工作。只有 Windows 上的非查询调用无法使用 Windows 内核中的“不正确的功能”。

既然只有查询有效,那么通过 Windows 内核发送非查询有什么技巧吗?关于让它工作的任何提示?我研究了几个星期并没有解决这个问题。

这是 CDB 的一个示例:

\\.\physicaldrive0 CDB 缓冲区内容:9e 10 00 00 00 00 00 00 - 00 00 00 00 00 20 00 00 sgio.exceptions.IoctlFailException@sgio\exceptions.d(13):ioctl 错误代码为 1。函数不正确。

这里是将 CDB 复制到 DeviceIoControl 调用的缓冲区的位置,这与成功发送 Inquiry 命令(但 readcap 失败)的代码路径相同。github中的代码粘贴在下面: