2012-11-20 68 views
0

这是我的代码:IoGetDeviceObjectPointer()失败,并没有返回状态

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确实是存在的),它会成功的呼叫

如果我改变对象名到"\\Device\\Harddisk1\\Partition3",(该partition3不存在的),它失败,返回状态= 0xc0000034,意思是objectname不存在。

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

+0

“无状态返回”是什么意思?请你详细说明一下!该函数甚至不返回?因为它肯定会在EAX寄存器中给你一个很好的返回码。在这里返回'0'是完全正确的,因为它意味着成功('STATUS_SUCCESS')。那么你的意思是什么?如果你想交出IRP,我可以想象一些原因,但这听起来太空洞了...... – 0xC0000022L

+0

是的,functin甚至不会返回,IoGetDeviceObjectPointer之后的代码不会执行;即使我调用函数funA,我再次调用IoGetDeviceObjectPointer,它不能输入funA – Jay

+0

为什么不编辑你的问题,然后添加这些信息? ;)...它不会像返回声音那样阻塞呼叫(即它变成同步)。你是否尝试过使用另一个访问掩码? – 0xC0000022L

回答

0

首先和最重要的是:你想要达到什么样的目标,以及你使用的驱动程序模型是什么?什么位数,哪些操作系统版本的目标以及哪个操作系统版本会失败?此外:你在正确的IRQL上拨打电话正在运行系统线程,对不对?您是从哪个驱动程序的入口点(IRP_MJ_*DriverEntry ...)调用此代码?

无论如何,重新阅读关于此功能的文档。特别指出的部分:

IoGetDeviceObjectPointer中命名的设备对象堆栈指针例程返回到顶部对象和指针 对应的文件对象,如果该对象所请求的访问可以 被授予。

和:

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

你不会说,但如果你在32位系统上这样做,可能值得跟踪IrpTracker发生了什么。不过,我的猜测是,所谓的“连接”,或者说对它的请求会被下一级的驱动程序吞噬。

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

不要试图在事实之前或之后的某个特定点处断开,而是要遵循IRP在目标设备对象的堆栈中向下行进的堆栈。

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

最后但并非最不重要:不要忘记你也可以在OSR mailing lists上问这个问题。有很多经验丰富的专业人员可能遇到完全相同的问题(假设你正在做所有正确的事情)。

0

感谢大家,我解决了这个问题;造成这个问题的原因是它变得同步;当我调用IoGetDeviceObjectPointer时,它会生成一个新的Irp IRP_MJ_WRITER,它从高层通过,当这个IRP到达我的驱动程序时,处理IRP的我的线程是调用IoGetDeviceObjectPointer的同一个线程,因此它变成死循环;

相关问题