描述:
            我想对RegMon进行改造,能做到在Hook注册表SetValue操作时,先获取该注册表项值修改之前的原值。
具体操作如下(针对430版本):
在HookRegSetValueKey函数中,GetFullName( KeyHandle, valueName, fullname );代码之后,加入如下代码:
     ResultLength = 0;
     ntstatus = ZwQueryValueKey(KeyHandle,valueName,KeyValueFullInformation,
            pKeyValueInformation,ResultLength,&ResultLength);//获取所需内存空间大小
     strcpy(olddata,"STATUS_EMPTY");
     if(ResultLength>0){
           pKeyValueInformation = ( PKEY_VALUE_FULL_INFORMATION) \
                 ExAllocatePool( PagedPool, ResultLength);//分配内存空间
           ntstatus = ZwQueryValueKey( KeyHandle,
                                                      valueName,
                                                      KeyValueFullInformation,
                                                      pKeyValueInformation,
                                                      ResultLength, &ResultLength);//实际取值
           if(ntstatus==STATUS_BUFFER_TOO_SMALL)
                 strcpy(olddata,"BUF TOO SMALL");
           else if(ntstatus==STATUS_INVALID_PARAMETER)
                 strcpy(olddata,"STATUS_INVALID_PARAMETER");
           else if(ntstatus==STATUS_OBJECT_NAME_NOT_FOUND)
                 strcpy(olddata,"STATUS_OBJECT_NAME_NOT_FOUND");
           else
                 strcpy(olddata,"STATUS_SUCESS");
     }
现在有两个问题:1、第一次调用ZwQueryValueKey时没有问题,正确返回了所需内存大小,但是第二次调用时,用SoftIce调试,出现问题,不再继续执行接下来的代码了。2、若第二次调用ZwQueryValueKey成功,我如何将获取的注册表项值也同样采用后续的         LogRecord方式返回给用户态程序?我不大会用字符转换的咚咚。
请各位指点,如果我上述方法是错误的,请问各位都是用什么办法实现的?

