Refactoring

This commit is contained in:
Changhua 2023-12-06 22:06:16 +08:00
parent d0b8cc2305
commit 1001e9b429
2 changed files with 112 additions and 93 deletions

View File

@ -19,31 +19,31 @@ int AddChatroomMember(string roomid, string wxids)
return -1; return -1;
} }
int rv = 0; int rv = 0;
DWORD addRoomMemberCall1 = g_WeChatWinDllAddr + g_WxCalls.arm.call1; DWORD armCall1 = g_WeChatWinDllAddr + g_WxCalls.arm.call1;
DWORD addRoomMemberCall2 = g_WeChatWinDllAddr + g_WxCalls.arm.call2; DWORD armCall2 = g_WeChatWinDllAddr + g_WxCalls.arm.call2;
DWORD addRoomMemberCall3 = g_WeChatWinDllAddr + g_WxCalls.arm.call3; DWORD armCall3 = g_WeChatWinDllAddr + g_WxCalls.arm.call3;
DWORD temp = 0; DWORD temp = 0;
wstring wsRoomid = String2Wstring(roomid); wstring wsRoomid = String2Wstring(roomid);
WxString txtRoomid(wsRoomid); WxString wxRoomid(wsRoomid);
vector<wstring> vMembers; vector<wstring> vMembers;
vector<WxString> vTxtMembers; vector<WxString> vWxMembers;
wstringstream wss(String2Wstring(wxids)); wstringstream wss(String2Wstring(wxids));
while (wss.good()) { while (wss.good()) {
wstring wstr; wstring wstr;
getline(wss, wstr, L','); getline(wss, wstr, L',');
vMembers.push_back(wstr); vMembers.push_back(wstr);
WxString txtMember(vMembers.back()); WxString txtMember(vMembers.back());
vTxtMembers.push_back(txtMember); vWxMembers.push_back(txtMember);
} }
LOG_DEBUG("Adding {} members[{}] to {}", vTxtMembers.size(), wxids.c_str(), roomid.c_str()); LOG_DEBUG("Adding {} members[{}] to {}", vWxMembers.size(), wxids.c_str(), roomid.c_str());
__asm { __asm {
pushad; pushad;
pushfd; pushfd;
call addRoomMemberCall1; call armCall1;
sub esp, 0x8; sub esp, 0x8;
mov temp, eax; mov temp, eax;
mov ecx, esp; mov ecx, esp;
@ -52,13 +52,13 @@ int AddChatroomMember(string roomid, string wxids)
test esi, esi; test esi, esi;
sub esp, 0x14; sub esp, 0x14;
mov ecx, esp; mov ecx, esp;
lea eax, txtRoomid; lea eax, wxRoomid;
push eax; push eax;
call addRoomMemberCall2; call armCall2;
mov ecx, temp; mov ecx, temp;
lea eax, vTxtMembers; lea eax, vWxMembers;
push eax; push eax;
call addRoomMemberCall3; call armCall3;
mov rv, eax; mov rv, eax;
popfd; popfd;
popad; popad;
@ -73,41 +73,41 @@ int DelChatroomMember(string roomid, string wxids)
return -1; return -1;
} }
int rv = 0; int rv = 0;
DWORD delRoomMemberCall1 = g_WeChatWinDllAddr + g_WxCalls.drm.call1; DWORD drmCall1 = g_WeChatWinDllAddr + g_WxCalls.drm.call1;
DWORD delRoomMemberCall2 = g_WeChatWinDllAddr + g_WxCalls.drm.call2; DWORD drmCall2 = g_WeChatWinDllAddr + g_WxCalls.drm.call2;
DWORD delRoomMemberCall3 = g_WeChatWinDllAddr + g_WxCalls.drm.call3; DWORD drmCall3 = g_WeChatWinDllAddr + g_WxCalls.drm.call3;
DWORD temp = 0; DWORD temp = 0;
wstring wsRoomid = String2Wstring(roomid); wstring wsRoomid = String2Wstring(roomid);
WxString txtRoomid(wsRoomid); WxString wxRoomid(wsRoomid);
vector<wstring> vMembers; vector<wstring> vMembers;
vector<WxString> vTxtMembers; vector<WxString> vWxMembers;
wstringstream wss(String2Wstring(wxids)); wstringstream wss(String2Wstring(wxids));
while (wss.good()) { while (wss.good()) {
wstring wstr; wstring wstr;
getline(wss, wstr, L','); getline(wss, wstr, L',');
vMembers.push_back(wstr); vMembers.push_back(wstr);
WxString txtMember(vMembers.back()); WxString txtMember(vMembers.back());
vTxtMembers.push_back(txtMember); vWxMembers.push_back(txtMember);
} }
LOG_DEBUG("Adding {} members[{}] to {}", vTxtMembers.size(), wxids.c_str(), roomid.c_str()); LOG_DEBUG("Adding {} members[{}] to {}", vWxMembers.size(), wxids.c_str(), roomid.c_str());
__asm { __asm {
pushad; pushad;
pushfd; pushfd;
call delRoomMemberCall1; call drmCall1;
sub esp, 0x14; sub esp, 0x14;
mov esi, eax; mov esi, eax;
mov ecx, esp; mov ecx, esp;
lea edi, txtRoomid; lea edi, wxRoomid;
push edi; push edi;
call delRoomMemberCall2; call drmCall2;
mov ecx, esi; mov ecx, esi;
lea eax, vTxtMembers; lea eax, vWxMembers;
push eax; push eax;
call delRoomMemberCall3; call drmCall3;
mov rv, eax; mov rv, eax;
popfd; popfd;
popad; popad;

View File

@ -69,11 +69,12 @@ bool func_is_login(uint8_t *out, size_t *len)
bool func_get_self_wxid(uint8_t *out, size_t *len) bool func_get_self_wxid(uint8_t *out, size_t *len)
{ {
string wxid = GetSelfWxid();
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_GET_SELF_WXID; rsp.func = Functions_FUNC_GET_SELF_WXID;
rsp.which_msg = Response_str_tag; rsp.which_msg = Response_str_tag;
rsp.msg.str = (char *)wxid.c_str();
string wxid = GetSelfWxid();
rsp.msg.str = (char *)wxid.c_str();
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
if (!pb_encode(&stream, Response_fields, &rsp)) { if (!pb_encode(&stream, Response_fields, &rsp)) {
@ -192,15 +193,16 @@ bool func_get_audio_msg(uint64_t id, char *dir, uint8_t *out, size_t *len)
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_GET_AUDIO_MSG; rsp.func = Functions_FUNC_GET_AUDIO_MSG;
rsp.which_msg = Response_str_tag; rsp.which_msg = Response_str_tag;
string path = "";
string path = string(dir ? dir : ""); if (dir == NULL) {
if (path.empty()) {
LOG_ERROR("Empty dir."); LOG_ERROR("Empty dir.");
rsp.msg.str = (char *)"";
} else { } else {
rsp.msg.str = (char *)GetAudio(id, dir).c_str(); path = GetAudio(id, dir);
} }
rsp.msg.str = (char *)path.c_str();
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
if (!pb_encode(&stream, Response_fields, &rsp)) { if (!pb_encode(&stream, Response_fields, &rsp)) {
LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream)); LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream));
@ -213,12 +215,12 @@ bool func_get_audio_msg(uint64_t id, char *dir, uint8_t *out, size_t *len)
bool func_send_txt(TextMsg txt, uint8_t *out, size_t *len) bool func_send_txt(TextMsg txt, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_TXT; rsp.func = Functions_FUNC_SEND_TXT;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
if ((txt.msg == NULL) || (txt.receiver == NULL)) { if ((txt.msg == NULL) || (txt.receiver == NULL)) {
LOG_ERROR("Empty message or receiver.");
rsp.msg.status = -1; // Empty message or empty receiver rsp.msg.status = -1; // Empty message or empty receiver
} else { } else {
string msg(txt.msg); string msg(txt.msg);
@ -226,6 +228,7 @@ bool func_send_txt(TextMsg txt, uint8_t *out, size_t *len)
string aters(txt.aters ? txt.aters : ""); string aters(txt.aters ? txt.aters : "");
SendTextMessage(receiver, msg, aters); SendTextMessage(receiver, msg, aters);
rsp.msg.status = 0;
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -240,15 +243,16 @@ bool func_send_txt(TextMsg txt, uint8_t *out, size_t *len)
bool func_send_img(char *path, char *receiver, uint8_t *out, size_t *len) bool func_send_img(char *path, char *receiver, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_IMG; rsp.func = Functions_FUNC_SEND_IMG;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
if ((path == NULL) || (receiver == NULL)) { if ((path == NULL) || (receiver == NULL)) {
LOG_ERROR("Empty path or receiver.");
rsp.msg.status = -1; rsp.msg.status = -1;
} else { } else {
SendImageMessage(receiver, path); SendImageMessage(receiver, path);
rsp.msg.status = 0;
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -263,15 +267,16 @@ bool func_send_img(char *path, char *receiver, uint8_t *out, size_t *len)
bool func_send_file(char *path, char *receiver, uint8_t *out, size_t *len) bool func_send_file(char *path, char *receiver, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_FILE; rsp.func = Functions_FUNC_SEND_FILE;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
if ((path == NULL) || (receiver == NULL)) { if ((path == NULL) || (receiver == NULL)) {
LOG_ERROR("Empty path or receiver.");
rsp.msg.status = -1; rsp.msg.status = -1;
} else { } else {
SendImageMessage(receiver, path); SendImageMessage(receiver, path);
rsp.msg.status = 0;
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -286,12 +291,12 @@ bool func_send_file(char *path, char *receiver, uint8_t *out, size_t *len)
bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len) bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_XML; rsp.func = Functions_FUNC_SEND_XML;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
if ((xml.content == NULL) || (xml.receiver == NULL)) { if ((xml.content == NULL) || (xml.receiver == NULL)) {
LOG_ERROR("Empty content or receiver.");
rsp.msg.status = -1; rsp.msg.status = -1;
} else { } else {
string receiver(xml.receiver); string receiver(xml.receiver);
@ -299,6 +304,7 @@ bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
string path(xml.path ? xml.path : ""); string path(xml.path ? xml.path : "");
uint32_t type = (uint32_t)xml.type; uint32_t type = (uint32_t)xml.type;
SendXmlMessage(receiver, content, path, type); SendXmlMessage(receiver, content, path, type);
rsp.msg.status = 0;
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -313,15 +319,16 @@ bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
bool func_send_emotion(char *path, char *receiver, uint8_t *out, size_t *len) bool func_send_emotion(char *path, char *receiver, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_EMOTION; rsp.func = Functions_FUNC_SEND_EMOTION;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
if ((path == NULL) || (receiver == NULL)) { if ((path == NULL) || (receiver == NULL)) {
LOG_ERROR("Empty path or receiver.");
rsp.msg.status = -1; rsp.msg.status = -1;
} else { } else {
SendEmotionMessage(receiver, path); SendEmotionMessage(receiver, path);
rsp.msg.status = 0;
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -336,21 +343,26 @@ bool func_send_emotion(char *path, char *receiver, uint8_t *out, size_t *len)
bool func_send_rich_txt(RichText rt, uint8_t *out, size_t *len) bool func_send_rich_txt(RichText rt, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_RICH_TXT; rsp.func = Functions_FUNC_SEND_RICH_TXT;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
RichText_t rtt; if (rt.receiver == NULL) {
rtt.account = string(rt.account ? rt.account : ""); LOG_ERROR("Empty receiver.");
rtt.digest = string(rt.digest ? rt.digest : ""); rsp.msg.status = -1;
rtt.name = string(rt.name ? rt.name : ""); } else {
rtt.receiver = string(rt.receiver ? rt.receiver : ""); RichText_t rtt;
rtt.thumburl = string(rt.thumburl ? rt.thumburl : ""); rtt.account = string(rt.account ? rt.account : "");
rtt.title = string(rt.title ? rt.title : ""); rtt.digest = string(rt.digest ? rt.digest : "");
rtt.url = string(rt.url ? rt.url : ""); rtt.name = string(rt.name ? rt.name : "");
rtt.receiver = string(rt.receiver ? rt.receiver : "");
rtt.thumburl = string(rt.thumburl ? rt.thumburl : "");
rtt.title = string(rt.title ? rt.title : "");
rtt.url = string(rt.url ? rt.url : "");
rsp.msg.status = SendRichTextMessage(rtt);
}
rsp.msg.status = SendRichTextMessage(rtt);
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
if (!pb_encode(&stream, Response_fields, &rsp)) { if (!pb_encode(&stream, Response_fields, &rsp)) {
LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream)); LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream));
@ -368,6 +380,7 @@ bool func_send_pat_msg(char *roomid, char *wxid, uint8_t *out, size_t *len)
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
if ((roomid == NULL) || (wxid == NULL)) { if ((roomid == NULL) || (wxid == NULL)) {
LOG_ERROR("Empty roomid or wxid.");
rsp.msg.status = -1; rsp.msg.status = -1;
} else { } else {
rsp.msg.status = SendPatMessage(roomid, wxid); rsp.msg.status = SendPatMessage(roomid, wxid);
@ -502,8 +515,14 @@ bool func_exec_db_query(char *db, char *sql, uint8_t *out, size_t *len)
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_EXEC_DB_QUERY; rsp.func = Functions_FUNC_EXEC_DB_QUERY;
rsp.which_msg = Response_rows_tag; rsp.which_msg = Response_rows_tag;
DbRows_t rows;
if ((db == NULL) || (sql == NULL)) {
LOG_ERROR("Empty db or sql.");
} else {
rows = ExecDbQuery(db, sql);
}
DbRows_t rows = ExecDbQuery(db, sql);
rsp.msg.rows.rows.arg = &rows; rsp.msg.rows.rows.arg = &rows;
rsp.msg.rows.rows.funcs.encode = encode_rows; rsp.msg.rows.rows.funcs.encode = encode_rows;
@ -519,19 +538,15 @@ bool func_exec_db_query(char *db, char *sql, uint8_t *out, size_t *len)
bool func_accept_friend(char *v3, char *v4, int32_t scene, uint8_t *out, size_t *len) bool func_accept_friend(char *v3, char *v4, int32_t scene, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_ACCEPT_FRIEND; rsp.func = Functions_FUNC_ACCEPT_FRIEND;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
if ((v3 == NULL) || (v4 == NULL)) { if ((v3 == NULL) || (v4 == NULL)) {
rsp.msg.status = -1; rsp.msg.status = -1;
LOG_ERROR("Empty V3 or V4."); LOG_ERROR("Empty V3 or V4.");
} else { } else {
rsp.msg.status = AcceptNewFriend(v3, v4, scene); rsp.msg.status = AcceptNewFriend(v3, v4, scene);
if (rsp.msg.status != 1) {
LOG_ERROR("AcceptNewFriend failed: {}", rsp.msg.status);
}
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -546,14 +561,15 @@ bool func_accept_friend(char *v3, char *v4, int32_t scene, uint8_t *out, size_t
bool func_receive_transfer(char *wxid, char *tfid, char *taid, uint8_t *out, size_t *len) bool func_receive_transfer(char *wxid, char *tfid, char *taid, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_RECV_TRANSFER; rsp.func = Functions_FUNC_RECV_TRANSFER;
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
rsp.msg.status = ReceiveTransfer(wxid, tfid, taid); if ((wxid == NULL) || (tfid == NULL) || (taid == NULL)) {
if (rsp.msg.status != 1) { rsp.msg.status = -1;
LOG_ERROR("AddChatroomMember failed: {}", rsp.msg.status); LOG_ERROR("Empty wxid, tfid or taid.");
} else {
rsp.msg.status = ReceiveTransfer(wxid, tfid, taid);
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -652,17 +668,16 @@ bool func_decrypt_image(DecPath dec, uint8_t *out, size_t *len)
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_DECRYPT_IMAGE; rsp.func = Functions_FUNC_DECRYPT_IMAGE;
rsp.which_msg = Response_str_tag; rsp.which_msg = Response_str_tag;
string path = "";
string src = string(dec.src ? dec.src : ""); if ((dec.src == NULL) || (dec.dst == NULL)) {
string dst = string(dec.dst ? dec.dst : ""); LOG_ERROR("Empty src or dst.");
if (src.empty()) {
LOG_ERROR("Empty src path.");
rsp.msg.str = (char *)"";
} else { } else {
string path = DecryptImage(src, dst); path = DecryptImage(dec.src, dec.dst);
rsp.msg.str = (char *)path.c_str();
} }
rsp.msg.str = (char *)path.c_str();
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
if (!pb_encode(&stream, Response_fields, &rsp)) { if (!pb_encode(&stream, Response_fields, &rsp)) {
LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream)); LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream));
@ -680,9 +695,11 @@ bool func_add_room_members(char *roomid, char *wxids, uint8_t *out, size_t *len)
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0; rsp.msg.status = 0;
rsp.msg.status = AddChatroomMember(roomid, wxids); if ((roomid == NULL) || (wxids == NULL)) {
if (rsp.msg.status != 1) { LOG_ERROR("Empty roomid or wxids.");
LOG_ERROR("AddChatroomMember failed: {}", rsp.msg.status); rsp.msg.status = -1;
} else {
rsp.msg.status = AddChatroomMember(roomid, wxids);
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -702,9 +719,11 @@ bool func_del_room_members(char *roomid, char *wxids, uint8_t *out, size_t *len)
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0; rsp.msg.status = 0;
rsp.msg.status = DelChatroomMember(roomid, wxids); if ((roomid == NULL) || (wxids == NULL)) {
if (rsp.msg.status != 1) { LOG_ERROR("Empty roomid or wxids.");
LOG_ERROR("DelChatroomMember failed: {}", rsp.msg.status); rsp.msg.status = -1;
} else {
rsp.msg.status = DelChatroomMember(roomid, wxids);
} }
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);