为了在windows 64位系统上运行32位用户态程序,Windows操作系统有一个Wow64子系统来转换处理32位程序的调用请求。
当32位程序调用api接口时,32位接口会去调用64位的ntdll,如果存在指针,那么会把指针转化为8字节,从内核返回后,又会将64位指针转化为32位的。
还有 文件系统重定向以及注册表重定向需要注意。
在64位系统上,如果32位程序访问系统盘下 Windows\System32路径,那么会默认转换到Windows\SysWOW64路径下,也就是说要在Windows\System32目录下存放文件时,会默认存储到Windows\SysWOW64路径下,System32路径下是64位的系统dll,SysWOW64路径下是32位的系统dll。
要想关闭文件系统重定向可以使用如下API接口
BOOL WINAPI Wow64DisableWow64FsRedirection(_Out_ PVOID * OldValue);
传入一个指针,用于保存原来的值,方便之后恢复,调用上面函数后就关闭了文件系统重定向。
现在就可以在真实的system32位目录下存取文件了,执行完自己的操作后需要恢复文件系统重定向,使用如下API
BOOL WINAPI Wow64RevertWow64FsRedirection(_In_ PVOID OlValue);
传入调用Wow64DisableWow64FsRedirection返回的数据,就可以恢复了,注意这两个API需要配套使用。
注册表重定向指的是32位程序访问HKEY_LOCAL_MACHINE\SOFTWARE时会自动重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node下。
如果需要指定访问32位的注册表还是64位的注册表,那么需要在调用RegCreateKeyEx时指定标志位,如下:
KEY_WOW64_64KEY 如果32位程序想打开64位注册表,可以使用此标志。
KEY_WOW64_32KEY 如果64位程序想打开32位注册表,可以使用此标志。
标签:调用,重定向,Windows,32,知识,64,Wow64,注册表 From: https://www.cnblogs.com/ps12345678/p/16795880.html