必发88官网 4

31位程序访谈62人系统下的叁十二位注册表难题,六13人OS打包注意事项必发88官网

installshield 陆拾肆位OS打包注意事项

WOW64简介

WOW64(Windows 32-bit On Windows
64-bit)是x64平台上运维win32应用程序的模拟器,它在系统层提供了中间层,将win32的连串调用调换到x64实行调用,而且将x64重返的结果转变来win32试样再次来到给win32前后相继。下图描述了win32主次怎样在x64系统上运营的。

必发88官网 1

How a 32-bit process runs on 64-bit Windows

WOW64局限性:

  • 地点空间暗中同意是2G,使用/LAPAJEROGEADDRESSAWARE开关可以到达4G。
  • 34个人过程不能加载陆15位DLL(除了内定的系统DLL)。
  • 不扶助十十一位进程的运作。
  • 无法利用DOS设想机(VDM, Vitrual DOS Machine)。
  • 英特尔安腾连串管理器不协理
    AWE.aspx),
    Vectored
    I/O,
    PAE.aspx)
    以及DirectX硬件加速API。

三十人程序访问63位系统下的33人注册表难点?
自家有三个32为顺序,有一个成效正是开垦注册表HKEY_LOCAL_MACHINE分支往里面写入数据,一般景况下均符合规律。可是在一些的Win7
六十十个人系统下,张开注册表会战败,选择的是CRegKey的Open方法,reg.Open(HKEY_LOCAL_MACHINE,
T(“SOFTWARE\Microsoft\Windows\CurrentVersion\Run”))。但是假使展开63人注册表则成功,reg.Open(HKEY_LOCAL_MACHINE,
T(“SOFTWARE\Microsoft\Windows\CurrentVersion\Run”),
KEY
____ALL_ACCESS |
KEY_WOW64_64KEY)。求教此主题材料是怎么回事,并不是持有Win7
六十四人系统都至极,只是分其他会产出不能够开垦叁12位注册表

 

注册表机制

确定,注册表是windows系统的数据库,系统本身以及安装的主次都依赖注册表。当Windows进化到陆拾几人,还要合营大批量的31个人应用程序,便蒙受了注册表争论的题材。

注册表树最大能够有512级深度,通过挂号表API贰次能够创立32级深的键值。

为了消除六拾贰人系统的包容性难题,Windows使用了三套方案,分享(Shared)、注册表重定向(Registry
Redirector.aspx))和注册表反射(Registry
Reflection.aspx))。

1、安装目录

1. 共享

封存能够被三十四个人和陆10个人合伙选取的注册表。

 

2. 注册表反射

注册表反射是在64个人注册表视图和三拾位注册表视图之间复制有个别特定的登记表项和项值。简单来说便是备份和协同,把同一份注册表保存到五个概略地方,分别被三十三个人或64人程序选拔。保存产生在RegCloseKey调用停止。
使用RegDisableReflectionKey.aspx)和RegEnableReflectionKey.aspx)方法能够禁止使用/启用反射机制。
该方案只用于Windows Server 二〇一〇, Windows Vista, Windows Server 2002 和
Windows XP,从 Windows 7 和 Windows Server 二零一零 大切诺基2
初叶被移除。

比喻:在X64系统中设置陆16位Microsoft
Office后,63人的winword.exe将注册.doc那几个扩张名并把那个扩张名涉嫌到winword.exe程序,依据X64的运营机制,陆十二位程序修改的是六15个人的挂号表键值,但是WOW64会自动的把那个修改会同步到三16人的注册表键上面,那样34位和61位的应用程序都足以采用陆十几位winword.exe展开.doc文件。

不过,实际不是富有的键值都会面对注册表反射机制的熏陶。实验证实,要是我们选择34位的注册表编辑器在HKEY_LOCAL_MACHINE/Software下新建三个项,然后使用63人的注册表编辑器查看,会开采那一个项只会出现在HKEY_LOCAL_MACHINE/Software/Wow6432Node键下而不会并发在HKEY_LOCAL_MACHINE/Software键下,因为HKEY_LOCAL_MACHINE/Software键是特意用于存放六19个人程序所选拔的注册表数据的,而HKEY_LOCAL_MACHINE/Software/Wow6432Node键是非常用于寄存三十四位程序所运用的注册表数据的。

注册表中相当受反射机制影响的有:

