|
大家都知道,ObQueryNameString这个函数非常糟糕,动辄返回失败,甚至导致蓝屏。在今年年初,我还发过一个帖子:《在XP上使用ObQueryNameString查询文件对象发现的大坑》。
先来一段常见的查询对象的代码,在VISTA之后系统可以成功,但是在XP/03上失败:- ULONG length = 0;
- POBJECT_NAME_INFORMATION buffer = NULL;
- NTSTATUS status = ObQueryNameString(pQueryObject,NULL,length,&length);
- if(length)
- {
- buffer = ExAllocatePool(PagedPool, length);
- if(buffer)
- {
- RtlZeroMemory(buffer,length);
- status = ObQueryNameString(pQueryObject,buffer,length,&length);
- if(NT_SUCCESS(status))
- DbgPrint("%wZ\n",(PUNICODE_STRING)buffer);
- else
- DbgPrint("ObQueryNameString-failed: 0x%x\n", status);
- ExFreePool(buffer);
- }
- }
- else
- {
- DbgPrint("ObQueryNameString-return-zero-length: 0x%x\n", status);
- }
复制代码
这是因为,在NT5系统上使用这个函数,需要与众不同的套路。 |
|