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

简介: 有一个读取注册表信息的程序  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0, KEY_READ, &hKey) == ERROR_SUCCESS)/,在32位下完全正常,但是在64位返回值正确,但就是读不到东西。

有一个读取注册表信息的程序  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, &hKey) == ERROR_SUCCESS)就可以了,我是全部把权限提高,还可以根据不同的操作系统,设置不同的参数。

 

IsWow64Process 判断64位操作系统

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
IsWow64返回TRUE则是64位系统,否则为32位系统。
BOOL IsWow64()
{
    BOOL bIsWow64 = FALSE;
    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
        GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if(NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
        {
                        return FALSE;
        }
    }
    return bIsWow64;
}

可参考的文献:

 

http://msdn.microsoft.com/en-us/library/aa384129(v=VS.85).aspx

http://www.codeproject.com/Articles/51326/Net-Compilation-registry-accessing-and-applicatio

http://boluns.blog.163.com/blog/static/69845968201071132032313/

 

 

 

The code

The next code is a personal translation to C# of several pieces of code I found, mostly from here:

[DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "RegOpenKeyEx")]
static extern int RegOpenKeyEx(IntPtr hKey, string subKey, uint options, int sam, out IntPtr phkResult); [Flags] public enum eRegWow64Options : int { None = 0x0000, KEY_WOW64_64KEY = 0x0100, KEY_WOW64_32KEY = 0x0200, // Add here any others needed, from the table of the previous chapter } [Flags] public enum eRegistryRights : int { ReadKey = 131097, WriteKey = 131078, } public static RegistryKey OpenSubKey(RegistryKey pParentKey, string pSubKeyName, bool pWriteable, eRegWow64Options pOptions) { if (pParentKey == null || GetRegistryKeyHandle(pParentKey).Equals(System.IntPtr.Zero)) throw new System.Exception("OpenSubKey: Parent key is not open"); eRegistryRights Rights = eRegistryRights.ReadKey; if (pWriteable) Rights = eRegistryRights.WriteKey; System.IntPtr SubKeyHandle; System.Int32 Result = RegOpenKeyEx(GetRegistryKeyHandle(pParentKey), pSubKeyName, 0, (int)Rights | (int)pOptions, out SubKeyHandle); if (Result != 0) { System.ComponentModel.Win32Exception W32ex = new System.ComponentModel.Win32Exception(); throw new System.Exception("OpenSubKey: Exception encountered opening key", W32ex); } return PointerToRegistryKey(SubKeyHandle, pWriteable, false); } private static System.IntPtr GetRegistryKeyHandle(RegistryKey pRegisteryKey) { Type Type = Type.GetType("Microsoft.Win32.RegistryKey"); FieldInfo Info = Type.GetField("hkey", BindingFlags.NonPublic | BindingFlags.Instance); SafeHandle Handle = (SafeHandle)Info.GetValue(pRegisteryKey); IntPtr RealHandle = Handle.DangerousGetHandle(); return Handle.DangerousGetHandle(); } private static RegistryKey PointerToRegistryKey(IntPtr hKey, bool pWritable, bool pOwnsHandle) { // Create a SafeHandles.SafeRegistryHandle from this pointer - this is a private class BindingFlags privateConstructors = BindingFlags.Instance | BindingFlags.NonPublic; Type safeRegistryHandleType = typeof( SafeHandleZeroOrMinusOneIsInvalid).Assembly.GetType( "Microsoft.Win32.SafeHandles.SafeRegistryHandle"); Type[] safeRegistryHandleConstructorTypes = new Type[] { typeof(System.IntPtr), typeof(System.Boolean) }; ConstructorInfo safeRegistryHandleConstructor = safeRegistryHandleType.GetConstructor(privateConstructors, null, safeRegistryHandleConstructorTypes, null); Object safeHandle = safeRegistryHandleConstructor.Invoke(new Object[] { hKey, pOwnsHandle }); // Create a new Registry key using the private constructor using the // safeHandle - this should then behave like // a .NET natively opened handle and disposed of correctly Type registryKeyType = typeof(Microsoft.Win32.RegistryKey); Type[] registryKeyConstructorTypes = new Type[] { safeRegistryHandleType, typeof(Boolean) }; ConstructorInfo registryKeyConstructor = registryKeyType.GetConstructor(privateConstructors, null, registryKeyConstructorTypes, null); RegistryKey result = (RegistryKey)registryKeyConstructor.Invoke(new Object[] { safeHandle, pWritable }); return result; }

How to use the Code

The OpenSubKey will return the searched key, allowing you to specify reading from the normal registry, or from the alternative 32-bit, WOW64 registry. The following example reads from the 32-bit WOW64 registry:

try 
{ 
    RegistryKey key = OpenSubKey(Registry.LocalMachine,"Software\\[Key]",false,
        eRegWow64Options.KEY_WOW64_32KEY); 
}
catch 
{ 
    // Parent key not open, exception found at opening (probably related to // security permissions requested) }

You just need to place your key name where “[Key]” is.

目录
打赏
0
0
0
0
109
分享
相关文章
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
大型语言模型(LLM)的推理效率是AI领域的重要挑战。本文聚焦KV缓存技术,通过存储复用注意力机制中的Key和Value张量,减少冗余计算,显著提升推理效率。文章从理论到实践,详细解析KV缓存原理、实现与性能优势,并提供PyTorch代码示例。实验表明,该技术在长序列生成中可将推理时间降低近60%,为大模型优化提供了有效方案。
654 15
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
通义灵码在金融与教育领域的应用
通义灵码在金融与教育领域的应用展现了其强大潜力。在金融行业,它通过优化风险评估、智能投顾及交易算法,提升业务效率与安全性;在教育领域,则通过个性化学习方案、智能化教学资源生成及编程教育辅助,革新教学方式,满足多样化需求,为行业注入新活力。
利用 AI 进行代码生成:GitHub Copilot 的实践与反思
【10月更文挑战第23天】本文探讨了GitHub Copilot,一个由微软和OpenAI合作推出的AI代码生成工具,其核心功能包括智能代码补全、多语言支持、上下文感知和持续学习。文章介绍了Copilot在加速开发流程、学习新语言、提高代码质量和减少重复工作等方面的应用,并反思了AI在代码生成中的代码所有权、安全性和技能发展等问题。最后,文章提供了实施Copilot的最佳实践,强调了在使用AI工具时保持对代码的控制和理解的重要性。
一个抽取式摘要的应用示例
【10月更文挑战第4天】本文介绍了生成式和抽取式两种摘要算法。生成式摘要通过自然语言生成技术,使用机器学习模型生成新的、精简的句子;抽取式摘要则从文档中提取最能代表内容的句子。文中详细描述了基于TF-IDF的抽取式摘要算法的实现过程,包括计算TF、IDF、句子权重,以及提取摘要的具体步骤。通过示例代码展示了如何实现一个简单的抽取式摘要系统。
309 1
如何在 DNS 记录中设置反向代理服务器?
要设置反向代理服务器,首先需安装配置软件(如 Nginx 或 Apache),并确保域名正确指向服务器 IP。接着,在 DNS 中设置 A 或 CNAME 记录,将域名指向反向代理服务器。然后编辑 Nginx 或 Apache 的配置文件,将请求转发至后端服务器。最后,通过浏览器访问域名测试配置是否成功,并使用工具检查请求流向和响应情况。
ly~
979 3
AES算法逆向实战--某思路
本文是关于AES加密算法的逆向分析实战。通过跟栈方式找出加密位置,发现在`jslencode`函数中完成账号和密码加密。使用CryptoJS库,示例代码展示了如何用AES进行加密,其中`397151C04723421F`作为key,加密手机号和密码,并打印结果。
300 1
windows 下C++生成Dump调试文件与分析
windows 下C++生成Dump调试文件与分析
1166 0
想当程序员,如何判断自己是否适合当前端程序员?
真正学习的时候,大多数所谓的兴趣就是扯淡; 只有那种遇到难题就兴奋,敲代码时候,越挫越勇的人,才叫感兴趣; 真正的感兴趣是让你学的久,学的不累;
236 0
谷歌亮出 AI“王牌”,生成超逼真图片,网友:OpenAI DALL-E 要被碾压了?
如今的AI领域出现了一波新趋势——文本到图像生成器。只要把文本描述输入这些程序,它们主涌生成与描述内容高度匹配的精准图片。这些程序还支持各种风格,从油画、CGI 渲染再到实景照片无所不包。总之,只有你想不到,没有它画不出。
911 0
谷歌亮出 AI“王牌”,生成超逼真图片,网友:OpenAI DALL-E 要被碾压了?
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问