【发布时间】: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
-
您为什么不编辑您的问题然后添加此信息? ;) ...它没有返回听起来像是阻塞调用的事实(即它正在变得同步)。您是否尝试过使用其他访问掩码?