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