lghtly
驱动牛犊
驱动牛犊
  • 注册日期2004-10-14
  • 最后登录2005-11-29
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2700回复:3

在内核中如何读取注册表中一个值项

楼主#
更多 发布于:2005-05-23 19:43
在内核中如何读取注册表中一个值项,我用ZwOpenKey(),然后用ZwQueryValueKey(),
可得到的数据中仅有前四个字节可用,第五个字节以后的数据不知道为何用DbgPrint()
打印不出来,现将程序贴出,请高手指点:

BOOLEAN  ReadValueKey(IN HANDLE  KeyHandle, //句柄已有
IN PUNICODE_STRING ValueName,//值项名称
                    )
{
ULONG cbBuffer = 20000, ResultLength, k;
KEY_VALUE_PARTIAL_INFORMATION *pInformation = NULL;
char *p;


pInformation = ExAllocatePool (NonPagedPool, cbBuffer);
if (pInformation == NULL)
{
return FALSE;
}
memset(pInformation, 0, cbBuffer);
ZwQueryValueKey(KeyHandle,
ValueName,
KeyValuePartialInformation,
pInformation,
sizeof(KEY_VALUE_PARTIAL_INFORMATION),
&ResultLength);
DbgPrint(\"返回的字节数为%d\\n\",ResultLength);//这个值是正确的
p = (char*)(pInformation->Data);
for(k=0;  k < pInformation->DataLength; k++)
{
//此处仅前四个字节的值是正确的,以后的就不正确了,为什么?
DbgPrint(\"pInformation->Data[%d], %c, %d\",k, p[k],p[k]);
};
ExFreePool(pInformation);
return TRUE;
}

另外,我用函数RtlQueryRegistryValues()也没能正确读取一个值项的值,请教这个函数的用法?

yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-18 09:14
#define ERRORLEN        64

// buffer for system root directory
CHAR                    HIDE_DIR_PARENT[ERRORLEN];
CHAR                    HIDE_DIR_PARENT_[ERRORLEN];


void GetSystem32Dir(void)
{
    NTSTATUS                ntStatus;
ANSI_STRING ansi;
    UNICODE_STRING          path;
CHAR                    sys32dir[ERRORLEN];
    RTL_QUERY_REGISTRY_TABLE paramTable[2];

memset(HIDE_DIR_PARENT, 0, ERRORLEN);
memset(HIDE_DIR_PARENT_, 0, ERRORLEN);

    path.Buffer = ExAllocatePool( PagedPool, ERRORLEN*2+sizeof(UNICODE_NULL));
if(!path.Buffer)
return;
path.Length = ERRORLEN*2 + +sizeof(UNICODE_NULL);
path.MaximumLength = path.Length;
    RtlZeroMemory( path.Buffer, path.Length );

    RtlZeroMemory( &paramTable[0], sizeof(paramTable));
    paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
    paramTable[0].Name = L\"SystemRoot\";
    paramTable[0].EntryContext = &path;
    paramTable[0].DefaultType = REG_SZ;
    paramTable[0].DefaultData = &path;
    paramTable[0].DefaultLength = 0;

    ntStatus = RtlQueryRegistryValues( RTL_REGISTRY_WINDOWS_NT,
                            NULL, &paramTable[0], NULL, NULL );
if(ntStatus == STATUS_SUCCESS)
{
        DbgPrint((\"RtlQueryRegistryValues len=%d\\n\", path.Length));

memcpy(sys32dir, \"c:\\\\windows\\\\system32\", sizeof(\"c:\\\\windows\\\\system32\"));
RtlInitAnsiString(&ansi, sys32dir);
ntStatus = RtlUnicodeStringToAnsiString(&ansi, &path, FALSE);
if(ntStatus == STATUS_SUCCESS)
{
memcpy(HIDE_DIR_PARENT, sys32dir, ansi.Length);
strcat(HIDE_DIR_PARENT, APPEND_AFTER_SYS32);
strcat(HIDE_DIR_PARENT_, HIDE_DIR_PARENT);
strcat(HIDE_DIR_PARENT_, \"\\\\\");
DbgPrint((\"GetSystem32Dir: %s,%s,%s\\n\", sys32dir, HIDE_DIR_PARENT, HIDE_DIR_PARENT_));
}
else
{
DbgPrint((\"%d: RtlUnicodeStringToAnsiString error!\\n\", FILESYS_NAME));
memcpy(HIDE_DIR_PARENT, \"c:\\\\windows\\\\system32\", sizeof(\"c:\\\\windows\\\\system32\"));
strcat(HIDE_DIR_PARENT_, HIDE_DIR_PARENT);
strcat(HIDE_DIR_PARENT_, \"\\\\\");
}
}
else
{
        DbgPrint((\"%s: RtlQueryRegistryValues error!\\n\", FILESYS_NAME));
memcpy(HIDE_DIR_PARENT, \"c:\\\\windows\\\\system32\", sizeof(\"c:\\\\windows\\\\system32\"));
strcat(HIDE_DIR_PARENT_, HIDE_DIR_PARENT);
strcat(HIDE_DIR_PARENT_, \"\\\\\");
}
}
abanwjc
驱动小牛
驱动小牛
  • 注册日期2003-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-17 10:37
p = (char*)(pInformation->Data);

为什么不用宽字符??
“老婆,快搬个凳子出来,一起看火星来的楼主升天啦!”
jinsanlen
驱动牛犊
驱动牛犊
  • 注册日期2005-06-10
  • 最后登录2005-10-04
  • 粉丝0
  • 关注0
  • 积分-1分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-16 16:55
ding
Jin
游客

返回顶部