专栏首页方亮一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4

        今天为了KPI,搞了一天的PPT,搞得恶心想吐。最后还是回到这儿,这儿才是我的净土,可以写写我的研究。

        这儿讲一些Reactos中一些明显的错误。(转载请指明出处)

        在Reactos的RegQueryInfoKeyW中有段这样的实现

    if (lpcbMaxSubKeyLen != NULL)
    {
        *lpcbMaxSubKeyLen = FullInfo->MaxNameLen / sizeof(WCHAR) + 1;
    }

    if (lpcbMaxClassLen != NULL)
    {
        *lpcbMaxClassLen = FullInfo->MaxClassLen / sizeof(WCHAR) + 1;
    }

    if (lpcbMaxValueNameLen != NULL)
    {
        *lpcbMaxValueNameLen = FullInfo->MaxValueNameLen / sizeof(WCHAR) + 1;
    }

        这儿存在一个明显的错误,当待查询键不存在子键时,最长子键名长度肯定是0啊,怎么会是1呢?同样的错误出现在最长Class长度和最长项名长度。Reactos源码中对这些长度数据的处理最后都加上了1,使我很不解,看MSDN,对这些变量的说明是pcMaxSubKeyLen [out, optional]

A pointer to a variable that receives the size of the key's subkey with the longest name,in Unicode characters, not including the terminating null character. This parameter can be NULL.

lpcMaxClassLen [out, optional]

A pointer to a variable that receives the size of the longest string that specifies a subkey class, in Unicode characters. The count returned does not include the terminating null character.This parameter can be NULL.

lpcMaxValueNameLen [out, optional]

A pointer to a variable that receives the size of the key's longest value name, in Unicode characters. The size does not include the terminating null character. This parameter can be NULL.

        可以见得,这些数据都不含结尾符的,那干嘛还要+1呢?我只能理解为,如果数据没按WCHAR对齐,在除以sizeof(WCHAR)后,数据将“缺”一位,于是就要多加一个1。但是它没有考虑到子键和子项不存在的情况。

        我修改后的代码是

        if ( NULL != lpcMaxSubKeyLen ) {
            *lpcMaxSubKeyLen = ( ( FullInfo->MaxNameLen + 1 ) & ~1 ) / sizeof(WCHAR);
        }

        if ( NULL != lpcMaxClassLen ) {
            *lpcMaxClassLen = ( ( FullInfo->MaxClassLen + 1 ) & ~1 )  / sizeof(WCHAR);
        }

        if ( NULL != lpcMaxValueNameLen ) {
            *lpcMaxValueNameLen = ( ( FullInfo->MaxValueNameLen + 1 ) & ~1 )  / sizeof(WCHAR);
        }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 进程间通信:同步双工管道

            因为工作需要,需要设计出一个双工的IPC。(转载请指明出处)在一番比较后,我发现管道是比较符合我们的需求的。但是我们需求要求管道的对方是可信任的...

    方亮
  • bug诞生记——无调用关系的代码导致死锁

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    方亮
  • 一种清除windows通知区域“僵尸”图标的方案——XP系统解决方案

            从《一种清除windows通知区域“僵尸”图标的方案——问题分析》(以后简称《问题分析》)一文中分析的通知区域结构可以看出,XP的通知区域结构是...

    方亮
  • SpringCloud Feign

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    DencyCheng
  • React-Native(Print: Entry, ":CFBundleIdentifier", Does Not Exist)

    杭州前端工程师
  • 【转载】使用python库--Graphviz为论文画出漂亮的示意图

    DOT is a plain text graph description language. It is a simple way of describing...

    marsggbo
  • 直播系统搭建:常见的直播相关协议有哪些?

    1、RTMP(Real Time Messaging Protocol,实时消息传送协议)

    山东布谷鸟
  • 教你用Python压缩图片

    如果需要做图片识别那么必定需要大量的训练素材,我们通常使用爬虫来获取,python爬取bing图片,python爬取百度图片,但是怕取下来的图片大小不一,再进行...

    py3study
  • 2-关于单片机通信数据传输(中断接收,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    杨奉武
  • HDU 1030 纯数学 找规律

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot...

    csxiaoyao

扫码关注云+社区

领取腾讯云代金券