2011年5月21日

hook com vtable entry

com interface 包括 d3d interface 都采用了 __stdcall 调用协议来声明成员函数,这样的声明使得编译出的汇编代码的传参中多出一个push,

所有参数push stack后,还会将对象对地址也push stack;

这样做的目的,使得可以用__stdcall 的 c函数来替换vtable中的函数,要求第一个参数是对象指针;其他参数和对应成员函数的参数相同;

因为com设计之初,就支持CINTERFACE.

 

#include "objbase.h"
__declspec(novtable) 
interface AA:public IUnknown
{
public:
    
virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
            
/* [in] */ REFIID riid,
            
/* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) 
    {
        
return S_OK;
    }

    
virtual ULONG STDMETHODCALLTYPE AddRef( void)
    {
        
return 0;
    }

    
virtual ULONG STDMETHODCALLTYPE Release( void)
    {
        
return 0;
    }
   
//成员函数采用__stdcall 
    virtual void __stdcall v1(void* p)
    {
    }
    
virtual void __stdcall v2(void* p)
    {
    }
    
virtual void __stdcall v3(void* p)
    {
    }
};
//c函数声明比AA::v1要多出一个AA* pthis参数
void __stdcall fpv1( AA* pthis,void* p )
{
    pthis
->v2(p);
}

int _tmain(int argc, _TCHAR* argv[])
{
    AA aa1,aa2;

    unsigned 
int p1 = *(unsigned int*)&aa1;
    unsigned 
int p2 = *(unsigned int*)&aa2;
    unsigned 
int* v = (unsigned int*)p1;
    DWORD dwProtected 
= 0;

    VirtualProtect(v,
256,PAGE_EXECUTE_READWRITE,&dwProtected );//去掉可执行代码的写保护
    v[3= (unsigned int)&fpv1;//替换v1所在的vtable条目
    AA* pp1 = &aa1;
    pp1
->v1( NULL );//将会跳转到fpv1,查看汇编代码回看到push 0 之后还会有一个push pp1

    
return 0;
}


posted @ 2011-05-21 09:49 cgwolver 阅读(156) 评论(0) 编辑

2010年12月5日

鼠标拖动客户区移动的方法和问题

最简单的方法是在WM_NCHITTEST消息处理中返回HTCAPTION,当鼠标按下并拖动客户区,就会移动窗口;

然而这个时候会导致客户区消息WM_LBUTTONDOWN不再响应:因为这个时候已经视为无客户区了;

我的简单GUI实现中HOOK了低级鼠标输入,所以可以自己处理WM_LBUTTONDOWN,不过仍然有问题,一旦发生断点后,WH_MOUSE_LL就失效了

posted @ 2010-12-05 00:19 cgwolver 阅读(91) 评论(0) 编辑

2010年11月24日

svn c++ api

http://sourceforge.net/projects/win32svn/files/

 

dev sdk:

svn-win32-1.6.13_dev.zip

 

win32 binary

svn-win32-1.6.13.zip

 

opensource project:

rapidsvn

http://rapidsvn.org/

 

构建rapid svn所需依赖:

wxWidgets

Berkeley DB 4.4

libintl

svn-win32-dev

 

 

posted @ 2010-11-24 13:35 cgwolver 阅读(149) 评论(0) 编辑

2010年11月20日

visual studio 自定义 c++ 源文件扩展名类型

1. Tools\Option\Projets And Solutions\VC++ Project Settings\C/C++ File Extensions: and new extension for c++ compile

2. Tools\Option\Text Editor\File Extension:  and new extension for sytax highlight

posted @ 2010-11-20 22:09 cgwolver 阅读(99) 评论(0) 编辑

2010年11月13日

C++ final class

 

 1 template <typename _Ty>
 2 class FinalTemplate
 3 {
 4 private:
 5   FinalTemplate()
 6   {
 7   }
 8   ~FinalTemplate()
 9   {
10   }
11   friend _Ty;
12 };
13 class FinalClass: virtual public FinalTemplate<FinalClass>
14 {
15 public:
16   FinalClass()
17   {
18   }
19   ~FinalClass()
20   {
21   }
22 };
23 /* error: Final class not deriveable*/
24 
25 class DerivedClass:public FinalClass
26 {
27 public:
28   DerivedClass()
29   {
30   }
31   ~DerivedClass()
32   {
33   }
34 };

 

 当 DerivedClass 不定义默认构造函数时,虽然能够编译通过,但是无法实例化

 

 

posted @ 2010-11-13 16:36 cgwolver 阅读(199) 评论(0) 编辑

2010年10月5日

SHBrowseForFolder 用法

摘要: [代码]阅读全文

posted @ 2010-10-05 12:03 cgwolver 阅读(195) 评论(0) 编辑

2010年8月13日

3DSMAX convert OGRE(D3D)

摘要: 1. 坐标转换:坐标变换比较简单,按照轴的对应关系转换就可以了,按照多数插件的做法是yz互换,但是会发现场景是左右颠倒的,因为3dsmax是右手坐标系(Z向上,Y向内),而D3D是左手坐标系(Y向上,Z向内),所以x应该取负。void MaxVtx2DX( Point3& p,Vec3& v ){v.x = -p.x;v.y = p.z;v.z = p.y;}2.旋转转换通常动画场...阅读全文

posted @ 2010-08-13 09:45 cgwolver 阅读(492) 评论(0) 编辑

2010年4月11日

BSP场景管理方法简介

摘要: BSP(Binary Space Partition,二叉空间分割)方法,在大型3d游戏场景管理方面,可以认为是已经证明了的,最成熟的,最经得起考验的场景管理方法。诸如虚幻系列引擎(Unreal 1,2,3),ID系列以及衍生产品(Quake,DOOM,Half-Life2),都采用了BSP方法来管理场景,尽管他们各自在实现上略有不同,但是基本原理都是相同的,下面将以Quake3的实现为例,简要介...阅读全文

posted @ 2010-04-11 10:59 cgwolver 阅读(569) 评论(0) 编辑

2010年1月19日

[转]3dmax导出插件-tiamo

摘要: 3dmax导出插件-tiamo 转自:http://www.gpgame.net/docs/program/3dmaxexporter.htm 新年第一贴,说说3dmax的导出插件 3dmax的导出插件是用来把做好的3d模型导出成自己引擎需要的格式的一个dll,它由3dmax加载调用.具体怎样去写一个插件,小T不多说,在3dmax的sdk里面有比较详细的介绍,在google上面也能搜索到不少的源代...阅读全文

posted @ 2010-01-19 10:54 cgwolver 阅读(817) 评论(0) 编辑

2010年1月15日

about wingdip.h

摘要: inc\wingdi.x inc\wingdip.x: inc\wingdi.w hsplit -e -o inc\wingdi.x inc\wingdip.x inc\wingdi.winc\wingdip.h: inc\wingdip.x wcshdr < inc\wingdip.x > inc\wingdip.h$(SDKINC)\wingdi.h: inc\wingdi.x w...阅读全文

posted @ 2010-01-15 14:45 cgwolver 阅读(130) 评论(0) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:cgwolver
园龄:3年6个月
粉丝:5
关注:1

搜索

 
 

常用链接

我的标签

随笔档案

相册

好友链接

最新评论

阅读排行榜

评论排行榜

推荐排行榜