HKEY_LOCAL_MACHINE/Software/Classes
HKEY_LOCAL_MACHINE/Software/COM3
HKEY_LOCAL_MACHINE/Software/EventSystem
HKEY_LOCAL_MACHINE/Software/Ole
HKEY_LOCAL_MACHINE/Software/Rpc
HKEY_USERS/*/Software/Classes
HKEY_USERS/*_Classes

六16人系统下,安装目录分Program Files和Program Files(x86)。 

3. 登记表重定向

登记表重定向为32人和六16位程序分别提供不相同的注册表物理存款和储蓄地点,但会映射成同八个逻辑视图,那一个进程对程序本人是透明的。也便是说,四个三十五个人程序能够像在三拾人系统中一样来行使注册表,就算它们在陆十二位系统上被积攒在不一样的情理地点。

三11人程序重定向的注册表存放在Wow6432Node下,举例,
HKEY_LOCAL_MACHINE\Software 会被重定向到
HKEY_LOCAL_MACHINE\Software\Wow6432Node。

内需重定向的挂号表项如下所示:

// 64位程序的注册信息存储键
HKLM/Software
HKEY_CLASSES_ROOT 
HKEY_CURRENT_USER/Software/Classes 
HKEY_LOCAL_MACHINE/Software 
HKEY_USERS/*/Software/Classes 
HKEY_USERS/*_Classes
//32位程序的注册信息重定向存储键
HKLM/Software/WOW6432node 
HKEY_CLASSES_ROOT/WOW6432node 
HKEY_CURRENT_USER/Software/Classes/WOW6432node 
HKEY_LOCAL_MACHINE/Software/WOW6432node 
HKEY_USERS/*/Software/Classes/WOW6432node 
HKEY_USERS/*_Classes/WOW6432node

64bit Application会自动安装在Program Files下; 

注册表重定向机制对系统的熏陶

  1. 下列程序调用没有毛病:
  • 30人应用程序A调用三十五人应用程序B并访谈B的注册表消息。由于挂号表重定向机制,叁九人应用程序B的登记音讯在HKLM/Software/Wow6432Node中,而叁十四位应用程序A访问注册表也会被重定向到HKLM/Software/Wow6432Node中,所以访谈平常。

  • 六10个人应用程序A调用64位应用程序B并访谈B的注册表新闻。六十四个人应用程序B的挂号音信在HKLM/Software,六17个人应用程序A采访注册表时间接访谈HKLM/Software,所以访谈符合规律。

  1. 在下列情状时会出现问题:
  • 64个人应用程序调用30个人应用程序并拜会其注册表音信。因为三十二位应用程序的登记音讯在HKLM/Software/Wow6432Node中,而陆拾肆位应用程序访问注册表时直接限制HKLM/Software,所以访问拾贰分。

    应用方案:在写注册表时,叁拾个人应用程序要将该注册消息写到六十个人程序的注册表项中,即HKLM/Software下。

  • 34个人应用程序调用陆拾一个人应用程序并寻访其注册表新闻。同上。

32bit Application会自动安装在Program Files(x86)下。 

应用程序怎样访问注册表

下面对叁十一位与63位应用程序分别拜候注册表进行简短总计:

  1. 六拾伍人程序怎么样访问陆拾四位的注册表(HKLM/Software)
  • 61人程序访谈六10位的注册表,直接到 HKLM/Software。
  1. 三贰十二位程序如何访问叁十几人的注册表(HKLM/Software/Wow6432Node)
  • 33位程序访谈三十三人的注册表,WOW64将会截取对HKLM/Software访谈,仁同一视定向到HKLM/Software/Wow6432Node。
  1. 三十三人程序怎么样访谈陆11人的注册表(HKLM/Software)
  • 在调用函数RegCreateKeyEx.aspx)创建注册表项时,对第三个参数REGSAM
    samDesired设置中增加参数KEY_WOW64_64KEY,那样能够实现对六12位注册表的拜候;
  • 在调用函数RegOpenKeyEx.aspx)展开注册表项时,对第五个参数REGSAM
    samDesired设置中加多参数KEY_WOW64_64KEY,那样能够达成对六12个人注册表的探问;
  1. 60个人程序怎样访问三拾贰个人的注册表(HKLM/Software/Wow6432Node)
  • 在调用函数RegCreateKeyEx.aspx)创制注册表项时,对第七个参数REGSAM
    samDesired设置中加上参数KEY_WOW64_32KEY,那样能够兑现对三贰12位注册表的拜访;
  • 在调用函数RegOpenKeyEx.aspx)张开注册表项时,对第八个参数REGSAM
    samDesired设置中加上参数KEY_WOW64_32KEY,这样可以兑现对33位注册表的拜见;

 

文件系统重定向

与注册表类似,系统为了缓和文件争论的难题,引进了文件系统重定向的机制,文件系统重定向使32人程序和60位程序的文件与数码分开寄放,%systemroot%/system32
目录被保留给69个人文件使用,而叁十一个人文件会被重定向到%systemroot%/SysWOW64目录。任何三拾肆位程序试图访谈%systemroot%/system32
目录都会被重定向到%systemroot%/SysWOW64目录。那是系统暗许行为,除非程序的线程分明的指明须求关闭文件系统重定向机制。

2、系统目录 

文件系统重定向开关

针对%windir%\system32,假若大家用32个人程序去访谈%windir%\system32,不管大家用硬编码依旧其他的办法,系统都会自动地给大家转向到%windir%\syswow64目录。这种转化对于每一种31人应用程序暗许都以开发的,可是这种转化并不总是需求的。因而,系统提供了有关的API来决定文件重定向的张开与关闭。常用的函数有3个,如下所示

  • 关闭系统重定向:
    Wow64DisableWow64FsRedirection.aspx)
  • 开垦系统重定向:
    Wow64RevertWow64FsRedirection.aspx)
  • 开拓系统重定向:
    Wow64EnableWow64FsRedirection.aspx)

在意:Wow64EnableWow64FsRedirection在嵌套使用的时候离谱,所以普通用地方的
Wow64RevertWow64FsRedirection来开发文件系统转向功用。

 

文件与变量的援引

应用程序必得确定保障对文本名与变量(包含系统变量,情形变量,系统特别路线.aspx)等)的引用适用于当下的操作系统,不然会孳生如下难点:

  1. 稍稍变量只适用于64个人操作系统,例如:%ProgramW6432%和FOLDE奥迪Q5ID_ProgramFilesX64。
  2. 某些变量只适用于叁拾三人操作系统,举个例子:%windir%\Sysnative。
  3. 稍微变量在不相同位数的操作系统下数值区别,举例:%ProgramFiles%和FOLDE陆风X8ID_ProgramFiles。

留意:大家在运用上述变量时必须先判别当前系统的位数音信以担保援用正确。

同理,注册表新闻中带有遭受变量时也相会世类似问题。举个例子REG_EXPAND_SZ指向蕴含遭受变量的注册表新闻,系统会活动深入分析键值中隐含的%xxx%景况变量。而REG_SZ键值中的%xxx%不会被电动分析。可是足以经过ExpandEnvironmentStrings.aspx)等种类API进行增添。当程序调用RegGetValue.aspx)获取注册表键值的时候,系统会遵照近些日子操作系统的位数信息对情况变量举办扩大,然而应用程序也得以覆盖这种增加情势。
进而,在六13人操作系统中大家要防止使用30位和63个人系统不通用的变量,譬如:

  1. %ProgramFiles%, FOLDERID_ProgramFiles(CSIDL_PROGRAM_FILES),
    FOLDERID_ProgramFilesCommon(CSIDL_PROGRAM_FILES_COMMON)
  2. FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommonX64

下面对上述的文本与变量的引用以及文件目录重定向进行简易总计。

必发88官网 2

Summary of Rules for Referencing Files and Variables

必发88官网 3

Summary of Defaults for Variables and Paths

陆十五个人系统下,系统目录分system32和syswow64。 

应用程序安装与开发银行

63位操作系统上的应用程序分为两种:

  1. 叁11位应用程序
    设置目录:C:\Program Files (x86)

  2. 陆十五人应用程序
    安装目录:C:\Program Files

  3. 重新版本应用程序(Dual-bitness application)
    安装目录:参照他事他说加以考察上述目录
    这种艺术必得确认保证叁15位版本与60位版本包容。

必发88官网 4

Behavior of Applications and Interpreted Files at Process Startup

增补表明:

  • 针对文件重定向,唯有叁十一个人程序访问陆拾一个人目录时才会被重定向,举例叁12位程序访问63个人目录C:\Windows\system32;而60位程序则能够直接待上访谈34人目录,空头支票重定向,比方61人程序能够从来访问C:\Windows\syswow64
  • 文件系统重定向只是存在system32和systemWOW64的重定向,而荒诞不经program
    files和ProgramFiles(x86)的重定向一说,直接硬编码相对路线就能够。

64bit AP 运行在system32下; 

赢得系统新闻代码片段

// 判断应用程序是否运行在X64系统下
BOOL IsX64System()  
{  
    BOOL bIsWow64 = FALSE;  
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);  
    LPFN_ISWOW64PROCESS pfnIsWow64 = NULL;  
    // 32位系统的kernel32没有IsWow64Process导出函数,直接使用会有问题
    pfnIsWow64 = (LPFN_ISWOW64PROCESS)GetProcAddress(
        GetModuleHandle(_T("kernel32.dll")), "IsWow64Process");  
    if (pfnIsWow64)  
    {  
        if (!pfnIsWow64(GetCurrentProcess(), &bIsWow64))  
        {  
            // handle error  
        }  
    }  

    return bIsWow64;  
} 

// 获取系统信息
BOOL GetSystemInfoEx(SYSTEM_INFO *pSystemInfo)  
{  
    BOOL bRet = FALSE;  
    if (!pSystemInfo) 
    {
        goto Exit0;  
    }

    typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);  
    PGNSI pfnGNSI = NULL;
    ZeroMemory(pSystemInfo, sizeof(SYSTEM_INFO));  
    if (IsX64System())  
    {  
        // x64下要调用这个API  
        pfnGNSI = (PGNSI)GetProcAddress(  
            GetModuleHandle(_T("kernel32.dll")), "GetNativeSystemInfo");  
        if (!pfnGNSI)
        {       
            goto Exit0;  
        }
        pfnGNSI(pSystemInfo);  
    }  
    else  
    {  
        // 32位系统调用下面的API  
        GetSystemInfo(pSystemInfo);  
    }  

    bRet = TRUE;  
Exit0:  
    return bRet;  
}  

32bit AP 运行在syswow64下。 

Bibliography

  1. Windows Hardware Dev Center
    Archive
  2. Windows Driver Kit
    (WDK).aspx)
  3. Registry
    Redirector.aspx)
  4. Removal of Windows Registry
    Reflection.aspx)
  5. File System
    Redirector.aspx)
  6. WOW64 Implementation
    Details.aspx)
  7. KNOWNFOLDERID.aspx)
  8. 挂号表重定向

 

Installshield打包注意事项: 

主题材料:当叁11个人的AP调用WINSYSDIRAV4变量时,会暗许指向syswow64,即便是调用WINDIENVISION^”system32″,也会被逼迫指向syswow64。 

 

解决:Disable(WOW64FSREDIRECTION) 

WOW64FSREDIRECTION:起着判断陆14位系统下调用哪些系统变量的功效,Disable掉后,就能暗许指向system32。 

细心:当安装举办完后,记得Enable(WOW64FSREDIRECTION),以制止影响系统的别样程序。 

 

经验: 

在Installing()事件中Disable(WOW64FSREDIRECTION); 

在Installed()事件中Enable(WOW64FSREDIRECTION); 

这样一切安装进度就不用去思考何时开关了。 

 

没有差距于,卸载的历程中也得在UnInstalling()和UnInstalled()中如此做,才会卸载掉对应的一对。 

 

3、注册表 

 

陆拾肆个人系统下,注册表分HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 

 
和HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 

让32bit AP挂号在默许的注册表

 

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run中,命令:REGDB_OPTIONS
= REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY; 

与此同一时候,用完也记得REGDB_OPTIONS = REGDB_OPTIONS &
~REGDB_OPTION_WOW64_64KEY; 

————————– 

要求注意的是把与31位有关的目录,方法,都用六11人的取代。那样就能够保险科学的安装到六十六位的目录上面。 

 

1.REGDB_OPTIONS 让注册表函数在62个人win系统上精确读写而非读写 6432node 

 

REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY;  

REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY; 

 

  1. 读书 installshield 关于系统目录的 64的东西 

 

  1. 设置 compoment 为64 位 

 

  1. 。。。

陆11人OS打包注意事项 1、安装目录
61人系统下,安装目录分Program Files和Program Files(x86)。 64bit
Application会自动安装在Program Files下;…