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

c# - DeviceIoControl 未设置输出缓冲区

我遇到了一些问题DeviceIOControl。我正在尝试从物理驱动器读取磁盘几何形状,但从未设置输出缓冲区。

这是我的代码示例,它是一个简单的函数,应该获取磁盘几何形状并返回磁盘是否可移动:

还有一些数据结构:

我使用的枚举来自

bytesReturned变量被设置(在本例中为 24),但变量dg全为零。

我尝试了其他几个DeviceIoControl具有相同结果的函数:bytesReturned已设置但输出缓冲区全为零。

我的测试环境

  • 操作系统:Windows 7 Pro 64
  • IDE:Visual Studio 2010
  • 目标框架:.Net 4.0
0 投票
1 回答
1101 浏览

windows - IOCTL 是如何工作的?

我想知道 IOCTL 是如何工作的。我知道基本情况:

DeviceIoControl() -> kernel32.dll -> ntdll.dll -> 从用户模式到内核模式的时刻 -> I/O Manager -> IRP

问题是 IOCTL 如何从用户模式到内核模式?是中断门、调用门还是别的什么?

如果您知道任何解释 IOCTL 详细信息的文章/书籍(不仅仅是 Windows 内部),请发布链接。

0 投票
0 回答
2483 浏览

c++ - 设备唯一 ID(硬件序列号与卷序列号)Windows

我一直在搞乱 Windows API(我被告知要远离 WMI,因为它不可靠),试图为我的 HD 和连接的 USB 设备获取设备序列号。但似乎大部分功能旨在访问卷序列号,而不是实际制造商的设备唯一序列号。这些批量序列似乎是根据驱动器格式化的最后日期和时间计算的。

好吧,这不适用于我要开发的应用程序 - 如果设备已格式化并将相同的信息复制到该设备,那么当他们启动我的应用程序时,它需要能够处理内部信息(通过序列号)作为属于该设备,如果我使用卷序列号将丢失。

我查看了http://www.winsim.com/diskid32/的代码,但这似乎只是返回了卷序列号。编辑:实际上,这个值与卷序列不同,如下面的输出所示:

第一位代码中的序列号(使用 GetVolumeInformation)是您在命令提示符下键入“vol”时获得的驱动器十六进制值的十进制版本 - 所以这是卷序列号。下面的数字是从DeviceIoControl(hwDrive, IOCTL_STORAGE_QUERY_PROPERTY.... 它与diskid32的程序员为我的驱动器获取的 ID 相同,但与下面的实际序列号不同。令人困惑。

对于 USB 驱动器:使用PSP_DEVICE_INTERFACE_DETAIL_DATA结构,我可以访问 GUID 设备枚举,对于我的 USB 驱动器,它看起来像这样:

\?\usbstor#disk&ven_toshiba&prod_mk5059gsxp&rev_gn00#203216187542_ _ &0#{53f563 07-b6bf-11d0-94f2-00a0c91efb8b}

该设备信息的这一部分是序列号,据说:

203216187542_ _

此外,我加载了 diskpart.exe(一个 cmd 行分区程序)并查看了我的系统 HDD 和外部 USB 驱动器的驱动器详细信息,它们都不匹配我上面得到的任何值:

东芝 MK5055GSXF ATA 设备磁盘 ID:00005B9E

东芝 MK5059GSXP USB 设备磁盘 ID:51260D08

这里会发生什么?在哪里以及如何访问实际设备的实际制造序列号?

任何帮助将不胜感激!

0 投票
2 回答
2239 浏览

c# - 为什么我的 C#/pinvoke DeviceIoControl 调用返回 0 字节读取垃圾数据?

我有一个运行良好的非托管 C++ Windows 控制台应用程序。我想要它在 C# 中。我已经为必要的 Kernel32.dll 符号完成了 DllImport 语句:

然后我有以下应用程序代码:

我的 C# 应用程序打印“Bytes read = 0”并且几何成员值是垃圾。我当然不是 DllImport 和编组方面的专家。请帮助我理解我做错了什么。如果我将第五个参数更改为 DeviceIoControl 为“ref DiskGeometry”并传入一个在调用之前创建的参数(而不是 IntPtr 和 alloc),则所有打印的几何成员值都是 0。

0 投票
5 回答
3359 浏览

windows-8 - 硬盘序列号在 Windows XP、Vista 和 7 中每 2 个字节翻转一次,但在 Windows 8 中不翻转

我需要获取HDD 序列号才能将其用作许可软件的密钥。我在这个 url 中使用了diskid32代码:http: //www.winsim.com/diskid32/diskid32.html 它使用了DeviceIoControl Win32 API 和IOCTL_STORAGE_QUERY_PROPERTY的 IO 控制代码。

有效。然而,当我仔细检查打印在硬盘本身上的实际序列号时,我发现每 2 个字节的数字被翻转。

一个简单的解决方案可能是简单地将字节翻转回来。它适用于 Windows XP、Vista 和 7,但在 Windows 8 中不需要翻转!

我想知道字节在 Windows XP、Vista 和 7 中翻转的确切原因,以及为什么在 Windows 8 中不翻转。下一个 Windows呢?

部分代码稍作改动:

0 投票
1 回答
3210 浏览

c# - 如何在 Win7 中断开蓝牙设备与 C# .Net 的连接

我想从我的 c# .Net 应用程序中断开蓝牙设备,该应用程序在 Win 7 x64 上运行。

我知道 MS 在 .Net 上提供的保护 BT 的功能很少。

我搜索了 32feet.Net,发现了如何连接、发现、获取信息……但没有关于断开连接(我错过了什么吗?)。

然后,我在Msdn IOCTL_BTH_DISCONNECT_DEVICE上找到了。问题是我无法理解如何调用它。看来我应该将DeviceIOControl与 Platform Invoke 一起使用,但恐怕我没有足够的 .Net 技能来自己构建它。

这是我现在的位置:

有人可以帮我完成这个吗?

0 投票
2 回答
4705 浏览

c# - 物理磁盘大小不正确 (IoCtlDiskGetDriveGeometry)

我使用下面的代码获取物理磁盘大小,但返回的大小不正确。我用其他工具检查过尺寸。

下面的代码报告

总磁盘空间:8.249.955.840 字节

它应该是

总磁盘空间:8.254.390.272 字节

如何检索实际/正确的物理磁盘大小?在 USB 驱动器和普通硬盘驱动器上测试。代码比较长,这里分开展示。

结构:

本机方法:

主要条目:

0 投票
1 回答
3526 浏览

c# - 为什么在 C# 中读取的原始磁盘从稍微偏移的偏移中读取?

我正在尝试读取原始磁盘。我已成功打开驱动器并获得有效句柄(CreateFile),将该句柄的偏移量设置为零(SetFilePointerEx)并将数据读取到缓冲区Byte[]ReadFile)。到目前为止,一切都很好。但是由于某些未知原因,当我将缓冲区(实际上花了我一段时间才弄清楚)与第 3 方实用程序(磁盘调查器)显示的内容进行比较时。它不包含引导信息(跳转指令),但正确的磁盘数据,但从偏移量85 = 0x55开始。所以在卷引导信息中间的某个地方。

