今天HOOK D3D9中的SetMaterial发现出现堆栈失衡现象,后来研究发现是因为,对于如下的调用:
HRESULT _stdcall SetMaterial(D3DMATERIAL9 *pMaterial);
D3DMATERIAL9 mtrl;
::ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
g_pD3DDevice->SetMaterial( &mtrl );
逆向分析后是如此:
:00402582 push ecx //pMaterial
.text:00402583 mov edx, g_pD3DDevice
.text:00402589 mov eax, [edx]
.text:0040258B mov ecx, g_pD3DDevice
.text:00402591 push ecx //this
.text:00402592 call dword ptr [eax+0C4h]
如果只是简单的用函数MySetMaterial:
HRESULT _stdcall MySetMaterial( D3DMATERIAL9 *pMaterial);
那么堆栈平衡就遭到破坏,所以,根据上面的逆向结果来看,MySetMaterial函数的原型应该如下:
HRESULT _stdcall MySetMaterial(PDWORD pdwThis, D3DMATERIAL9 *pMaterial
);