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

c++ - DeviceIoControl 返回错误 24

我正在尝试在 Windows 7(64 位)机器上运行定制的内核模式驱动程序。驱动程序服务已启动,但 IO 控制请求返回错误。

DeviceIoControl(hDevice, OPEN_PHYSICAL_MEMORY, NULL, 0, ph, sizeof(HANDLE), cb, NULL)

和#define OPEN_PHYSICAL_MEMORY __CTL_CODE(0x8124, 0x801, 0, FILE_READ_DATA)。

getlasterror() 返回错误代码 24。

ERROR_BAD_LENGTH

该功能在 32 位操作系统中完美运行。请帮我解决这个错误。

谢谢你。

0 投票
1 回答
337 浏览

java - 我正在尝试在我的 rpi 上使用 jdk.dio,但我得到“java.library.path 中没有 dio”

我正在尝试使用 Oracle 设备 I/O 库。

我已经按照 oracle 页面上的说明制作了 dio,并将构建文件夹复制到开发 PC 上。我将构建的 jar 添加到我的 IDE(Intellij IDEA)上的项目中,其中包含我能找到的本地人。我正在使用 IDEA 的嵌入式系统插件在我的 RPI 上运行该程序。代码可以在我的github上看到:

主类: https ://github.com/MAWoodMain/RPITank/blob/master/src/main/java/Main.java

调用类: https ://github.com/MAWoodMain/RPITank/blob/master/src/main/java/sensors/MPU9250/MPU9250_Oracle.java

该代码在很大程度上无关紧要,因为我的问题是部署/执行。

0 投票
1 回答
504 浏览

c# - Win32_Volume 容量比 Win32 API DeviceIOControl IOCTL_DISK_GET_LENGTH_INFO 小 4096 字节

不幸的是,此链接已关闭,但确实有我的实际问题: Get size of volume on Windows

当我使用 WMI 在 Windows 中通过 Win32_Volume 和我的 c:\ 驱动器的容量属性获取卷的容量时,我得到这个值:499513290752

但是,当我使用

我得到: 499513294848 比 WMI 报告的大 4096。我发现这对于硬盘驱动器上的每个卷都是一样的。(此句柄是通过调用 CreateFile() 获得的 SafeFileHandle,文件名为“\\?\Volume{93b1858d-033d-4719-a42a-870d8eb3fe0d}\”)。

此外,使用以下查询 c:\ 驱动器

报告总共有 121951487 个簇,每个簇 8 个扇区,每个扇区 512 字节,即 499513290752 字节,与 WMI 相同。

当我使用 Win32_DiskPartition 时,它确实报告了与 DeviceIoControl 相同的容量值,这很奇怪(这里的文件名是“\\?\GLOBALROOT\Device\Harddisk0\Partition1”作为一个例子)。

在比较“\\.\PhysicalDrive0”给出的物理磁盘的 Win32_DiskDrive 和 DeviceIoControl 函数获得的值时,我也得到了一个完全不同的数字:

Win32_DiskDrive: 500105249280

IoControl:500107862016(我认为差异约为 2.5 MiB)

Win32_DiskDrive 大小与 WMI 类中报告的每扇区字节数 * 总扇区数相匹配:每扇区 512 字节 * 总扇区数 976768065 = 500105249280。如果 IoControl 值正确,这意味着实际上总扇区数为 976773168。Disk Geometry 中的值也支持 500105249280 磁盘大小。

那么,我应该信任哪个值/来源,为什么它们对于卷总是 4096 字节不同?IOCTL_DISK_GET_LENGTH_INFO 是否仅对分区有效,对物理磁盘或卷无效?

更新:更多信息/说明。我还尝试读取物理扇区,并且可以读取超出 DiskGeometry 和 Win32_DiskDrive 报告的磁盘大小。在这种情况下,IOCTL_DISK_GET_LENGTH_INFO 值实际上是正确的,我最多可以读取此函数报告的扇区数,并且只有在尝试读取超出它时才会出错。那么为什么其他函数不会报告实际的扇区总数/正确大小呢?物理磁盘是否隐藏了某些功能无法访问的某些区域?

0 投票
1 回答
2152 浏览

c++ - 在 C++ 中分区和格式化 USB 闪存驱动器时出错

我一直在尝试使用 C++ 重新分区和格式化 USB 闪存驱动器,任何帮助都会很棒!

目标是使用一个占用整个空间并格式化 FAT32(后来的选项 NTFS 和 EXFAT)的单个分区对任何任意闪存驱动器进行重新分区。这将分批完成,希望一次使用 50 多个设备,因此驱动器号访问不是一个选项。我可以创建一个分区,但是当我尝试 IOCTL_DISK_SET_PARTITION_INFO_EX 设置格式类型时,它失败了,错误为 0x32,ERROR_NOT_SUPPORTED。但目前尚不清楚究竟什么是不支持的。我可以使用 diskpart 等实用程序手动对设备进行分区,因此我知道设备支持的分区和文件系统类型。任何人都可以帮忙吗?我的完整源代码如下,使用 IOCTL_DISK_SET_PARTITION_INFO_EX 调用 DeviceIoControl() 失败。