这是为什么?有什么东西,我失踪了(显然我是)?

系统:Windows 8(在 VmWare 工作站中)

代码:

CreateFile(其他地方)

PInvoke 方法:

枚举:

0 投票
1 回答
653 浏览

winapi - 枚举所有可用的变更日志记录

我在枚举更改日志记录时遇到问题。

如您所见,Timeout是非零的,BytesToWaitFor也是非零的。我知道当FSCTL_READ_USN_JOURNAL调用到达更改日志的末尾时,它必须等待Timeout几秒钟,然后返回BytesToWaitFor. 但是,由于某种原因,我正在观察完全不同的行为:DeviceIoControlwithFSCTL_READ_USN_JOURNAL和其他列出的参数可能需要几分钟 - 直到文件系统中发生了一些新的更改。为什么READ_USN_JOURNAL_DATA.Timeout不限制FSCTL_READ_USN_JOURNAL请求的持续时间?

0 投票
1 回答
4247 浏览

c# - 获取文件夹 ID C#

我正在尝试跟踪文件和文件夹的整个生命周期(它们可能被移动或重命名)。我已经完成了搜索,发现FileSystemWatcher可能是跟踪文件和文件夹的最流行的方式,但是,这对我不起作用,因为应用程序可能会或可能不会一直在运行。我选择尝试通过 ID 跟踪文件夹。

我找到了一种方法来从这个堆栈帖子的答案中的 ID 跟踪文件。我可以在这个答案中基于 Approach B 成功获取文件 ID 。

在搜索时,我发现了这个堆栈帖子,说明他使用FSCTL_GET_OBJECT_ID找到了他的解决方案。我花了很多时间试图弄清楚如何使用这个功能,但我无法理解它。我在 C# 中调用本机 Windows 函数的经验基本上为零。

谁能给我一个推动正确的方向呢?我觉得我一定遗漏了一些明显的东西。

C# 无法访问文件/文件夹 ID 是否有原因?跟踪文件/文件夹不常见吗?

编辑,添加代码:

我从 DeviceIoControl 收到错误“87”,根据 MSDN 上的帖子,这是无效的参数(由于声誉限制,我无法发布更多链接。)