【问题标题】:copy of system dll doesn't work系统 dll 的副本不起作用
【发布时间】:2015-11-18 21:34:15
【问题描述】:

我有 Windows 8.1。我从 E:\ 文件夹中的 C:\Windows\System32 复制了 User32.dll。所以首先,我已经提到,如果你只是复制粘贴,原始User32.dll的内容和User32.dll的副本是不一样的!!!我发现它,使用 WinMerge 程序。所以,我在 C 上编写了我的程序,如下所示:

void copy(FILE* input_dll)
{
    FILE* f = fopen("E:\\user32.dll", "wb");
    int size_of_base_input_dll_file;
   // Get the Size of base_file 
    fseek(input_dll, 0, SEEK_END);
    size_of_base_input_dll_file = ftell(input_dll);
    //move on a begin of dll
    fseek(input_dll, 0, SEEK_SET);
    for (int i = 0; i < size_of_base_input_dll_file; ++i)
    {
        char symbol = fgetc(input_dll);
        fputc(symbol, f);
    }
}

int main()
 {
       FILE* user32 = fopen("C:\\Windows\\System32\\user32.dll","rb");
       copy(user32);
 }

现在 WinMerge 显示 C:\Windows\System32\user32.dll 和 E:\user32.dll 的内容相同,但是文件 C:\Windows\System32\user32.dll 比 E:\user32 大.dll 100 KB!!!怎么可能?

当我尝试使用 WinApi LoadLibraryA 函数加载 user32.dll(E:\user32.dll) 的副本时,它返回 NULL,无论是否使用了 user32.dll (E:\user32.dll) 的副本我的功能复制或复制粘贴。

所以我的问题:

  1. 为什么dll的内容一样,而dll的大小却不一样?
  2. 为什么 dll 的内容一样,但是我不能用 LoadLibraryA 加载 E:\user32.dll 并且可以用 LoadLibraryA 加载 C:\Windows\System32\user32.dll ?
  3. 为什么复制粘贴会复制错误?

【问题讨论】:

    标签: c winapi dll


    【解决方案1】:

    您正在 WOW64 模拟器下运行 32 位进程。这意味着您会受到文件系统重定向的影响。系统将system32 重定向到syswow64

    这意味着您没有复制您希望复制的文件。在资源管理器中复制时,您是从 64 位系统文件夹 (system32) 复制,因此复制了 64 位 DLL。当您在 32 位程序中复制时,您是从 32 位系统文件夹 (syswow64) 复制,因此复制了 32 位 DLL。

    当您在资源管理器中复制时,复制的文件因此是 64 位 DLL,因此无法加载到您的进程中。当您在 32 位程序中复制时,复制的文件是 32 位 DLL,因此可以加载到您的进程中。

    您的 WinMerge 是 32 位程序,因此它也被重定向到 32 位系统目录 syswow64

    您可以使用以下方法之一访问 64 位 system32 目录:

    1. 切换到 64 位进程。
    2. 使用 sysnative 别名从 WOW64 内部访问 64 位系统目录。
    3. 禁用文件系统重定向。

    绝对不鼓励最后的选择,因为它可能会产生许多意想不到的后果。

    无论您真正想要做什么,将系统目录复制到其他文件夹肯定不是解决问题的方法。

    更多详情请点击此处:File System Redirector

    【讨论】:

    • @FUZxxl 不是。这是 MS 试图保持大量二进制兼容性的结果。如果他们不这样做,他们会破坏很多程序。
    • @Fuzxxl:你会如何解决这个问题?您确实了解需要解决的问题,对吗?
    • @FUZxxl:为什么提议的system64 目录会成为解决方案?又能解决什么问题?
    • @FUZxxl 也许 MS 想让那些硬编码 system32 的开发人员生活得更轻松,当他们迁移到 64 位时,他们懒得改变它。尽管如此,这并不是一个问题。一旦您了解了设计,它就会变得简单而透明。
    • @FUZxxl:你正在编造一个不是的问题,并提出一个不是的解决方案。您提出的解决方案使移植软件比需要的更加困难。您提出的解决方案同样具有零收益。它是非问题的非解决者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多