|
早听说ObQueryNameString有问题,最近无聊想把枚举句柄名称的代码支持到XP,结果就一头撞进了这个大坑里。
这是一段很普通的查询对象名称的代码:- BOOLEAN QueryObjectName(PVOID pAnyObject, PWCHAR *OutputBufferFreeByCaller)
- {
- NTSTATUS status;
- ULONG returnedLength;
- BOOLEAN foundCompleteName = FALSE;
- PUNICODE_STRING pObjectName = NULL;
- status = ObQueryNameString(pAnyObject, NULL, 0, &returnedLength);
- if(status == STATUS_INFO_LENGTH_MISMATCH)
- {
- pObjectName = ExAllocatePool(PagedPool, returnedLength);
- status = ObQueryNameString(pAnyObject, (POBJECT_NAME_INFORMATION)pObjectName, returnedLength, &returnedLength);
- if(NT_SUCCESS(status))
- {
- *OutputBufferFreeByCaller = ExAllocatePool(PagedPool,pObjectName->Length+2);
- RtlZeroMemory(*OutputBufferFreeByCaller,pObjectName->Length+2);
- memcpy(*OutputBufferFreeByCaller,pObjectName->Buffer,pObjectName->Length);
- foundCompleteName = TRUE;
- }
- ExFreePool(pObjectName);
- }
- return foundCompleteName;
- }
复制代码 但是在(且仅在)XP上查询FILE_OBJECT时有机会蓝屏(代码是BAD_POOL_CALLER),其他系统,或在XP查询其它对象都不蓝屏。然后上网一查,吐槽ObQueryNameString的帖子里,大多跟查询FILE_OBJECT有关。不过我就不吐槽了,因为有个很简单的解决方案: |
|