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

delphi - 如何正确检索电池序列号?

在 Delphi 7 中,我正在开发一个库,该库实现一个对象,该对象封装有关连接到系统的电池的信息。除了检索电池的序列号外,它运行良好。

我用于此调用的代码如下:

不幸的是,DeviceIoControl()总是返回False,如果我GetLastError()事后检查,它会返回错误 87,“参数不正确”。

这没有多大意义,因为如果我简单地将InformationLevelfrom更改BatterySerialNumberBatteryUniqueID,则代码运行良好。另外,我之前hbat在代码中的其他调用中使用了电池句柄(GetSerialNumber

有任何想法吗?我真的很茫然。

0 投票
0 回答
2304 浏览

windows - 发送 IDENTIFY DEVICE COMMAND - ATA PASS THROUGH on raid - SSD

我的目标是在具有 raid 配置的系统中检测固态驱动器。使用 smartmontools 的以下命令,我观察到位 434 (217) 显示 SSD 的值 1: smartctl -i -r ataioctl,2 /dev/csmi0,0

尝试读取相同的 512 字节数据我尝试通过以下 2 种方式发送 IDENTIFY DEVICE 命令:

方法 1 失败,DeviceIoControl() 将 GetLastError() 设置为 87 (ERROR_INVALID_PARAMETER),你能帮我理解什么可能是错误的,我是否在正确的轨道上?

方法 2 有 info->IoctlHeader.ReturnCode = 3 这意味着 CSMI_SAS_STATUS_INVALID_PARAMETER。(提供的 CSMI 缓冲区太小)

///////// 方法一 /////////

//////// 方法二 //////////

0 投票
1 回答
3255 浏览

usb - 为什么 DeviceIoControl 因“功能不正确”而失败

我正在尝试与我的 USB 驱动程序进行通信。我能够得到一个句柄,但是一旦我使用DeviceIoControl它失败,GetLastError()说错误是一个不正确的功能。我对如何调试这个感到困惑。我正在使用 XP 32 位机器。

0 投票
2 回答
1599 浏览

c# - 如何在 C# 中使用 DeviceIoControl 和 FSCTL_MAKE_MEDIA_COMPATIBLE 完成 Live File System (LiveUDF) 光盘?

我正在尝试用 C# 完成 Live File System(或“Live UDF”)光盘。根据我阅读 MSDN 和 TechNet 文章以及各种论坛帖子的了解,Image Mastering API(或 IMAPI)不支持这种类型的文件系统,并且在我的编码工作中,我未能成功使用 IMAPI 完成 LiveUDF 光盘。因此,我使用了 FSCTL_MAKE_MEDIA_COMPATIBLE 控制代码的 DeviceIoControl 函数。

首先,我正在同步调用 DeviceIoControl,但该函数将返回 1117,并且磁盘最终会在几分钟后完成。这种结果是不可接受的,因为我需要该过程仅在最终失败或实际成功时返回。

接下来,我通过使用带有 FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes 标志的 CreateFile 打开设备句柄并将 NativeOverlapped 对象传递给 DeviceIoControl 调用,继续异步调用 DeviceIoControl。在此之前,很明显,我设置了一个 IOCompletionCallback 来处理任何重叠事件。

如上所述异步调用 DeviceIoControl 时,它仍然几乎立即返回 1117(就像同步调用时一样),永远不会调用 IOCompletionCallback 方法,并且磁盘会在几分钟后完成。

我的问题是:如何在 Windows 7 平台上使用 C# 和 DeviceIoControl(同步或异步,能够“等待”其进程完成)完成 C# 中的 Live File System(或“Live UDF”)光盘捕捉最终的成功或失败结果)?

非常感谢提前。

0 投票
5 回答
5955 浏览

c# - C# WriteFile() 在 USB 驱动器的 242 扇区停止写入

我编写了以下代码来将 0xFF 写入我的 USB 存储设备上的所有字节。由于某种原因,WriteFile()调用在扇区 242 处开始出错。我在两个单独的 USB 存储设备上完成了此操作,然后在十六进制编辑器中检查了这些设备。扇区 242 似乎是 FAT16 格式化设备上文件分配表的开始,以及 NTFS 设备上引导区的开始。我确信它在这些确切位置出错并非巧合,但是我不知道如何改变这种行为。HRESULT失败时我收到的是WriteFile-2147024891,即E_ACCESSDENIED. 有谁知道可能导致问题的原因?

注意:如果您要在本地系统上运行此代码,请非常小心,因为我已经硬编码了我的 USB 设备的物理设备 ID。请务必使用您尝试写入的设备更新 deviceId 变量。你不想破坏你的硬盘。

编辑/更新

在使用第三方工具对 USB 设备进行低级别擦除后,我能够成功地使其工作。驱动器完全归零后,我能够成功写入设备。一旦识别出有效的 fat 或 ntfs 文件系统以及使用

配对DeviceIoControl似乎不会覆盖设备上的锁定窗口。

有谁知道如何在DeviceIoControl具有有效文件系统的驱动器上成功锁定 Windows 中的可移动 USB 设备?

我已经使用了几个第三方工具来做我想做的事情并且它们成功地工作。我知道这是可能的,但我阅读的所有 MSDN 文档都没有帮助解决问题。

编辑/更新 2

这取自https://web.archive.org/web/20130507212546/http://msdn.microsoft.com/en-us/library/ff551353.aspx

应用程序需要锁定卷、卸载卷或两者,才能发出 DASD I/O。这是 Windows Vista 的新功能,旨在解决潜在的恶意技术。

  1. 文件系统将阻止对磁盘保留部分的所有写操作。在这种情况下,这些保留部分包括 MBR 和两个 FAT 区域。要阻止这些区域,您需要通过发送 FSCTL_LOCK_VOLUME 来锁定卷。您必须在执行实际写入操作的同一卷句柄上发出此结构。如果有打开的文件句柄,此请求可能会失败。在这种情况下,应用程序可以通过发出 FSCTL_DISMOUNT_VOLUME 来强制卸载文件系统。但是,在文件句柄关闭之前,不会真正卸载卷。在此之前,应用程序可以通过使用当前打开的相同文件句柄继续发出 DASD I/O。

  2. 在文件系统已知的卷空间之外有一个扩展区域,写入操作将被阻止。要允许对该区域的写操作,您必须在卷句柄上发出 FSCTL_ALLOW_EXTENDED_DASD_IO。

您可以使用 Win32 API 例程 DeviceIoControl 来发出所有以前的 FSCTS。

我相信这正是我们在上面的代码中实现的,但它似乎没有正常工作。我们得到了一个句柄并且正在锁定和卸载设备,所以我们应该能够正确地写入受保护的区域?

编辑/更新 3

好的,这是当前打开磁盘和卷的顺序。锁定、卸载等方法只是按照我们认为错误的顺序工作。

我仍然得到相同的结果,它仅在磁盘被丢弃时才有效。

0 投票
1 回答
824 浏览

winapi - 用于 DeviceIOControl 的 SetWindowsHookEx,要使用什么 hookid?

在 MSDN 列出的可用 idHook 值上,有:

  • WH_CALLWNDPROC
  • WH_CALLWNDPROCRET
  • WH_CBT WH_DEBUG
  • WH_FOREGROUNDIDLE
  • WH_GETMESSAGE
  • WH_JOURNALPLAYBACK
  • WH_JOURNALRECORD
  • WH_KEYBOARD
  • WH_KEYBOARD_LL
  • WH_MOUSE
  • WH_MOUSE_LL
  • WH_MSGFILTER
  • WH_SHELL
  • WH_SYSMSGFILTER

那么,钩子 DeviceIOControl 函数(用于控制台应用程序)应该使用什么 idHook?或者我可以使用其他一些钩子方法吗?

0 投票
1 回答
1510 浏览

c++ - 使用 C++ 中的 DeviceIoControl 函数识别系统保留驱动器

我正在尝试使用功能确定驱动器是否是系统保留驱动器(PhysicalDrive0C-DriveDeviceIoControl。但是,对于所有驱动器,我的代码始终返回 true。

  • bResultis始终返回0,表示函数成功。
  • 甚至pdg->PartitionType有垃圾信息也不回true
0 投票
0 回答
244 浏览

c# - C 到 C# 翻译,调用 WinAPI 函数:ControlIoDevice

我正在尝试将一些用 C 编写的代码翻译成 C#(Compact Framework 2.0)(适用于带有 RFID 阅读器的 Windows CE 设备)。

在 C 中,这个系统调用工作正常,但在 C# 中不起作用:

C语言代码

C# 中的代码

DLL是这样导入的:

在当前的 C# 实现中,bRet = false,I 应该为 true,因为这是在 C 中获得的值

这也返回零:

任何帮助将不胜感激!

感谢您提前抽出时间!!

0 投票
1 回答
791 浏览

debugging - 使用带有 FSCTL_LOCK_VOLUME 的 DeviceIoControl 来锁定卷。调试器问题

我正在使用带有 FSCTL_LOCK_VOLUME 的 DeviceIoControl 在直接磁盘读/写之前锁定 USB 笔式驱动器。该程序有效 - 有时。我遇到了锁定调用本身的问题。当我在 Visual Studio 2008 中执行命令时,结果是正确的并且锁定成功 - 每次!,当运行代码(调试或不调试)时,调用偶尔会失败,句柄无效。唯一显着的区别是,当步进时有半秒的暂停——我很满意,但是在运行/调试时调用会立即失败。

请你给我一个提示,告诉我这是在哪里掉下来的。

我认为这是真正的技术人员!

0 投票
1 回答
467 浏览

c++ - 带有输入无符号字符缓冲区 C++ 的 DeviceIoControl

我在使用DeviceIOControl将 128 字节缓冲区放入驱动程序时遇到问题,我使用以下代码:

我总是收到 0x6 错误,我做错了什么?

更新 我的句柄创建功能: