我正在尝试修改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的处理程序上放置一个断点。当中断发生时,请查看调用堆栈。您会看到谁打来的。另外,StorPort微型端口还可以使用一些API来指示可选功能。例如,
StorPortInitializePerfOpts
用于通知StorPort StorPort微型端口中的各种性能优化。为了更好地回答这个问题,请提供您拥有的驱动程序类型。如果您不熟悉各种驱动程序类型,建议您从MS HW开发人员中心阅读this。实际上,您可能仍要阅读它。答案还有另一个方面,那就是Windows和非Windows组件可以自由选择所需的任何控制代码。因此,即使存在较新的几何IOCTL,第三方磁盘分区程序也可以使用较旧的几何IOCTL,因为它希望与Windows的早期版本兼容。或者Windows组件(例如,存储空间)可以使用更新的IOCTL,因为它不具有向后兼容性。
最后,即使OP并没有直接询问,听起来也有一个问题“我如何测试已添加的IOCTL_DISK_GET_DRIVE_GEOMETRY_EX功能?”。 IMO最简单的方法是编写Win32测试程序。调用并显示一个IOCTL只需20行左右的代码。例如,编写DISKPART或类似脚本会更容易,更快捷。