今天为了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);}

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

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

    上一篇博文中主要介绍了Reactos中大部分函数的思路和HKEY和HANDLE之间的关系,本文将介绍一些Reactos中有意思的函数和存在bug的函数.(转载请指明出处) CreateNestedKe ...

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

    这篇我们看一个"容错""节省"的实例.一下是一个Win32API的声明(转载请指明出处) LONG WINAPI RegEnumKeyEx(__in HKEY ...

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

    因为我们沙箱注入了一个DLL到了目标进程,并且Hook了一系列NtXX(NtOpenKey)函数,所以我们在注入的代码中是不能使用RegXX(RegOpenKey等)这类函数的.因为RegXX系列函数 ...

  4. 一种注册表沙箱的思路、实现——注册表的一些基础知识

    要做注册表沙箱,就必须要了解部分注册表知识.而注册表的知识很多,本文主要讲述如何在win32系统是上识别注册表映射的.(转载请指明出处) 在我的xp 32bit系统上,Win+R regedit之后打 ...

  5. R语言广义线性模型函数GLM、R中有几种logistic回归扩展和变异、robust包中的glmRob函数鲁棒logistic回归、ms包中的lrm函数拟合序数逻辑回归

    R语言广义线性模型函数GLM.glm函数构建逻辑回归模型(Logistic regression).R中有几种logistic回归扩展和变异.robust包中的glmRob函数鲁棒logistic回归 ...

  6. mysql查询一个数据库所有表的记录数,mysql 查看数据库中所有表的记录数

    mysql使用select count(*) from table_name可以查询某个表的总记录数.想快速的知道数据库中所有表的记录数信息怎么办?如果使用mysql的版本在5.0及以上,可以通过查询 ...

  7. Hive中元数据表的关系和如何在元数据中删除表

    各表之间主键的关系图 这个整理很不容易呀,能够更好地了解他们,其中有一种场景需要使用的 传统的方法删除这张表: 方式一:仅删除表中数据,保留表结构 truncate table 表名; (trunca ...

  8. antd vue表单验证_ant design vue框架中自定义表单或单个表单框验证

    一.项目要求 1.要求:点击新增按钮弹出新增页面,在输入名称时进行验证,当输入名称和列表下的名称相同,即后台数据库中存在,此时将会提醒用户,该名称已存在, 2.要求:该名称不存在,则新增成功 二.思路 ...

  9. 查询mysql数据库表占用空间大小_查看 MySQL 数据库中每个表占用的空间大小-阿里云开发者社区...

    如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE ...

最新文章

  1. 华为汪涛:无线网络未来十年十大趋势
  2. python爬虫实战案例-Python爬虫实战案例:手机APP抓包爬虫
  3. CNN如何识别一幅图像中的物体
  4. python数字判断规则_判断Python输入是否为数字、字符(包括正则表达式)-阿里云开发者社区...
  5. 教学案例 计算机,宁夏计算机教学案例
  6. spider和python的关系_Scrapy框架-Spider和CrawlSpider的区别
  7. python某行某列读取数据_使用python获取csv文本的某行或某列数据的实例
  8. 主动提交事务_对于分布式事务,我“开门见山”地谈到这些理解,面试官都听懵了...
  9. PHP安装Xdebug调试工具
  10. 程序员们平时常逛的论坛
  11. 涡CFTurbo 10.2.6 2017泵轮涡旋式机械设计
  12. SqlServer存储过程详解
  13. MATLAB----矩阵的运算
  14. 基于opencv的手眼标定算法详解一-----------opencv之相机标定函数calibrateCamera()介绍
  15. matlab统计颗粒数,一种基于Matlab的谷物颗粒计数方法
  16. 任正非5年后重新强调:华为到了炸研发金字塔的时候
  17. 做容器就要做“专”!云宏 Rancher联合解决方案WinGarden2.0容器云平台正式发布!
  18. 解决Chrome和Chrome内核edge浏览器在启用硬件加速后颜色异常的问题
  19. 华尔街“是”世界经济关键角色的原因
  20. 机器学习如何提高GPU利用率

热门文章

  1. 自然语言处理:网购商品评论情感判定
  2. P1160 队列安排 链表
  3. 在Ubuntu 14.04.5 LTS上安装python模块selenium 3实录
  4. Linux中与进程终止相关的信号SIGTERM,SIGKILL,SIGINT
  5. leetcode-440 字典序的第K小数字
  6. linux open系统调用的O_DIRECT标记
  7. 二叉树 2.0 -- 非递归遍历
  8. 程序的编译和链接过程
  9. 他山之石:Github的使用
  10. (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态