Thunk for MS Window

    先讲一个Windows窗口的问题。众所周知,Windows窗口API要求注册窗口,RegisterClass和CreateWindow函数注册和建立窗口,要在注册的时候填充WNDCLASSEX结构,写入自己实现的窗口消息处理函数,这个处理函数的原型:LRESULT CALLBACK WindowProc( HWND , UINT , WPARAM , LPARAM ); 这里存在一个小问题:如何将程序对象与系统对象(HWND类型)联系起来。(一个窗口要保存一些属于它自己的状态,要通过这个窗口句柄得到此状态的对象。)
    
    MFC用全局字典,即有一个全局变量,记录了HWND到MFC窗口对象的一对一关系(当然,这里存在一个大问题,再次进行MFC窗口子类化,将会导致全局字典的错误。)
    
    还有一个方法,就是将一个动态生成的函数指派给窗口超类,让系统回调这个动态生成的函数,而这个函数会将系统传过来的窗口句柄换成我们想要的任何指针。就是说,我们只要实现原型是这样的函数:LRESULT CALLBACK WindowProc2( struct SomeStruct * , UINT , WPARAM , LPARAM ); 就可以了,这样我们就得到了此窗口句柄对应的状态数据,而无需在全局设立字典。
    
    于是,定义一个Thunk结构,用于存储动态生成的函数的内容。
    struct cww_thunk
    {
        char  bytes[16];
    };
    
    下面的函数填充这个结构,参数object就是指定的数据指针,proc是要实现的WindowProc2。_THUNK_PROTECTED是预定义宏,在Win7等Windows系统下,数据段的页属性已经没有了可执行位,需要修改页属性。
    void  __cww_thunk( struct cww_thunk *thk, u_long object, u_long proc )
    {
        /* mov dword ptr [esp+0x4], object  */
        thk->bytes[0] = 0xC7;
        thk->bytes[1] = 0x44;
        thk->bytes[2] = 0x24;
        thk->bytes[3] = 0x04;
        memcpy(thk->bytes + 4, &object, 4);
        
        /* reli jmp   proc */
        thk->bytes[8] = 0xE9;
        proc -= (u_long)thk + 13;
        memcpy(thk->bytes + 9, &proc, 4);
        memset(thk->bytes + 13, 0, sizeof(struct cww_thunk) - 13);

    #if _THUNK_PROTECTED
        {
            u_long old;
            VirtualProtectEx(GetCurrentProcess(), thk, sizeof(struct cww_thunk), PAGE_EXECUTE_READWRITE, &old);
        }
    #endif
    }
    
    这个函数生成两条指令,指令1:用指定的数据指针的数值填充进第1个参数的地址(覆盖HWND参数),指令2:跳转到指定的过程上。
    
    下一篇讲通用Thunk的方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值