这是我的代码:
UNICODE_STRING symbol;
WCHAR ntNameBuffer[128];
swprintf(ntNameBuffer, L"\\Device\\Harddisk1\\Partition1");
RtlInitUnicodeString(&symbol, ntNameBuffer);
KdPrint(("OSNVss:symbol is %ws\n",symbol.Buffer));
status = IoGetDeviceObjectPointer(&symbol,
FILE_READ_DATA,
&pDiskFileObject,
&pDiskDeviceObject);
我的驱动程序是\\Device\\Harddisk1\\Partition1
的下一级别。
当我致电IoGetDeviceObjectPointer
时,它将失败并且状态不会返回,并且不会继续执行剩余的代码。
当我使用windbg调试时,它将以intelpm.sys
;
如果我将对象名更改为"\\Device\\Harddisk1\\Partition2"
(分区2确实存在),则会成功调用
如果我将objectname更改为"\\Device\\Harddisk1\\Partition3"
,(partition3不存在),则失败并返回status = 0xc0000034
,表示objectname不存在。
有人知道为什么当我使用对象"\\Device\\Harddisk1\\Partition1"
它失败并且没有返回状态时?非常感谢!
答案 0 :(得分:0)
首先:你想要实现什么以及你使用的驱动程序模型是什么?什么位,什么操作系统版本的目标和操作系统版本失败?此外:您正在使用正确的IRQL进行调用,而正在系统线程中运行,对吗?您从哪个司机的入口点(IRP_MJ_*
,DriverEntry
...)调用此代码?
无论如何,正在重新阅读有关此功能的文档。特别注意到这一部分:
IoGetDeviceObjectPointer 例程将指针返回到指定设备对象的堆栈中的顶层对象,并指向 相应的文件对象,如果请求访问对象即可 被授予。
和
IoGetDeviceObjectPointer 在调用者之间建立“连接” 和下一个较低级别的驱动程序。一个成功的来电者可以使用 返回设备对象指针以初始化其自己的设备对象。 它也可以用作IoAttachDeviceToDeviceStack的参数, IoCallDriver,以及为较低驱动程序创建IRP的任何例程。该 返回指针是IoCallDriver的必需参数。
您没有说,但如果您在32位系统上执行此操作,则可能需要跟踪IrpTracker发生的情况。但是,我的猜测是,所谓的“连接”或者更确切地说是对它的请求会被下一个较低级别的驱动程序吞噬掉。
很难说你在这里写什么样的司机(是的,这很重要)。
不要只是在事实之前或之后打破特定点,而是遵循IRP将在目标设备对象的堆栈中向下移动的堆栈。
但是考虑一下,你可能根本就没有附加到堆栈(无论出于何种原因)。可能是你实际上应该使用 IoGetDiskDeviceObject 来获取实际的底层设备对象(在堆栈的底部)而不是对附加的顶级对象的引用?
最后但并非最不重要:不要忘记你也可以在OSR mailing lists上提出这个问题。那里有很多经验丰富的专业人士可能遇到了完全相同的问题(假设你正在做我所问的所有正确的事情)。
答案 1 :(得分:0)