修改 Windows 磁盘驱动程序以使用更新的控制代码(如 IOCTL_DISK_GET_DRIVE_GEOMETRY_

Modifying Windows disk driver to use updated control codes like IOCTL_DISK_GET_DRIVE_GEOMETRY_EX

本文关键字:IOCTL DISK GEOMETRY DRIVE GET 代码 控制 驱动程序 磁盘 Windows 更新      更新时间:2023-10-16

我正在尝试修改Windows内核级磁盘驱动程序以正确响应更新的控制代码。 例如,它只有一个处理程序用于过时的IOCTL_DISK_GET_DRIVE_GEOMETRY控制代码,但没有较新的IOCTL_DISK_GET_DRIVE_GEOMETRY_EX控制代码,所以我添加了它。
当然,我也更新了驱动程序以使用所有新的 Windows 结构和函数,例如 IoReadPartitionTableEx() 函数和DRIVE_LAYOUT_INFORMATION_EX结构(我正在尝试向驱动程序添加 GPT 支持(。 问题是,当我使用磁盘驱动程序时,我可以看到(使用调试视图(Windows(我认为是Windows...也许是别的什么...仍在向我的驱动程序发送旧的IOCTL_DISK_GET_DRIVE_GEOMETRY控制代码。 我希望 Windows 将较新的控制代码发送给我的驱动程序。 甚至 Windows 都在发送这些控制代码吗? Windows 和驱动程序之间是否有我还不知道的其他层?

驱动程序是否应该以某种方式向Windows识别其"类型",以便Windows确切地知道如何"说话"它? Windows 如何确切知道要发送到特定驱动程序的控件代码? 我已经在谷歌上搜索了这些(看似非常基本(问题的答案,但没有找到明确的答案,这让我相信我从根本上误解了这里的 Windows 驱动程序。 我的问题甚至有意义吗?

OP 有 5 个问题(根据问号数量计算(。以下每个问题都按照在OP中提出的顺序回答问题。

  1. 若要找出谁在调用驱动程序IOCTL_DISK_GET_DRIVE_GEOMETRY请在驱动程序中该 IOCTL 的处理程序上放置断点。发生中断时,请查看调用堆栈。你会看到是谁打来的。

  2. 您实际上将拥有一组分层的呼叫者。这将回答您有关图层的问题。

  3. Windows 以几种不同的方式了解你的驱动程序功能。如果你有微型端口驱动程序,则每种类型的微型端口都必须实现一组最少的功能。

    此外,StorPort 微型端口可以使用 API 来指示可选功能。例如,StorPortInitializePerfOpts用于通知 StorPort 有关 StorPort 微型端口中的各种性能优化的信息。为了更好地回答这个问题,请提供您拥有的驱动程序类型。如果您不熟悉各种驱动程序类型,我建议您从 MS HW 开发人员中心阅读此内容。事实上,你可能还是想读一读。

  4. 该问题假定 Windows 根据某些假设的驱动程序属性向不同的驱动程序发送不同的控制代码。但是,Windows使用的模型与上一个答案中提到的模型相同。有基于驱动程序模型的基本功能,然后在某些情况下使用 API 来传达功能。(在其他情况下,由驱动程序指示它不支持特定操作。

    答案还有另一个方面,那就是Windows和非Windows组件可以自由选择他们想要的任何控制代码。因此,第三方磁盘分区程序可以使用较旧的几何图形IOCTL,即使存在较新的几何图形,因为它希望与早期版本的Windows兼容。或者Windows组件(例如存储空间(可以使用较新的IOCTL,因为它不具有向后兼容性。

  5. (这个问题是征求意见,所以这个答案是我的意见(。假设"问题"是指"问题",那么我会说或多或少。但是,如果这是您第一次(或第二次(涉足Windows驱动程序,我再次建议您阅读相关的MS文档(上面链接(。

最后,即使OP没有直接询问,听起来也像有一个问题"如何测试我添加的IOCTL_DISK_GET_DRIVE_GEOMETRY_EX功能?最简单的方法是IMO,是编写一个Win32测试程序。要调用和显示这一个 IOCTL,只需要 20 行左右的代码。哪个会更容易,更快捷,比如说,脚本DISKPART或类似。