【问题标题】:System32 Folder on a 64-bit system64 位系统上的 System32 文件夹
【发布时间】:2009-12-06 10:50:00
【问题描述】:

我有一个在 32 位 Vista 系统上运行的 cmd 文件。

我注意到代码引用了 system32 驱动程序文件夹。

我想知道代码是否可以在 64 位 Windows 7 系统上运行。所以我想我的问题是 64位系统是否包含system32文件夹?

非常感谢任何回复。

【问题讨论】:

标签: 64-bit cmd


【解决方案1】:

64 位 Windows 中的 System32 文件夹实际上包含 64 位文件,在 WOW64 下运行的 32 位程序通常会在 System32 中查找它们可以调用的 32 位 DLL 等 - 但它们会找到 64 位的。因此操作系统会将所有 32 位应用程序对 System32 文件夹的请求重定向到包含 32 位系统文件的 SysWOW64 文件夹。

【讨论】:

  • 所以system 32文件夹包含所有64-bit DLLSSysWOW64 文件夹包含所有32-bit DLLS?怎么回事?为什么32-bit DLLS 不是System3264-bit DLLS 不是System64
  • @B1KMusic “本意是重命名 System32,但有太多应用程序为该路径硬编码,因此删除它是不可行的”stackoverflow.com/a/950011/995714
  • @B1KMusic 没有人知道,为什么我在 64 位 windows 上的 system32 包含 32 位版本的 cmd、sfc、dism 等,即使在我从 mediacreationtool 重新安装 windows 之后?
【解决方案2】:

Windows 有一项称为 WoW 64(Windows-on-Windows 64 位)的技术,它允许 32 位应用程序(甚至是用 C/C++ 等编写的已编译应用程序)在 64 位 Windows 上运行。

除了 System32 文件夹之外,64 位 Windows 安装还有一个 SysWow64 文件夹,其中包含您在 System32 中找到的文件的 32 位版本。

需要明确的是,当从 32 位进程运行时,对 System32 的引用会被重定向(除非进程禁用此重定向,这是可能的)。因此,如果您有一个引用 System32 的 .CMD 文件,它实际上会从 SysWow64 目录中读取。

【讨论】:

  • 非常感谢,我想我明白了。你怎么知道你的应用程序是 32 位的?
  • 这是一个命令外壳脚本(.CMD 文件)吗?这是我从你的帖子中得到的印象。如果是这样,它将在任何地方执行,我不确定您所说的“对 System32 的引用”是什么意思,但我认为它是直接访问那里的文件。如果这是一个已编译的应用程序,并且您安装了 Visual C++,则可以使用 LINK /DUMP /HEADERS .exe,在最顶部的 FILE HEADER VALUES 下,您将看到带有括号中的名称的“机器”。如果是 (i386),那么它是 32 位的。我忘记了 x64 列出的内容,但可能是 (x64) 或 (amd64)。
【解决方案3】:

System32 是包含重要操作系统文件的文件夹的名称。

64 位 Windows XP 的早期版本只能运行 64 位应用程序。这是有道理的:

  • 您在 16 位 Windows 上运行 16 位应用程序
  • 您在 32 位 Windows 上运行 32 位应用程序
  • 您在 64 位 Windows 上运行 64 位应用程序

64 位 Windows XP 的早期版本是 64 位的,并且仅支持运行 64 位应用程序。

而且由于所有文件夹名称保持不变,您可以简单地将应用程序重新编译为 64 位(而不必更改 任何其他内容 - 包括您意外硬编码的路径),并且就可以了。

在 64 位 Windows 上模拟 32 位操作系统

很快就很明显,仅能够在 64 位 Windows 上运行 64 位应用程序会阻止某些人升级到 64 位 Windows。所以an emulation layer was created to allow you to run 32-bit applications on a 64-bit operating system.

它被称为WOW64:WindowsonWindows64

  • 这个仿真层模拟 x86 架构,虚拟化 CPU、文件系统、注册表、环境变量、系统信息函数等等。
  • 如果 32 位程序尝试查看系统,它将看到 32 位系统。
  • 例如,如果程序调用 GetSystemInfo 函数来查看正在运行的处理器,它将被告知它运行在 32 位处理器上,具有 32 位地址空间,在一个 32 位的世界中32 位树中的天空和 32 位鸟。
  • 这就是模拟的重点:通过模拟 32 位执行环境来保持 32 位程序的运行。

问题是这些 32 位应用程序应该在哪里存储它们所有的 32 位文件,并配置它们的 32 位 DLL 的位置,并加载 32 位操作系统支持文件?

我们已经知道 native 应用程序在哪里存储它们的东西。

| Native Application  |
|---------------------|
| C:\Windows\System32 |
| C:\Program Files    |
| HKCU\Software       |

这都是正确和正确的;如果您只是将 32 位应用程序重新编译为 64 位:一切正常。所有这些位置仍然正确。

64 位世界中的 32 位

但是现在,由于我们要向后弯曲以适应非 64 位应用程序,我们必须为它们找到一个存放旧 32 位操作系统文件的地方,并存储它们的 32 位数据,并拥有他们的 32 位程序,以及 32 位共享组件:

| Native Application  | Emulated 32-bit           |
|---------------------|---------------------------|
| C:\Windows\System32 | C:\Windows\SysWOW64       |
| C:\Program Files    | C:\Program Files (x86)    |
| HKCU\Software       | HKCU\Software\Wow6432Node | 

一个问题是:

  • 如果一个 64 位程序请求 C:\Windows\System32,最好获取 64 位文件
  • 如果 32 位程序请求 C:\Windows\System32,那该死的更好获取 32 位文件

这意味着,如果 32 位进程询问其中一些文件位置,Windows 必须透明地将调用重定向到 32 位文件夹和注册表项。

如果一个 32 位程序,认为它在旧的 32 位操作系统上运行,请求 32 位位置,则需要为其提供“真实”位置:

| Native Application  | Emulated 32-bit asks for  | Is actually given         |
|---------------------|---------------------------|---------------------------|
| C:\Windows\System32 | C:\Windows\System32       | C:\Windows\SysWOW64       |
| C:\Program Files    | C:\Program Files          | C:\Program Files (x86)    |
| HKCU\Software       | HKCU\Software             | HKCU\Software\Wow6432Node | 

如果您不希望您的 32 位应用程序受到所有这些模拟和转换的影响,那么解决方案很明显:

  • 为 64 位操作系统创建 64 位应用程序

停止创建 32 位应用程序,然后在仿真层导致您通过仿真时抱怨。您的应用程序是行为不端的怪人;修复它。

【讨论】:

  • 一个超过 8 年的问题的答案!我来关闭标记它,而是带着赞成票离开。这很少见……很好且易于理解的解释。
【解决方案4】:

Windows 7 64 位有一个 System32 文件夹。

但是,您的文件是否仍能运行是一个更复杂的问题。它可能,并且完全取决于它所依赖的;如果它以错误的方式依赖驱动程序,它将失败,因为 32 位驱动程序无法在 64 位系统上运行。

【讨论】:

  • 非常感谢您抽出宝贵时间回复..但是当您说以错误的方式依赖驱动程序时,您是什么意思?
  • 在不了解情况的情况下,我真的不能说!如果您的代码依赖于特定驱动程序的某些技术性,则该驱动程序在 Win64 下可能会有所不同,因此会失败。您可以发布有问题的代码吗?
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 2011-09-08
  • 2014-08-06
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多