Access 64-bit HKLM\Software Registry by 32-bit C#.NET Application

http://www.codeproject.com/Articles/1003177/Access-bit-HKLM-Software-Registry-by-bit-Csharp-NE

While running 32-bit Windows application on a 64-bit windows OS, there is a registry redirection. Here, if 32-bit application tries to read a key under HKLM\Software, then due to Registry redirection effective path becomes HKLM\Software\Wow6432Node. For example, we are running 64-bit and 32-bit application to read registry keys as HKLM\Software\xyz and HKLM\Software\Wow6432Node\xyz.

So by default, with an input of HKLM\Software, 64-bit application will read HKLM\Software\xyz while because of registry redirection 32-bit application will read HKLM\Software\Wow6432Node\xyz.

In C#, to read 64-bit HKLM\Software registry keys, we can use RegistryKey.OpenBaseKey method. This method takes two arguments- RegistryHive and RegistryView. Here, seperate registry views are present for 32-bit and 64-bit.

Here is the sample C# code to read AppPaths for 32-bit and 64-bit applications installed on the system:

try
                {
                    string AppPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths";
                    RegistryKey rkbase = null;
                    rkbase = RegistryKey.OpenBaseKey
                             (Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
                    using (RegistryKey rk = rkbase.OpenSubKey(uninstallKey))
                    {
                        foreach (string skName in rk.GetSubKeyNames())
                        {
                            using (RegistryKey sk = rk.OpenSubKey(skName))
                            {
                                try
                                {

                                    if (sk.GetValue("Path") != null)
                                    {
                                        //add this to required list
                                    }
                                }
                                catch (Exception ex)
                                {
                                    MessageBox.Show(ex.Message);
                                }
                            }
                        }
                    }

                    if (Environment.Is64BitOperatingSystem)
                    {
                        using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(AppPath))
                        {
                            foreach (string skName in rk.GetSubKeyNames())
                            {
                                using (RegistryKey sk = rk.OpenSubKey(skName))
                                {
                                    try
                                    {
                                        if (sk.GetValue("Path") != null)
                                        {
                                            //add this to required list
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(ex.Message);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

Here, Environment.Is64BitOperatingSystem is used to check if the current system is 64-bit or not. This function is avialable with .NET Framework 4.0.

时间: 2024-10-10 17:40:38

Access 64-bit HKLM\Software Registry by 32-bit C#.NET Application的相关文章

64位读取注册表与32位的区别

有一个读取注册表信息的程序  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0, KEY_READ, &hKey) == ERROR_SUCCESS)/ ,在32位下完全正常,但是在64位返回值正确,但就是读不到东西.后来单步发现读不到东西,就搜64位读注册表失败,发现需要加 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0,KEY_READ|KEY_WOW64_64KEY, &am

使用webdriver出现的问题:[18796:1808:0730/131103.313:ERROR:install_util.cc(600)] Failed to read HKLM\SOFTWARE\Policies\Google\Chrome\MachineLevelUserCloudPolicyEnrollmentToken: 系统找不到指定的文件。 (0x2) DevTools lis

1.注册表导致 [5956:4996:0710/155156.898:ERROR:install_util.cc(589)] Unable to create registry key HKLM\SOFTWARE\Policies\Google\Chrome for reading result=2 找不到注册信息. 解决方法: 1)打开注册表编辑器 a) 快捷键win+R b) 输入:regedit c) 打开regedit.exe 2)找到并按顺序展开以下项目: -HKEY_LOCAL_MA

debian 64位系统中添加对32位的支持

dpkg --add-architecture i386 apt-get update apt-get install ia32-libs debian 64位系统中添加对32位的支持,布布扣,bubuko.com

呃,如何使 .NET 程序,在 64位 系统 中,以 32位 模式运行。

其实最简单的方法就是在解决方案中,把平台设为 x86 就好了哈~   但是今天遇到一个第三方的软件,它调用的一个 dll 是 32位 的,可能它没有测试过在 64位 系统下运行的情况,它在编译时是按默认的配置设为了 Any CPU. 但是在 64位 系统中以默认 64位 模式运行时,再调用 32位 的 dll 就报异常了... 于是想到的一个办法就是让它在 64位 系统中,以 32位 模式运行就好了~   在网上搜了一下,没想到 .NET 本身就提供了这个修改工具,叫做 CorFlags.exe

异常:请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1

异常截图: 附注:本人D:\Program Files (x86)\Microsoft Visual Studio 11.0\ReportViewer 下只有Microsoft.ReportViewer.WebForms.dll和Microsoft.ReportViewer.WinForms.dll两个程序集 ,如果你的这个路径下有3个dll,分别是.webForms.dll 和command.dll等  ,建议你先copy这3个程序集到项目里的BIN目录下.兴许就可以了. 解决办法一:http

Linux判断CPU是32位还是64位,判断系统是32位还是64位

from:http://www.ipcpu.com/2010/08/linux-cpu-32-64/ 本文仅限于服务器CPU和Linux系统讨论,与台式电脑.笔记本无关. 32位.64位不能乱装,64的能装32位的,因为64位的CPU可以兼容32位,32位的装不了64位的.最近部署了MongoDB,系统是32位的提示会有最大文件2G的限制.还有最常见的问题32位系统不支持4G以上内存,即使打PAE效率也受影响. 1.判断CPU是32位还是64位 这个问题比较有意思,网上给出的办法都是判断了系统的

Win7 64位系统上配置使用32位的Eclipse(转)

Win7 64位系统上配置使用32位的Eclipse 博客分类: Eclipse eclipse 最近工作电脑换成了64位的win7系统,之前个人电脑上安装的jdk和Eclipse都是32位的.而新的工作电脑上安装的JDK是64位的,因 为原来的Eclipse自己安装了很多的插件和个性化配置,不想重新安装64位的Eclipse,所以想在64位的win7系统上继续使用原来的32位 Eclipse. 32位的Eclipse无法和64位的jdk搭配使用,但是我又不想仅仅为了适配Eclipse而只安装3

在64位主机上编译产生32位的目标代码

   今天又看CS630[1]的Chapter 15,发现里头的一个例程manydots.s无法正常编译. $ gcc manydots.s -o manydots /tmp/ccIvmRVT.o: In function `_start': (.text+0x0): multiple definition of `_start' /usr/lib/gcc/x86_64-linux-gnu/4.3.1/../../../../lib/crt1.o:(.text+0x0): first defin

64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多

前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操作系统只是硬件和应用软件中间的一个平台.我们的CPU从原来的8位,16位,到现在的32位和64位. 背景: 电脑的内存是8GB, 装的是32位的Win 7 32位版本,系统认出的内存是3.5GB, 应该说是4GB,因为还有0.5GB内存分配给了显存. 笔者十分痛苦,花重金购置的骇客神条单条8GB竟然