设为首页 收藏本站
查看: 1317|回复: 0

[经验分享] win7重定向函数引发的问题

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-4-18 11:47:02 | 显示全部楼层 |阅读模式
在Win7 64位系统下,调用CopyFile函数进行函数拷贝,如果希望拷贝文件到System32目录下,需要考虑程序是不是也是64位的,否则,程序会被重定向到Syswow64目录下,为了防止出现文件被重定向,就需要调用函数Wow64DisableWow64FsRedirection取消文件的重定向,并在完成指定功能后调用Wow64RevertWow64FsRedirection函数进行恢复。
MSDN中关于函数Wow64DisableWow64FsRedirection的声明:
BOOL WINAPI Wow64DisableWow64FsRedirection(
  __out  PVOID *OldValue
);
http://msdn.microsoft.com/en-us/library/aa365743(v=vs.85).aspx
MSDN中关于函数Wow64RevertWow64FsRedirection的声明:
BOOL WINAPI Wow64RevertWow64FsRedirection(
  __in  PVOID OldValue
);
http://msdn.microsoft.com/en-us/library/aa365745(v=vs.85).aspx
关于函数的使用,摘一段msdn中的代码:
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0501
#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION 0x05010000
#include <Windows.h>
void main()
{
    HANDLE hFile = INVALID_HANDLE_VALUE;
    PVOID OldValue = NULL;
    //  Disable redirection immediately prior to the native API
    //  function call.
    if( Wow64DisableWow64FsRedirection(&OldValue) )
    {
        //  Any function calls in this block of code should be as concise
        //  and as simple as possible to avoid unintended results.
        hFile = CreateFile(TEXT("C://Windows//System32//Notepad.exe"),
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
        //  Immediately re-enable redirection. Note that any resources
        //  associated with OldValue are cleaned up by this call.
        if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) )
        {
            //  Failure to re-enable redirection should be considered
            //  a criticial failure and execution aborted.
            return;
        }
    }
    //  The handle, if valid, now can be used as usual, and without
    //  leaving redirection disabled.
    if( INVALID_HANDLE_VALUE != hFile )  
    {
        // Use the file handle
    }
}
这段代码在win764位下调用没有问题,在xp 32位下面就会出现问题,即使加上判断系统是否为64位的代码也会导致程序出现如下图的错误:
解决方案是使用动态加载的方式对Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection进行加载,这样问题就解决了
PVOID OldValue = NULL;
HINSTANCE  hlibrary;
typedef    int        (__stdcall  *  Wow64DisableWow64FsRedirection)(LPVOID);
Wow64DisableWow64FsRedirection  f_Wow64DisableWow64FsRedirection  =  NULL;
typedef    int        (__stdcall  *  Wow64RevertWow64FsRedirection)(LPVOID);
Wow64RevertWow64FsRedirection  f_Wow64RevertWow64FsRedirection  =  NULL;
hlibrary  =  LoadLibrary(L"Kernel32.dll");
   f_Wow64DisableWow64FsRedirection  =  (Wow64DisableWow64FsRedirection)  GetProcAddress(hlibrary,"Wow64DisableWow64FsRedirection");
   if(!f_Wow64DisableWow64FsRedirection) {
    return 0;
   }
   f_Wow64RevertWow64FsRedirection  =  (Wow64RevertWow64FsRedirection)  GetProcAddress(hlibrary,"Wow64RevertWow64FsRedirection");
   if(!f_Wow64RevertWow64FsRedirection) {
    return 0;
   }
   f_Wow64DisableWow64FsRedirection  (&OldValue);
   if(CopyFile(wNativePath,wSystemPath,FALSE)==0)
   {
    if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) )
    {
     return 0;
    }
    return 0;
   }
   f_Wow64RevertWow64FsRedirection  (OldValue);
   FreeLibrary(hlibrary);
在使用这段代码前最好判断一下系统类型及位数!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-17729-1-1.html 上篇帖子: 重新安装WINDOWS INSTALLER服务 下篇帖子: 是这样 的,我机子突然间不能显示韩文,于是更新显示语言,下载并安装后依然无法显示 定向
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表