如何从32位代码以64位启动Windows进程?

时间:2020-03-06 15:01:36  来源:igfitidea点击:

要在写入HKLM注册表配置单元时在Vista中弹出UAC对话框,我们选择不使用Win32注册表API,因为缺少Vista权限时,我们需要使用管理员权限重新启动整个应用程序。相反,我们这样做:

ShellExecute(hWnd, "runas" /* display UAC prompt on Vista */, windir + "\Reg", "add HKLM\Software\Company\KeyName /v valueName /t REG_MULTI_TZ /d ValueData", NULL, SW_HIDE);

除了我们的应用程序是32位应用程序之外,此解决方案还可以正常工作,并且它像使用WOW兼容层的32位应用程序一样运行REG.EXE命令! :(如果从命令行运行REG.EXE,则可以在64位模式下正确运行。这很重要,因为如果作为32位应用程序运行,则由于注册表反射,注册表项将最终放置在错误的位置。

那么,有什么方法可以从32位应用程序中以编程方式启动64位应用程序,又不能像其父级32位进程(即任务管理器中的" *"后缀)那样使用WOW64子系统来运行它?

解决方案

我们是否考虑过创建一个小的"帮助程序"应用程序来为我们更新注册表?如果将其编译为64位,并包含表明其需要管理员权限的清单,则它将为我们提供这两个基础。

有一些API可以检测正在运行的操作系统的"位",因此可以想象,可以同时编译RegistryUpdate32.exe和RegistryUpdate64.exe并调用相关的API。

运行32位还是64位本机(非托管)程序仅取决于可执行文件。 C. \ Windows \ System32(64位)和C:\ Windows \ SysWOW64(32位)中有reg.exe的两个副本。因为我们没有指定路径,所以我们会获得" PATH"环境变量中最先出现的内容,该环境变量是32位进程的32位版本。

我们实际上应该将此函数分解为一个单独的程序或者COM对象,并用清单标记该程序,或者使用COM标高启动该COM对象。

试试看(从32位进程):

> %WINDIR%\sysnative\reg.exe query ...

(在这里找到)。