【问题标题】:IoGetDeviceObjectPointer() fails with no return statusIoGetDeviceObjectPointer() 失败,没有返回状态
【发布时间】:2012-11-20 13:41:38
【问题描述】:

这是我的代码:

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 中断;

如果我把objectname改成"\\Device\\Harddisk1\\Partition2"(partition2确实存在),就会调用成功

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

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

【问题讨论】:

  • “无状态返回”是什么意思?请您详细说明!该功能甚至不返回?因为它肯定会在 EAX 寄存器中留下一个不错的返回码。在这里返回0 非常好,因为这意味着成功(STATUS_SUCCESS)。那你是什么意思?如果您要提交 IRP,我可以想象一些原因,但这听起来太冗长了......
  • 是的,这个函数甚至不返回,IoGetDeviceObjectPointer之后的代码也不行;即使我调用函数funA,我再次调用IoGetDeviceObjectPointer,它也无法进入funA
  • 您为什么不编辑您的问题然后添加此信息? ;) ...它没有返回听起来像是阻塞调用的事实(即它正在变得同步)。您是否尝试过使用其他访问掩码?

标签: windows winapi driver


【解决方案1】:

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

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

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

和:

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

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

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

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

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

最后但同样重要的是:别忘了您也可以在OSR mailing lists 上提出这个问题。那里有很多经验丰富的专业人士可能遇到过完全相同的问题(假设您所做的所有事情都正确无误)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 2018-07-09
      • 2014-05-29
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多