驱动中读取注册表的问题

时间:2021-12-28 05:30:54


这是读取注册表 \\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


引用 1 楼 jha334201553 的回复:
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。


我主要是不明白  为什么uchar类型 要用宽字节格式符来输出呢?  请大侠指点

#4


引用 1 楼 jha334201553 的回复:
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。


那uchar类型的数组   是应该用  %s   还是 %S 呢?

#5


引用 4 楼 q0713h 的回复:
Quote: 引用 1 楼 jha334201553 的回复:

居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。


那uchar类型的数组   是应该用  %s   还是 %S 呢?
这输出的东西不是看是uchar还是char还是其他什么类型,主要你想输出什么东西,%s是从你指定的地址开始输出,知道遇到一个NULL字节就结束,如果用%S是遇到两个NULL结束,你uchar用来存什么东西你自己才知道啊,机器又不认识他是uchar还是char还是wchar,

#6


请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!

#7


引用 6 楼 guozizheng001 的回复:
请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!
多查查帮助文档,RtlUnicodeToMultiByteN、RtlUnicodeToOemN、RtlUnicodeToUTF8N

#1


居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。

#2


要用ascii方式输出请用 RtlUnicodeStringToAnsiString 转成ascii以后输出。无力吐槽啊

#3


引用 1 楼 jha334201553 的回复:
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。


我主要是不明白  为什么uchar类型 要用宽字节格式符来输出呢?  请大侠指点

#4


引用 1 楼 jha334201553 的回复:
居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。


那uchar类型的数组   是应该用  %s   还是 %S 呢?

#5


引用 4 楼 q0713h 的回复:
Quote: 引用 1 楼 jha334201553 的回复:

居然这么简单的问题在cadn发了也在pediy发了,能有点C语言基础再写代码么,%s是以\0结尾的字符串,%S是以\0\0结尾的字符串。。。


那uchar类型的数组   是应该用  %s   还是 %S 呢?
这输出的东西不是看是uchar还是char还是其他什么类型,主要你想输出什么东西,%s是从你指定的地址开始输出,知道遇到一个NULL字节就结束,如果用%S是遇到两个NULL结束,你uchar用来存什么东西你自己才知道啊,机器又不认识他是uchar还是char还是wchar,

#6


请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!

#7


引用 6 楼 guozizheng001 的回复:
请教下通过pvpi->Data如何得到char*?
需要先初始化UNICODE_STRING然后转为ANSI_STRING在从其中获取吗?太麻烦了
本人特级小白,,请多指教!
多查查帮助文档,RtlUnicodeToMultiByteN、RtlUnicodeToOemN、RtlUnicodeToUTF8N