obquerynamestring

场景:驱动中使用ObQueryNameString获取注册表全路径假死的有关问题

驱动中使用ObQueryNameString获取注册表全路径假死的问题
小弟在驱动中HOOK了ZwSetValueKey函数,用来检测对注册表关键键值的危险写入操作,用ObQueryNameString函数获取注册表的全路径,不过感觉ObQueryNameString函数的效率非常的低,获取注册表路径的速度很慢,有时候甚至导致系统假死在ObQueryNameString这句上,过了几分钟至几十分钟才恢复过来,这应该不是我本机配置低的问题(i5处理器+2G内存,使用Windbg+VBox调试环境),这是我获取注册表路径的代码。
C/C++ code

NTSTATUS GetFullRegPath(IN HANDLE KeyHandle, OUT PUNICODE_STRING pRegPath) 
{
    NTSTATUS status;
    PVOID pObj;
    ULONG BufLength;
    ULONG i;
    POBJECT_NAME_INFORMATION pTmpStr;

    status = ObReferenceObjectByHandle(KeyHandle, 0, NULL, KernelMode, &pObj, NULL );
    if (!NT_SUCCESS(status)) {
        return status;
    }
    BufLength = pRegPath->MaximumLength+sizeof(UNICODE_STRING);
    if (BufLength < 1024) {
        BufLength = 1024;
    }
    pTmpStr = ExAllocatePoolWithTag(NonPagedPool, BufLength, 'Reg1');
    if (pTmpStr == NULL) {
        ObDereferenceObject(pObj);
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    memset(pTmpStr, 0, BufLength);
    i = BufLength;
    status = ObQueryNameString(pObj, pTmpStr, i, &BufLength);
    ObDereferenceObject(pObj);
    if (NT_SUCCESS(status)) {
        RtlCopyUnicodeString(pRegPath, &(pTmpStr->Name));
    }
    ExFreePoolWithTag(pTmpStr, 'Reg1');
    return status;
}


各位有什么解决方法或者这代码有什么问题?或者各位有什么好一点的获取注册表全路径的办法吗?小弟先谢过了。

------解决方案--------------------
怎么感觉你处理UNICODE好别扭.....
没勾过那函数...用CmRegisterCallback注册回调吧.比较简单.
CmRegisterCallback先要MmGetSystemRoutineAddress
------解决方案--------------------
在这个函数里面加入多行DbgPrint定位好问题再来说