如何判断返回的是哪个实际dll(x86 v x64)?

时间:2015-09-30 05:24:44

标签: python windows dll x86 64-bit

让我们关注一个dll:C:\ Windows \ System32 \ wbem \ wmiutils.dll。为什么?因为我个人发现Windows的文件根据流程架构提供了不同的dll。

TLDR;有没有办法以编程方式确定文件系统重定向器返回的dll的实际路径?

据我所知,如果作为x86进程启动,我会得到C:\ Windows \ SysWOW64 \ wbem \ wmiutils.dll。而且,如果作为x64进程启动,我会得到C:\ Windows \ System32 \ wbem \ wmiutils.dll。

我需要确定我真正关注的是哪些wmiutils.dll。重定向器使system32 \ wbem \ wmiutils.dll外观和感觉完全相同,但事实并非如此。如果我使用父路径,我得到C:\ Windows \ System32 \ wbem,即使我可能/可能不看C:\ Windows \ SysWOW64 \ wbem。

任何甜蜜的蟒蛇魔法才能实现这一目标?我似乎无法从其他语言中看到任何可以移植的东西。根据我的用例,我提出了几个黑客,但他们就是这样。希望有人找到一个像父路径一样简单的解决方案,在这种情况下实际工作。

1 个答案:

答案 0 :(得分:0)

import ctypes, hashlib

k32 = ctypes.windll.kernel32
oldValue = ctypes.c_long(0)
k32.Wow64DisableWow64FsRedirection(ctypes.byref(oldValue)) # Should open 32-bit
with open(r"C:\Windows\System32\wbem\wmiutil.dll", "rb") as f:
    checksum32 = hashlib.md5(f.read()).hexdigest() 

k32.Wow64RevertWow64FsRedirection(oldValue) # Should use what Windows thinks you need
with open(r"C:\Windows\System32\wbem\wmiutil.dll", "rb") as f:
    checksum64 = hashlib.md5(f.read()).hexdigest() 

if (checksum32 != checksum64):
    print("You're running 64bit wmiutil dll")

我没有Windows Python来测试它,但它应该根据https://msdn.microsoft.com/en-us/library/windows/desktop/aa365745%28v=vs.85%29.aspx工作。

我认为更简单的方法就是做一些测试,比如创建一个结构,看看它是8个字节还是4个字节。然后,您可以假设Windows使用的是64位版本的DLL(如果它是8个字节)。