标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2024-2443] 作者: 闲云野鸡 发表于: [2019-08-10]
本文共 [740] 位读者顶过
1.几个处理器的编译宏 _M_IX86 : 32bit处理器
_M_AMD64 : 64bit AMD处理器 (VC2008以前)
_M_X64 : 64bit AMD and Intel处理器(VC2008及以后),
_M_IX64 : 64bit Itanium处理器
在同一代码中,需要区分64位和32位代码时,可以直接用宏即可,如下示例 #if defined(_M_IX86) //32位代码 #elif defined(_M_X64) //64位代码 #endif
[出自:jiwo.org]
2.vs中64位内联汇编的使用 因为64位VC不再支持__asm{},所以只能用单独新建asm汇编文件,并编译成*.obj文件,再用VC链接该obj文件 步骤:
3. __thiscall的拦截方法 _thiscall 应用于“C++”成员函数,_cdecl、_stdcall都是从右至左的顺序压参数入栈,而_thiscall同样是从右至左的顺序压参数入栈,但会把this指针存放于ecx寄存器中,所以在拦截_thiscall时,可以按照_stdcall的拦截方法进行拦截,但是要平衡ecx寄存器,即在拦截的函数刚开始时,保存ecx数据,在最后执行原函数前,把保存的ecx函数再存入ecx中,如下示例 static int WINAPI 拦截函数() { int nEcx =0; __asm { move nEcx,ecx } //要处理的代码 __asm { move ecx, nEcx } return 原函数(); } 如果是64位程序,则需要将内联代码换成asm文件,asm如下代码。 .code GetEcx PROC mov eax, ecx RET GetEcx endp
SetEcx PROC v1:DWORD mov ecx, v1 RET SetEcx endp end
|