惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google DeepMind News
Google DeepMind News
T
Tenable Blog
博客园_首页
S
Securelist
Spread Privacy
Spread Privacy
Google Online Security Blog
Google Online Security Blog
Forbes - Security
Forbes - Security
Engineering at Meta
Engineering at Meta
U
Unit 42
L
LINUX DO - 热门话题
量子位
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
Martin Fowler
Martin Fowler
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Security Latest
Security Latest
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
Know Your Adversary
Know Your Adversary
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
V2EX - 技术
V2EX - 技术
T
Tailwind CSS Blog
月光博客
月光博客
Recent Announcements
Recent Announcements
G
Google Developers Blog
F
Full Disclosure
W
WeLiveSecurity
宝玉的分享
宝玉的分享
腾讯CDC
G
GRAHAM CLULEY
Vercel News
Vercel News
Simon Willison's Weblog
Simon Willison's Weblog
美团技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security

博客园 - 秋枫

使用BizTalk Server常见问题处理 BizTalk Server中简单xml架构使用举例 CodeProject.com上微软BizTalk平台技术文章集锦 BizTalk Server 2006中使用MQSeries适配器问题处理 基于.Net平台应用程序唯一运行实例实现 使用BizTalk Server的Sql适配器出现“新事务不能登记到指定的事务处理器中”异常的处理 谈基于.net平台windows开发中的模式窗体 Visual studio 2005下xml的xsl转换调试 小提国内一些提供RSS服务的网站生成Rss文件问题 Visual studio .net 的“隐蔽性”和容易“忽略”的功能 使用sqlcmd(osql) 实用工具列出本地网内的Sql Server 服务器 《敏捷注册表》1.0使用说明书 《敏捷注册表》1.0概述 使用从BindingManagerBase.PositionChanged 事件的注意点 使用Microsoft SQL Server 2000的XML查询 asp.net中显示DataGrid控件列序号的几种方法 使用.net framewrok 1.1版System.Windows.Forms.TreeView的一个问题 使用SaveFileDialog需要注意的情况 使用.net framework中常用类在2.0版中的新功能
使用.net framewrok 1.1版注册表API的局限和解决
秋枫 · 2005-10-08 · via 博客园 - 秋枫

    最近晚上业余时间在写一个操作注册表的软件,使用Microsoft.Win32.RegistryKey多了,发现RegistryKey提供的功能还是有待于加强。

从Windows Xp开始比较常用的键值类型为五类,regedit.exe直接支持这些类型数据的编辑。

REG_BINARY

未处理的二进制数据。多数硬件组件信息都以二进制数据存储,而以十六进制格式显示在注册表编辑器中。

REG_DWORD

数据由 4 个字节长的数表示。许多设备驱动程序和服务的参数是这种类型并在注册表编辑器中以二进制、十六进制或十进制的格式显示。

REG_EXPAND_SZ

长度可变的数据串。该数据类型包含在程序或服务使用该数据时确定的变量。

REG_MULTI_SZ

多重字符串。包含了用户可读取格式的列表或多值的值通常为该类型。项用空格、逗号或其他标记分开。

REG_SZ

固定长度的文本串。

通过RegistryKey.GetValue及其重载方法得到的值类型对应为

REG_BINARY

byte [ ]  

REG_DWORD

Int32

REG_EXPAND_SZ

String

REG_MULTI_SZ

String []

REG_SZ

String

从上表看出有两个String类型,查看msdn文档并没有提供区分REG_SZ和REG_EXPAND_SZ的方法。

在使用RegistryKey.SetValue方法更新数据时如果类型为REG_MULTI_SZ会自动被转换为REG_SZ类型。

对于REG_DWORD类型这里为Int32类型,Int32.MaxValue字段的值为 2,147,483,647;即十六进制的 0x7FFFFFFF。通过注册表编辑可以设置最大到0xFFFFFFFF,也就是说使用Int64类型才可以满足需要。通过RegistryKey.GetValue获取的值大于Int32.MaxValue就会溢出成为负数。

下面是笔者得到的测试数据:

实际数据       得到的数据    备注

============================

4294967000  -296       

4294967295  -1          

2147483647   2147483647    0x7FFFFFFF (最大整数) 

2147483648   -2147483648 

通过上面的一组数据可以找到下面规律,

Dwrod值最大为0xFFFFFFFF ,即十进制的 4294967295。

在得到负数的情况下,通过以下方式得到修正后的值,

修正后值 = 4294967295  + 得到的数据(负数) + 1

如果得到十六进制的字符串如下,

十六进制字符串= (得到的数据 ).ToString("x8");

也可以使用Convert类来操作。

而通过RegistryKey.SetValue方法更新一个大于Int32.MaxValue的数值也就是Int64类型数据,就会把实际注册表中的Dword类型变为String 类型。

比如:

registrykey.SetValue(“valueName”,4294967000);

那valueName类型有原来的REG_DWORD 转变为REG_SZ。

解决办法就是对大于Int32. MaxValue的数据进行获取时的反向计算。

实际更新值 = 数值(大于Int32. MaxValue)  - 4294967295 – 1

对上面的值进行计算后更新,

-296 = 4294967000 – 4294967295 – 1

registrykey.SetValue(“valueName”, -296 );

上面提到的REG_EXPAND_SZ类型的获取和数据更新笔者通过C#包装Reg.exe命令行程序来间接调用实现。Reg.exe程序只能在Windows XP 和 Windows 2003下使用。包装Reg.exe的类这里就不讲了,实现比较容易。Reg.exe的使用帮助可以查看Windows系统的帮助和支持。

补充:

在.net framewrok 2.0版中,这部分的功能得到了增强,提供了RegistryValueKind和RegistryValueOptions枚举类型,通过RegistryKey类可以处理各种类型的数据,并增加了对项节点权限的访问。