驱动读取注册表问题

这是读取注册表\\Registry\\Machine\\Software\\Zhangfan\test的代码,test的值是"valueoftest!"  

红色代码是我的疑问,哪位前辈看看这是什么原因?  谢谢!

代码:

#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);
}

pvpi的结构定义是这样的:


typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
    ULONG   TitleIndex;
    ULONG   Type;
    ULONG   DataLength;
    UCHAR   Data[1];            // Variable size
} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值