GetChatRoomMembers.cpp 1.7 KB
Newer Older
L
ljc545w 已提交
1 2 3 4 5 6 7
#include "pch.h"

struct ChatRoomInfoStruct {
	DWORD members;
	DWORD length;
};

L
ljc545w 已提交
8
SAFEARRAY* GetChatRoomMembers(DWORD pid,wchar_t* chatroomid) {
L
ljc545w 已提交
9
    HRESULT hr = S_OK;
L
ljc545w 已提交
10 11 12 13
    WeChatProcess hp(pid);
    if (!hp.m_init) return NULL;
    DWORD GetChatRoomMembersRemoteAddr = hp.GetProcAddr(GetChatRoomMembersRemote);
    if (GetChatRoomMembersRemoteAddr == 0)
L
ljc545w 已提交
14
        return NULL;
L
ljc545w 已提交
15 16
    WeChatData<wchar_t*> r_chatroomid(hp.GetHandle(), chatroomid, TEXTLENGTH(chatroomid));
    if (r_chatroomid.GetAddr() == 0)
L
ljc545w 已提交
17
        return NULL;
L
ljc545w 已提交
18 19 20
    DWORD ret = CallRemoteFunction(hp.GetHandle(), GetChatRoomMembersRemoteAddr, r_chatroomid.GetAddr());
    
    if (ret == 0) {
L
ljc545w 已提交
21
        return NULL;
L
ljc545w 已提交
22
    }
L
ljc545w 已提交
23 24
    ChatRoomInfoStruct chatroominfo = { 0 };
    ReadProcessMemory(hp.GetHandle(),(LPCVOID)ret,&chatroominfo,sizeof(ChatRoomInfoStruct),0);
L
ljc545w 已提交
25 26
    wchar_t* members = new wchar_t[chatroominfo.length + 1];
    ZeroMemory(members, (chatroominfo.length + 1) * 2);
L
ljc545w 已提交
27
    ReadProcessMemory(hp.GetHandle(), (LPCVOID)chatroominfo.members, members, chatroominfo.length * 2, 0);
L
ljc545w 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    SAFEARRAYBOUND rgsaBound[2] = { {2,0},{2,0} };
    SAFEARRAY* psaValue = SafeArrayCreate(VT_VARIANT, 2, rgsaBound);
    long keyIndex[2] = { 0,0 };
    keyIndex[0] = 0; keyIndex[1] = 0;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)L"chatroomid");
    keyIndex[0] = 0; keyIndex[1] = 1;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)chatroomid);
    keyIndex[0] = 1; keyIndex[1] = 0;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)L"members");
    keyIndex[0] = 1; keyIndex[1] = 1;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)members);
    delete[] members;
    members = NULL;
    return psaValue;
}