0

这是我的代码:

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"(partition2 确实存在),它将成功调用

如果我将 objectname 更改为"\\Device\\Harddisk1\\Partition3", (partition3 不存在),它失败并返回 status = 0xc0000034,意味着 objectname 不存在。

有谁知道为什么当我使用对象时"\\Device\\Harddisk1\\Partition1"它失败并且没有返回状态?非常感谢!

4

2 回答 2

2

首先也是最重要的:您要实现什么目标以及您使用的是什么驱动程序模型?什么位数,针对哪些操作系统版本以及它在哪个操作系统版本上失败?此外:您在调用的正确 IRQL 中并且系统线程中运行,对吗?您从驱动程序的哪个入口点(IRP_MJ_*DriverEntry...)调用此代码?

无论如何,正在重新阅读有关此功能的文档。特别注意以下部分:

如果可以授予对对象的请求访问权限,IoGetDeviceObjectPointer 例程将返回指向指定设备对象堆栈中的顶部对象的指针和指向相应文件对象指针

和:

IoGetDeviceObjectPointer在调用者和下一级驱动程序之间建立“连接”。成功的调用者可以使用返回的设备对象指针来初始化自己的设备对象。它也可以用作 IoAttachDeviceToDeviceStack、IoCallDriver 和任何为低级驱动程序创建 IRP 的例程的参数。返回的指针是 IoCallDriver 的必需参数。

您没有说,但是如果您在 32 位系统上执行此操作,那么跟踪IrpTracker发生的情况可能是值得的。但是,我的猜测是,所谓的“连接”,或者更确切地说,对它的请求会以某种方式被下一个较低级别的驱动程序吞掉。

也很难说你在这里写的是哪种驱动程序(是的,这可能很重要)。

尝试不只是在事前或事后的特定点中断,而是遵循 IRP 将在目标设备对象的堆栈中向下传播的堆栈。

但是考虑一下,您可能根本没有附加到堆栈(无论出于何种原因)。难道你实际上应该使用IoGetDiskDeviceObject来获取实际的底层设备对象(在堆栈的底部)而不是对附加的顶级对象的引用?

最后但同样重要的是:不要忘记您也可以在OSR 邮件列表上提出这个问题。那里有很多经验丰富的专业人士可能会遇到完全相同的问题(假设您正在做我所询问的所有正确的事情)。

于 2012-11-21T03:59:30.530 回答
0

谢谢大家,我解决了这个问题;导致这个问题的原因是它变得同步;当我调用 IoGetDeviceObjectPointer 时,它会生成一个新的 Irp IRP_MJ_WRITER,它从高层传递,当这个 IRP 到达我的驱动程序时,我处理 IRP 的线程是调用 IoGetDeviceObjectPointer 的同一个线程,所以它变成了死机;

于 2012-11-26T06:41:48.213 回答