我有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在100 KB上大于E:\ user32.dll!!! 怎么可能呢?
当我试图用WinApi LoadLibraryA函数加载user32.dll(E:\ user32.dll)的副本时,无论是用我的函数copy还是copy paste获得user32.dll(E:\ user32.dll)的副本,它都会返回NULL。
所以我的问题是:
为什么dll的内容相同,但dll的大小不同?
为什么dll的内容相同,但我不能用LoadLibraryA加载E:\ user32.dll,也可以用LoadLibraryA加载C:\ Windows\System32\user32.dll?
为什么复制粘贴会产生错误的复制?

最佳答案

您正在WOW64仿真器下运行32位进程这意味着您要接受文件系统重定向。系统将system32重定向到syswow64
这意味着您没有复制要复制的文件。在资源管理器中复制时,是从64位系统文件夹(system32)复制,因此复制64位DLL在32位程序中复制时,是从32位系统文件夹(syswow64)复制,因此复制32位DLL。
在资源管理器中复制时,复制的文件是64位DLL,因此无法加载到进程中。在32位程序中复制时,复制的文件是32位DLL,因此可以加载到进程中。
WinMerge是一个32位程序,因此它也被重定向到32位系统目录syswow64
可以使用以下方法之一访问64位system32目录:
切换到64位进程。
使用sysnative别名从WOW64内部访问64位系统目录。
禁用文件系统重定向。
最后一个选择是绝对不鼓励,因为它可能会产生许多意想不到的后果。
不管您真正想做什么,将系统目录复制到其他文件夹肯定不是解决问题的方法。
更多详情请点击:File System Redirector

关于c - 系统dll的副本不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32199617/

10-11 23:19
查看更多