这是我的代码: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"
它失败并且没有返回状态吗?非常感谢!
“无状态返回”是什么意思?请你详细说明一下!该函数甚至不返回?因为它肯定会在EAX寄存器中给你一个很好的返回码。在这里返回'0'是完全正确的,因为它意味着成功('STATUS_SUCCESS')。那么你的意思是什么?如果你想交出IRP,我可以想象一些原因,但这听起来太空洞了...... – 0xC0000022L
是的,functin甚至不会返回,IoGetDeviceObjectPointer之后的代码不会执行;即使我调用函数funA,我再次调用IoGetDeviceObjectPointer,它不能输入funA – Jay
为什么不编辑你的问题,然后添加这些信息? ;)...它不会像返回声音那样阻塞呼叫(即它变成同步)。你是否尝试过使用另一个访问掩码? – 0xC0000022L