一种注册表沙箱的思路、实现——研究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);}
一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4相关推荐
- 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现2
上一篇博文中主要介绍了Reactos中大部分函数的思路和HKEY和HANDLE之间的关系,本文将介绍一些Reactos中有意思的函数和存在bug的函数.(转载请指明出处) CreateNestedKe ...
- 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现3
这篇我们看一个"容错""节省"的实例.一下是一个Win32API的声明(转载请指明出处) LONG WINAPI RegEnumKeyEx(__in HKEY ...
- 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现1
因为我们沙箱注入了一个DLL到了目标进程,并且Hook了一系列NtXX(NtOpenKey)函数,所以我们在注入的代码中是不能使用RegXX(RegOpenKey等)这类函数的.因为RegXX系列函数 ...
- 一种注册表沙箱的思路、实现——注册表的一些基础知识
要做注册表沙箱,就必须要了解部分注册表知识.而注册表的知识很多,本文主要讲述如何在win32系统是上识别注册表映射的.(转载请指明出处) 在我的xp 32bit系统上,Win+R regedit之后打 ...
- R语言广义线性模型函数GLM、R中有几种logistic回归扩展和变异、robust包中的glmRob函数鲁棒logistic回归、ms包中的lrm函数拟合序数逻辑回归
R语言广义线性模型函数GLM.glm函数构建逻辑回归模型(Logistic regression).R中有几种logistic回归扩展和变异.robust包中的glmRob函数鲁棒logistic回归 ...
- mysql查询一个数据库所有表的记录数,mysql 查看数据库中所有表的记录数
mysql使用select count(*) from table_name可以查询某个表的总记录数.想快速的知道数据库中所有表的记录数信息怎么办?如果使用mysql的版本在5.0及以上,可以通过查询 ...
- Hive中元数据表的关系和如何在元数据中删除表
各表之间主键的关系图 这个整理很不容易呀,能够更好地了解他们,其中有一种场景需要使用的 传统的方法删除这张表: 方式一:仅删除表中数据,保留表结构 truncate table 表名; (trunca ...
- antd vue表单验证_ant design vue框架中自定义表单或单个表单框验证
一.项目要求 1.要求:点击新增按钮弹出新增页面,在输入名称时进行验证,当输入名称和列表下的名称相同,即后台数据库中存在,此时将会提醒用户,该名称已存在, 2.要求:该名称不存在,则新增成功 二.思路 ...
- 查询mysql数据库表占用空间大小_查看 MySQL 数据库中每个表占用的空间大小-阿里云开发者社区...
如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE ...
最新文章
- 华为汪涛:无线网络未来十年十大趋势
- python爬虫实战案例-Python爬虫实战案例:手机APP抓包爬虫
- CNN如何识别一幅图像中的物体
- python数字判断规则_判断Python输入是否为数字、字符(包括正则表达式)-阿里云开发者社区...
- 教学案例 计算机,宁夏计算机教学案例
- spider和python的关系_Scrapy框架-Spider和CrawlSpider的区别
- python某行某列读取数据_使用python获取csv文本的某行或某列数据的实例
- 主动提交事务_对于分布式事务,我“开门见山”地谈到这些理解,面试官都听懵了...
- PHP安装Xdebug调试工具
- 程序员们平时常逛的论坛
- 涡CFTurbo 10.2.6 2017泵轮涡旋式机械设计
- SqlServer存储过程详解
- MATLAB----矩阵的运算
- 基于opencv的手眼标定算法详解一-----------opencv之相机标定函数calibrateCamera()介绍
- matlab统计颗粒数,一种基于Matlab的谷物颗粒计数方法
- 任正非5年后重新强调:华为到了炸研发金字塔的时候
- 做容器就要做“专”!云宏 Rancher联合解决方案WinGarden2.0容器云平台正式发布!
- 解决Chrome和Chrome内核edge浏览器在启用硬件加速后颜色异常的问题
- 华尔街“是”世界经济关键角色的原因
- 机器学习如何提高GPU利用率
热门文章
- 自然语言处理:网购商品评论情感判定
- P1160 队列安排 链表
- 在Ubuntu 14.04.5 LTS上安装python模块selenium 3实录
- Linux中与进程终止相关的信号SIGTERM,SIGKILL,SIGINT
- leetcode-440 字典序的第K小数字
- linux open系统调用的O_DIRECT标记
- 二叉树 2.0 -- 非递归遍历
- 程序的编译和链接过程
- 他山之石:Github的使用
- (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态