阅读:2700回复:3
在内核中如何读取注册表中一个值项
在内核中如何读取注册表中一个值项,我用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()也没能正确读取一个值项的值,请教这个函数的用法? |
|
沙发#
发布于: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( ¶mTable[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, ¶mTable[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_, \"\\\\\"); } } |
|
板凳#
发布于:2005-06-17 10:37
p = (char*)(pInformation->Data);
为什么不用宽字符?? |
|
|
地板#
发布于:2005-06-16 16:55
ding
|
|
|