我有一个
LPDIRECTDRAWSURFACE7 g_lpDDSBack
和g_lpDDSBack->BltFast
被调用,但这是它在HexRays中的反编译方式:(*(int (__stdcall **)(struct IDirectDrawSurface7Vtbl *, int, int, LPDIRECTDRAWSURFACE7, RECT *, MACRO_DDBLTFAST))((int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))g_lpDDSBack->QueryInterface + 7))(
g_lpDDSBack,
x,
y,
pgf2->lpDDSrcSurface,
&pgf2->rect,
DDBLTFAST_SRCCOLORKEY);
作为参考,这里是接口:但是HexRays为什么不直接调用
g_lpDDSBack->QueryInterface + 7
?#1 楼
HexRays之所以没有调用它,是因为在通常情况下它不知道g_lpDDSBack->QueryInterface
的值是什么。 通常来说,您可以将结构定义为
QueryInterface
类型,其中该结构的成员根据相关的函数名称进行命名,然后您将看到调用为g_lpDDSBack->QueryInterface->BltFast
。#2 楼
原来这是IDA pro中的错误。我似乎无法编辑我的原始问题,所以首先,我想指出我在原始问题中犯的一个错误。当
g_lpDDSBack
定义为struct IDirectDrawSurface7Vtbl *g_lpDDSBack;
时,这就是输出HexRays显示:(*(int (__stdcall **)(struct IDirectDrawSurface7Vtbl *, int, int, LPDIRECTDRAWSURFACE7, RECT *, MACRO_DDBLTFAST))((int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))g_lpDDSBack->QueryInterface + 7))(
g_lpDDSBack,
x,
y,
pgf2->lpDDSrcSurface,
&pgf2->rect,
DDBLTFAST_SRCCOLORKEY);
当
g_lpDDSBack
定义为LPDIRECTDRAWSURFACE7 g_lpDDSBack;
时,这就是HexRays显示的输出: (*((int (__stdcall **)(int, int, int, _DWORD, int, signed int))g_lpDDSBack->lpVtbl + 7))(
g_lpDDSBack,
x,
y,
pgf2->lpDDSrcSurface,
&pgf2->rect,
DDBLTFAST_SRCCOLORKEY);
好了,现在这里是修复该错误的说明(
g_lpDDSBack
被定义为LPDIRECTDRAWSURFACE7 g_lpDDSBack;
):将文本框的内容添加到记事本中。在这种情况下,内容为lpVtbl
。将类型更改为
g_lpDDSBack->lpVtbl
,然后按OK 在
struct IDirectDrawSurface7::IDirectDrawSurface7Vtbl *lpVtbl
上再次按y,并将类型更改回存储在记事本中的原始类型。在这种情况下,它是int lpVtbl
。完成后,这就是HexRays中的样子(您可能必须先按F5键):g_lpDDSBack->lpVtbl->BltFast(g_lpDDSBack,
x,
y,
pgf2->lpDDSrcSurface,
&pgf2->rect,
DDBLTFAST_SRCCOLORKEY);