我正在尝试修改Windows内核级磁盘驱动器,以正确响应更新的控制代码。例如,它仅具有用于废弃的IOCTL_DISK_GET_DRIVE_GEOMETRY控制代码的处理程序,而没有较新的IOCTL_DISK_GET_DRIVE_GEOMETRY_EX控制代码的处理程序,因此我添加了该处理程序。
当然,我也更新了驱动程序以使用所有新的Windows结构和功能,例如IoReadPartitionTableEx()函数和DRIVE_LAYOUT_INFORMATION_EX结构(我正在尝试向驱动程序添加GPT支持)。问题是,当我使用磁盘驱动程序时,我可以看到(使用DebugView)Windows(我认为它是Windows……也许是其他东西……)仍在向驱动程序发送旧的IOCTL_DISK_GET_DRIVE_GEOMETRY控制代码。我希望Windows将更新的控制代码发送到我的驱动程序。甚至是Windows正在发送这些控制代码吗? Windows和我尚未意识到的驱动程序之间可能还有其他一层吗?

驱动程序是否应该以某种方式识别Windows的“类型”,以便Windows确切知道如何与之“对话”? Windows如何确切知道要发送到特定驱动程序的控制代码?我在Google周围搜索了这些(看似非常基本的)问题的答案,但没有找到明确的答案,这使我相信我从根本上误解了Windows驱动程序。我的问题甚至有意义吗?

最佳答案

OP有5个问题(根据问号数量进行计数)。以下每个问题的回答顺序均与在OP中提出的顺序相同。

  • 要找出谁正在使用IOCTL_DISK_GET_DRIVE_GEOMETRY调用您的驱动程序,请在驱动程序中该IOCTL的处理程序上放置一个断点。当中断发生时,请查看调用堆栈。您会看到谁打来的。
  • 实际上,您将有一组分层的调用者。这将回答您有关图层的问题。
  • Windows通过几种不同的方式了解您的驱动程序功能。如果您有微型端口驱动程序,则每种类型的微型端口都必须实现最少的功能集。
    另外,StorPort微型端口还可以使用一些API来指示可选功能。例如,StorPortInitializePerfOpts用于通知StorPort StorPort微型端口中的各种性能优化。为了更好地回答这个问题,请提供您拥有的驱动程序类型。如果您不熟悉各种驱动程序类型,建议您从MS HW开发人员中心阅读this。实际上,您可能仍要阅读它。
  • 该问题假定Windows根据某些假定的驱动程序属性将不同的控制代码发送给不同的驱动程序。但是Windows使用的模型类似于前面的答案中提到的模型。有基于驱动程序模型的基本功能,在某些情况下还具有基于API的通信功能。 (在其他情况下,由驱动程序指示它不支持特定操作。)
    答案还有另一个方面,那就是Windows和非Windows组件可以自由选择所需的任何控制代码。因此,即使存在较新的几何IOCTL,第三方磁盘分区程序也可以使用较旧的几何IOCTL,因为它希望与Windows的早期版本兼容。或者Windows组件(例如,存储空间)可以使用更新的IOCTL,因为它不具有向后兼容性。
  • (这个问题正在征求意见,所以这个答案是我的意见)。假设“问题”是指“问题”,那么我会或多或少地说。但是,如果这是您第一次(或第二次)尝试使用Windows驱动程序,我再次建议阅读相关的MS文档(上面链接)。

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

    10-06 12:55
    查看更多