0 投票
2 回答
2005 浏览

c# - DeviceIoControl 初始化和创建 NTFS 分区

我正在尝试通过 DeviceIOControl 初始化磁盘并创建 NTFS 分区,而不使用 DiskPart 或 WMI。

使用下面的代码,我可以初始化磁盘并创建一个 RAW 分区,但我无法调整参数以使新分区为 NTFS。

有任何想法吗?

0 投票
1 回答
1465 浏览

c++ - 带有 IOCTL_DISK_GET_DRIVE_GEOMETRY 的 DeviceIoControl() 失败并返回错误代码 87。为什么?

相关代码如下:

在此之后,controlCheck是假的并且checkERROR_INVALID_PARAMETERcheckFERROR_ALREADY_EXISTS,这应该不是问题。

据我所知,我的调用DeviceIoControl()方式与IOCTL_DISK_GET_DRIVE_GEOMETRY文档一致。,但显然我错过了一些东西。非常感谢您的帮助。

编辑:

根据收到的回复,我将内容更改如下:

这应该更接近正确,即使它还不是很正确。 checkFERROR_FILE_NOT_FOUND,我觉得很奇怪。我也试过了"\\.\PhysicalDrive1""\\.\PhysicalDrive2"但得到了同样的结果。 controlCheck仍然是假的,但 check 是 now ERROR_INVALID_HANDLE

0 投票
1 回答
367 浏览

c++ - 我正在尝试检索硬盘驱动器或电池标签的序列号

当我编译并执行这段代码时,我得到以下结果:

0 投票
0 回答
694 浏览

windows - 在 Windows 中从用户空间通信内核空间

我是操作系统内核领域的菜鸟。最近我研究了程序如何在内核领域工作。

我知道几个 Windows api 调用只是内核态系统调用的包装器。最后执行 syscall/sysret/sysenter 进入内核域,内核域接收器(KiFastCallEntry 等)接收它并将其扔给负责解析和处理它的处理程序。

但我知道的另一种内核域通信方式是 IOCTL,比如 DeviceIoControl()。我用它来传达我的自定义设备驱动程序。

我的问题是,系统调用和 DeviceIoControl() 有什么区别?为什么有两种(或更多)方式可用/拆分来在 Windows 中通信内核域?我可以在不调用 DeviceIoControl 的情况下使用一系列系统调用来传达我的自定义设备驱动程序吗?

感谢您阅读我的问题。祝你有美好的一天 :)

0 投票
1 回答
530 浏览

c++ - DeviceIoControl 对内存位置的访问无效

运行以下代码时,我对内存位置的访问无效

但下面的代码工作正常。

我正在尝试获取给定文件夹中文件的重新解析数据。这是我的REPARSE_DATA_BUFFER

我不知道我哪里出错了。请帮我修复我的第一个代码。

0 投票
0 回答
129 浏览

c - Windows API - IOCTL_CHANGER_GET_PRODUCT_DATA 总是返回 ERROR_INVALID_PARAMETER

我是一个通信库的作者,它需要能够通过 libusb 和对应于我们案例的本机驱动程序(CESG502,由 CASIO 制造)与串行设备和 USB 设备进行通信。串口和 libusb 通信都是托管的,我现在想集成使用 CESG502(为我们想要的驱动程序)。

主要问题来自这个驱动程序:而不是像串行驱动程序那样管理缓冲(如果接收到更多数据,它会存储直到用户请求它),它希望开发人员提供比接收到的数据更大的缓冲区。这导致了 的两种不兼容的用法ReadFile,我必须只输入我想要实际接收的字节数(串行,否则它只会等待其余的永远不会到来)或缓冲区的大小(CESG502;如果我不'不这样做,驱动程序返回一个ERROR_GEN_FAILURE)。

驱动程序是专有的,所以我无法更正它。由于我的库的设计,我需要确定驱动程序是否为 CESG502,以便在大多数情况下使该库正常工作。我查看并找到了IOCTL_CHANGER_GET_PRODUCT_DATA,它看起来可以带来我的信息米找。所以我尝试在这里使用它:

不幸的是,我不断收到 0x57 ( ERROR_INVALID_PARAMETER) 错误,这也发生在串行设备上。我正在按照页面上所说的内容进行操作,我已经尝试了很多事情(设置ReturnedBytessizeof(CHANGER_PRODUCT_DATA),初始化ProductData,无论如何读取数据,......),我发现了这个错误来自哪里......

如果您知道如何解决此问题,请提前感谢:)