今天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
);