#include "pch.h"

#define ForwardMessageCall1Offset 0x771980
#define ForwardMessageCall2Offset 0x521760

#ifndef USE_SOCKET
struct ForwardMessageStruct
{
    wchar_t *wxid;
    unsigned long long localId;
};

BOOL ForwardMessageRemote(LPVOID lpParameter)
{
    ForwardMessageStruct *fms = (ForwardMessageStruct *)lpParameter;
    return ForwardMessage(fms->wxid, fms->localId);
}
#endif

BOOL __stdcall ForwardMessage(wchar_t *wxid, unsigned long long msgid)
{
    DWORD WeChatWinBase = GetWeChatWinBase();
    DWORD ForwardMessageCall1 = WeChatWinBase + ForwardMessageCall1Offset;
    DWORD ForwardMessageCall2 = WeChatWinBase + ForwardMessageCall2Offset;
    int dbIndex = 0;
    int localId = GetLocalIdByMsgId(msgid, dbIndex);
    if (localId == 0)
        return FALSE;
    dbIndex = 0x5000000 + (dbIndex << 8);
    WxString p_wxid(wxid);
    int isSuccess = 0;
    __asm {
		pushad;
		pushfd;
		mov eax, dword ptr ds:[dbIndex];
		push eax;
		mov ecx, dword ptr ds:[localId];
		push ecx;
		lea edi, p_wxid;
		sub esp, 0x14;
		mov ecx, esp;
		push edi;
		call ForwardMessageCall1;
		call ForwardMessageCall2;
		movzx eax,al;
		mov isSuccess,eax;
		add esp, 0x1C;
		popfd;
		popad;
    }
    return isSuccess == 0x1;
}
