首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-02-22 
驱动中使用ObQueryNameString获取注册表全路径假死的问题小弟在驱动中HOOK了ZwSetValueKey函数,用来检测对

驱动中使用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定位好问题再来说

热点排行