您的位置:澳门新葡萄京最大平台 > 最大平台 > 32位程序访问64位系统注册表

32位程序访问64位系统注册表

发布时间:2019-09-28 00:42编辑:最大平台浏览(113)

      我的上一篇小说已经解说了“三十一人程序和陆16位程序在陆九人平台上读写注册表的分别”,那么接下去将要回答上篇所留下来的三个题材:三10位程序怎样访谈陆十五人系统注册表(即:六十三人程序所拜望的注册表地点)。

      我们已经知晓:

        ①:本机格局 陆16位程序运营在纯格局下,而且访谈键和存款和储蓄在偏投注册表子键中的值:HKEY_LOCAL_MACHINESoftware

        ②:32 位程序运维在 WOW64 格局下,并且访谈键和值存款和储蓄在以投注册表子项中:HKEY_LOCAL_MACHINESoftwareWOW6432nod

      那么要促成32为顺序访谈62人注册表消息,还要掌握如下概念:1:文件系统转向。2:注册表重定向(转向)。3:注册表反射。

        ①:文件系统转向

        三十四人进程不能够加载61人Dll,66个人进程也不可以加载33位Dll。Windows的系统目录包罗了具备安装的应用程序和它们的Dll文件,依据大家所述 的准绳,

        它应该被分成给陆十位应用程序的目录和给33位应用程序的目录。如若不那样,大家就不能够区分叁十个人和六12人的Dll文件。对于68位应用程序,其 文件平时被

        放在%windir%system32和%programfiles%(比如:c:program files)。对于三玖人应用程序,其文件常常在%windir%syswow64和

        C:program files (x86)下边。假使大家用三十三位程序去访问%windir%system32,不管大家用硬编码还是另外的法子,系统都会自动地给大家

        转向到%windir%syswow64下边。这种转化对于每种叁十五个人应用程序暗中认可都以张开的。但是这种转化对于我们来讲并不总是要求的。那么大家能够在

        C#内部调用相关的API来关闭和开拓这种转化。常用的函数有3个:

            Wow64DisableWow64FsRedirection(关闭系统转 向),

            Wow64RevertWow64FsRedirection(展开系统转向),

            Wow64EnableWow64FsRedirection(伸开系统转向)。

        不过Wow64EnableWow64FsRedirection在嵌套使用的时候不可相信,所以日常用地点的 Wow64RevertWow64FsRedirection来打开文件系统转向

        功能。在C#中,我们可以利用DllImport直接调用那五个函数。

        ②:注册表重定向(转向)

        若要援救的 32 位和 64 位 COM 注册和程序共存状态,WOW64 子系统提供 30人程序行使的注册表的另一个视图。在 WOW64 子系统选拔注册表

        重定向截获位级其他注册表调用。注册表重定向还是可以够保障登记表调用被定向到在注册表中国科高校学的分层。

        当大家设置新程序或 Windows x64 版的微管理器上运转程序时,所做的 64 位程序的注册表调用采访HKEY_LOCAL_MACHINESoftware 注册表子键

        不重定向。WOW64 截获由 三11个人程序的挂号表调用到 HKEY_LOCAL_MACHINESoftware,然后将它们重定向到

        HKEY_LOCAL_MACHINESoftwareWOW6432node 子键。 通过重定向仅 32 位程序调用,WOW64 可保险程序始终写入相应的登记表子键。

        注册表重定向无需程序代码修改,和此进度是对客商透明。

        ③:注册表反射

        反射使八个同样的注册表,以补助同期开展的本机和 WOW64 操作的物理别本的存在,

        打开注册表的 63人节在颇具时间和注册表反射提供了一种容纳 32 位的实时方法。

      轻松的摸底了这一个,上面说一下有血有肉的贯彻步骤:

        关闭62位(文件系统)的操作转向

          获得操作Key值的句柄

            关闭注册表转向(禁绝特定项的注册表反射)

          获取访谈的Key值

            打开注册表转向(开启特定项的注册表反射)

        开启60人(文件系统)的操作转向

      【注:由于大家在前后相继中用了DllImport,所以要引进命名空间:System.Runtime.InteropServices】

      上边请看代码示例

    最大平台, 

      using System;  
      using System.Collections.Generic;  
      using System.Linq;  
      using System.Text;  
      using Microsoft.Win32;  
      using System.Runtime.InteropServices;  
    
      namespace OperateRegistrationTable  
     { 
         class Programe 
         { 
             static void Main(string[] args) 
             { 
                 string myParentKeyName = "HKEY_LOCAL_MACHINE"; 
                 string mySubKeyName = @"SOFTWAREEricSunMyTestKey"; 
                 string myKeyName = "MyKeyName"; 
    
                 string value = string.Empty; 
                 value = Utility.Get64BitRegistryKey(myParentKeyName, mySubKeyName, myKeyName); 
                 Console.WriteLine("The Value is: {0}", value); 
             } 
         } 
    
         public class Utility 
         { 
             #region 32位程序读写64注册表 
    
             static UIntPtr HKEY_CLASSES_ROOT = (UIntPtr)0x80000000; 
             static UIntPtr HKEY_CURRENT_USER = (UIntPtr)0x80000001; 
             static UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002; 
             static UIntPtr HKEY_USERS = (UIntPtr)0x80000003; 
             static UIntPtr HKEY_CURRENT_CONFIG = (UIntPtr)0x80000005; 
    
             // 关闭64位(文件系统)的操作转向 
              [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
             public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); 
             // 开启64位(文件系统)的操作转向 
              [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
             public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);     
    
             // 获取操作Key值句柄 
              [DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
             public static extern uint RegOpenKeyEx(UIntPtr hKey, string lpSubKey, uint ulOptions, int samDesired, out IntPtr phkResult); 
             //关闭注册表转向(禁用特定项的注册表反射) 
             [DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
             public static extern long RegDisableReflectionKey(IntPtr hKey); 
             //使能注册表转向(开启特定项的注册表反射) 
             [DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
             public static extern long RegEnableReflectionKey(IntPtr hKey); 
             //获取Key值(即:Key值句柄所标志的Key对象的值) 
             [DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
             private static extern int RegQueryValueEx(IntPtr hKey, string lpValueName, int lpReserved, 
                                                       out uint lpType, System.Text.StringBuilder lpData, 
                                                       ref uint lpcbData); 
    
             private static UIntPtr TransferKeyName(string keyName) 
             { 
                 switch (keyName) 
                 { 
                     case "HKEY_CLASSES_ROOT": 
                         return HKEY_CLASSES_ROOT; 
                     case "HKEY_CURRENT_USER": 
                         return HKEY_CURRENT_USER; 
                     case "HKEY_LOCAL_MACHINE": 
                         return HKEY_LOCAL_MACHINE; 
                     case "HKEY_USERS": 
                         return HKEY_USERS; 
                     case "HKEY_CURRENT_CONFIG": 
                         return HKEY_CURRENT_CONFIG; 
                 } 
    
                 return HKEY_CLASSES_ROOT; 
             } 
    
             public static string Get64BitRegistryKey(string parentKeyName, string subKeyName, string keyName) 
             { 
                 int KEY_QUERY_VALUE = (0x0001); 
                 int KEY_WOW64_64KEY = (0x0100); 
                 int KEY_ALL_WOW64 = (KEY_QUERY_VALUE | KEY_WOW64_64KEY); 
    
                 try 
                 { 
                     //将Windows注册表主键名转化成为不带正负号的整形句柄(与平台是32或者64位有关) 
                     UIntPtr hKey = TransferKeyName(parentKeyName); 
    
                     //声明将要获取Key值的句柄 
                     IntPtr pHKey = IntPtr.Zero; 
    
                     //记录读取到的Key值 
                     StringBuilder result = new StringBuilder("".PadLeft(1024)); 
                     uint resultSize = 1024; 
                     uint lpType = 0; 
    
                     //关闭文件系统转向  
                     IntPtr oldWOW64State = new IntPtr(); 
                     if (Wow64DisableWow64FsRedirection(ref oldWOW64State)) 
                     { 
                         //获得操作Key值的句柄 
                         RegOpenKeyEx(hKey, subKeyName, 0, KEY_ALL_WOW64, out pHKey);
    
                         //关闭注册表转向(禁止特定项的注册表反射)
                         RegDisableReflectionKey(pHKey);
    
                         //获取访问的Key值
                         RegQueryValueEx(pHKey, keyName, 0, out lpType, result, ref resultSize);
    
                         //打开注册表转向(开启特定项的注册表反射)
                         RegEnableReflectionKey(pHKey);
                     }
    
                     //打开文件系统转向
                     Wow64RevertWow64FsRedirection(oldWOW64State);
    
                     //返回Key值
                     return result.ToString().Trim();
                 }
                 catch (Exception ex)
                 {
                     return null;
                 }
             }
    
             #endregion
         }
     }
    

      

    Get64BitRegistryKey函数的四个参数分别代表:主键名(如:HKEY_LOCAL_MACHINE等),子键名,Key名,重临的是Key的Value(61个人系统注册表的键值),通过地点的点子就全盘能够兑现用32程序访谈61人系统注册表(即:陆十一人程序所会见的注册表地点)。

    本文由澳门新葡萄京最大平台发布于最大平台,转载请注明出处:32位程序访问64位系统注册表

    关键词:

上一篇:我最爱去的安康赢湖也是吗

下一篇:没有了