这是读取注册表 \\Registry\\Machine\\Software\\Zhangfan\test 的代码 , test的值是"value of test!"
代码最靠下面的注释里面是我的疑问
哪位前辈看看这是什么原因?
谢谢!
#define MY_REG_SOFTWARE_KEY_NAME L"\\Registry\\Machine\\Software\\Zhangfan"
VOID QueryRegTest()
{
UNICODE_STRING RegUnicodeString;
HANDLE hRegister;
PKEY_VALUE_PARTIAL_INFORMATION pvpi;
OBJECT_ATTRIBUTES objectAttributes;
NTSTATUS ntStatus;
UNICODE_STRING ValueName;
ULONG ulSize;
//初始化UNICODE_STRING字符串
RtlInitUnicodeString( &RegUnicodeString,
MY_REG_SOFTWARE_KEY_NAME);
//初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&RegUnicodeString,
OBJ_CASE_INSENSITIVE,//对大小写敏感
NULL,
NULL );
//打开注册表
ntStatus = ZwOpenKey( &hRegister,
KEY_ALL_ACCESS,
&objectAttributes);
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Open register successfully\n"));
}
//初始化ValueName
RtlInitUnicodeString( &ValueName, L"test");
ntStatus = ZwQueryValueKey(hRegister,
&ValueName,
KeyValuePartialInformation ,
NULL,
0,
&ulSize);
if (ntStatus==STATUS_OBJECT_NAME_NOT_FOUND || ulSize==0)
{
ZwClose(hRegister);
KdPrint(("The item is not exist\n"));
return;
}
pvpi =
(PKEY_VALUE_PARTIAL_INFORMATION)
ExAllocatePool(PagedPool,ulSize);
ntStatus = ZwQueryValueKey(hRegister,
&ValueName,
KeyValuePartialInformation ,
pvpi,
ulSize,
&ulSize);
if (!NT_SUCCESS(ntStatus))
{
ZwClose(hRegister);
KdPrint(("Read regsiter error\n"));
return;
}
//判断是否为REG_SZ类型
if (pvpi->Type==REG_SZ)
{
ANSI_STRING a;
ANSI_STRING a1;
UNICODE_STRING u;
//pvpi->Data 为读取到的键值,正常应该是 "value of test!"
KdPrint(("以宽字符串打印:%S\n",pvpi->Data)); //以宽字符串方式打印,输出正常,但是pvpi->Data明明是uchar类型的,为什么能用宽字符来输出?
KdPrint(("以ANSI字符串格式打印:%s\n",pvpi->Data)); //以ANSI字符串格式打印,输出不正常,只能输出第一个字符,但是pvpi->Data是uchar类型的,为毛不正确?
KdPrint(("以ANSI字符串格式打印:%s\n",(char*)pvpi->Data));//添加强制换转,效果同上
RtlInitUnicodeString(&u,pvpi->Data); //RtlInitUnicodeString的第二个参数要求为wchar* ,而pvpi->Data类型为uchar ,但是编译能通过,输出也正常,为什么可以这样呢?
//RtlInitUnicodeString(&u,(WCHAR*)pvpi->Data); //此句添加强制转换,效果同上
KdPrint(("unicode_string:%wZ\n",&u));
RtlUnicodeStringToAnsiString(&a1,&u,TRUE); //unicode_string转换为asni_string,输出正确
KdPrint(("unicode to ansi_string:%Z\n",&a1));
RtlFreeAnsiString(&a1);
RtlInitAnsiString(&a,(char*)pvpi->Data);//输出内容不正确,只能输出第一个字符
KdPrint(("ansi_string:%Z\n",&a));
}
ZwClose(hRegister);
}
下面是驱动的输出
7 个解决方案
#1
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。
#2
要用ascii方式输出请用 RtlUnicodeStringToAnsiString 转成ascii以后输出。无力吐槽啊
#3
我主要是不明白 为什么uchar类型 要用宽字节格式符来输出呢? 请大侠指点
#4
那uchar类型的数组 是应该用 %s 还是 %S 呢?
#5
这输出的东西不是看是uchar还是char还是其他什么类型,主要你想输出什么东西,%s是从你指定的地址开始输出,知道遇到一个NULL字节就结束,如果用%S是遇到两个NULL结束,你uchar用来存什么东西你自己才知道啊,机器又不认识他是uchar还是char还是wchar,
#6
请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!
#7
请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!
#1
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。
#2
要用ascii方式输出请用 RtlUnicodeStringToAnsiString 转成ascii以后输出。无力吐槽啊
#3
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。
我主要是不明白 为什么uchar类型 要用宽字节格式符来输出呢? 请大侠指点
#4
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。
那uchar类型的数组 是应该用 %s 还是 %S 呢?
#5
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。
那uchar类型的数组 是应该用 %s 还是 %S 呢?
#6
请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!
#7
请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!