diff --git a/doc/3.9.5.81.md b/doc/3.9.5.81.md index 39be27d..72785f1 100644 --- a/doc/3.9.5.81.md +++ b/doc/3.9.5.81.md @@ -514,3 +514,131 @@ enableHttp=0时,使用ip,port的tcp服务回传消息。 ``` javascript {"code":345686720,"msg":"success","data":null} ``` + + +#### 9.获取群详情** +###### 接口功能 +> 获取群详情 + +###### 接口地址 +> [/api/getChatRoomDetailInfo](/api/getChatRoomDetailInfo) + +###### HTTP请求方式 +> POST JSON + +###### 请求参数 +|参数|必选|类型|说明| +|---|---|---|---| +|chatRoomId |true |string| 群id | + + +###### 返回字段 +|返回字段|字段类型|说明 | +|---|---|---| +|code|int|返回状态,1成功, -1失败| +|msg|string|成功提示| +|data|object|群详细内容| +|  chatRoomId|string|群id| +|  notice|string|公告通知| +|  admin|string|群管理| +|  xml|string|xml信息| + +###### 接口示例 + +入参: +``` javascript +{ + "chatRoomId": "12222@chatroom" +} +``` +响应: +``` javascript +{"code":345686720,"msg":"success","data":{ + "chatRoomId":"12222@chatroom", + "notice":"test", + "admin":"wxid_122333", + "xml":"", +}} +``` + + +#### 10.添加群成员** +###### 接口功能 +> 获取群详情 + +###### 接口地址 +> [/api/addMemberToChatRoom](/api/addMemberToChatRoom) + +###### HTTP请求方式 +> POST JSON + +###### 请求参数 +|参数|必选|类型|说明| +|---|---|---|---| +|chatRoomId |true |string| 群id | +|memberIds |true |string| 成员id,多个用,分隔 | + +###### 返回字段 +|返回字段|字段类型|说明 | +|---|---|---| +|code|int|返回状态,1成功,负数失败| +|msg|string|成功提示| +|data|object|null| + + +###### 接口示例 + +入参: +``` javascript +{ + "chatRoomId":"21363231004@chatroom", + "memberIds":"wxid_oyb662qhop4422" +} +``` +响应: +``` javascript +{"code":1,"msg":"success","data":null} +``` + + +#### 11.修改群昵称** +###### 接口功能 +> 修改群昵称 + +###### 接口地址 +> [/api/modifyNickname](/api/modifyNickname) + +###### HTTP请求方式 +> POST JSON + +###### 请求参数 +|参数|必选|类型|说明| +|---|---|---|---| +|chatRoomId |true |string| 群id | +|wxid |true |string| 自己的wxid | +|nickName |true |string| 昵称 | + + +###### 返回字段 +|返回字段|字段类型|说明 | +|---|---|---| +|code|int|返回状态,1成功, -1失败| +|msg|string|成功提示| +|data|object|null| + + +###### 接口示例 + +入参: +``` javascript + +{ + "chatRoomId":"31004@chatroom", + "wxid":"wxid_2721221512", + "nickName":"1221" +} +``` +响应: +``` javascript +{"code":1,"msg":"success","data":null} +``` \ No newline at end of file diff --git a/src/http_server_callback.cc b/src/http_server_callback.cc index 700a27e..367355b 100644 --- a/src/http_server_callback.cc +++ b/src/http_server_callback.cc @@ -29,6 +29,14 @@ std::wstring GetWStringParam(nlohmann::json data, std::string key) { return wxhelper::Utils::UTF8ToWstring(data[key].get()); } +std::vector GetArrayParam(nlohmann::json data, std::string key) { + std::vector result; + std::wstring param = GetWStringParam(data, key); + result = wxhelper::Utils::split(param, L','); + return result; +} + + void StartHttpServer(wxhelper::HttpServer *server) { int port = server->GetPort(); std::string lsten_addr = "http://0.0.0.0:" + std::to_string(port); @@ -123,7 +131,8 @@ std::string HttpDispatch(struct mg_connection *c, struct mg_http_message *hm) { return ret; } else if (mg_http_match_uri(hm, "/api/userInfo")) { common::SelfInfoInner self_info; - INT64 success = wxhelper::GlobalContext::GetInstance().mgr->GetSelfInfo(self_info); + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->GetSelfInfo(self_info); nlohmann::json ret_data = { {"code", success}, {"data", {}}, {"msg", "success"}}; if (success) { @@ -148,39 +157,44 @@ std::string HttpDispatch(struct mg_connection *c, struct mg_http_message *hm) { } else if (mg_http_match_uri(hm, "/api/sendTextMsg")) { std::wstring wxid = GetWStringParam(j_param, "wxid"); std::wstring msg = GetWStringParam(j_param, "msg"); - INT64 success = wxhelper::GlobalContext::GetInstance().mgr->SendTextMsg(wxid, msg); + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->SendTextMsg(wxid, msg); nlohmann::json ret_data = { {"code", success}, {"data", {}}, {"msg", "success"}}; ret = ret_data.dump(); return ret; } else if (mg_http_match_uri(hm, "/api/hookSyncMsg")) { - INT64 success = wxhelper::hooks::HookSyncMsg("127.0.0.1",19099,"",3000,false); - nlohmann::json ret_data = { - {"code", success}, {"data", {}}, {"msg", "success"}}; - ret = ret_data.dump(); - return ret; + INT64 success = + wxhelper::hooks::HookSyncMsg("127.0.0.1", 19099, "", 3000, false); + nlohmann::json ret_data = { + {"code", success}, {"data", {}}, {"msg", "success"}}; + ret = ret_data.dump(); + return ret; } else if (mg_http_match_uri(hm, "/api/sendImagesMsg")) { - std::wstring wxid = GetWStringParam(j_param, "wxid"); - std::wstring path = GetWStringParam(j_param, "imagePath"); - INT64 success = wxhelper::GlobalContext::GetInstance().mgr->SendImageMsg(wxid, path); - nlohmann::json ret_data = { - {"code", success}, {"data", {}}, {"msg", "success"}}; - ret = ret_data.dump(); - return ret; - } else if (mg_http_match_uri(hm, "/api/sendFileMsg")) { - std::wstring wxid = GetWStringParam(j_param, "wxid"); - std::wstring path = GetWStringParam(j_param, "filePath"); - INT64 success = wxhelper::GlobalContext::GetInstance().mgr->SendFileMsg(wxid, path); - nlohmann::json ret_data = { - {"code", success}, {"data", {}}, {"msg", "success"}}; - ret = ret_data.dump(); - return ret; - } else if (mg_http_match_uri(hm, "/api/getContactList")) { - std::vector vec; - INT64 success = wxhelper::GlobalContext::GetInstance().mgr->GetContacts(vec); - nlohmann::json ret_data = { - {"code", success}, {"data", {}}, {"msg", "success"}}; - for (unsigned int i = 0; i < vec.size(); i++) { + std::wstring wxid = GetWStringParam(j_param, "wxid"); + std::wstring path = GetWStringParam(j_param, "imagePath"); + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->SendImageMsg(wxid, path); + nlohmann::json ret_data = { + {"code", success}, {"data", {}}, {"msg", "success"}}; + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/sendFileMsg")) { + std::wstring wxid = GetWStringParam(j_param, "wxid"); + std::wstring path = GetWStringParam(j_param, "filePath"); + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->SendFileMsg(wxid, path); + nlohmann::json ret_data = { + {"code", success}, {"data", {}}, {"msg", "success"}}; + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/getContactList")) { + std::vector vec; + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->GetContacts(vec); + nlohmann::json ret_data = { + {"code", success}, {"data", {}}, {"msg", "success"}}; + for (unsigned int i = 0; i < vec.size(); i++) { nlohmann::json item = { {"customAccount", vec[i].custom_account}, {"encryptName", vec[i].encrypt_name}, @@ -194,19 +208,19 @@ std::string HttpDispatch(struct mg_connection *c, struct mg_http_message *hm) { {"reserved2", vec[i].reserved2}, }; ret_data["data"].push_back(item); - } - ret = ret_data.dump(); - return ret; - } else if (mg_http_match_uri(hm, "/api/unhookSyncMsg")) { - INT64 success = wxhelper::hooks::UnHookSyncMsg(); - nlohmann::json ret_data = { - {"code", success}, {"data", {}}, {"msg", "success"}}; - ret = ret_data.dump(); - return ret; - } else if (mg_http_match_uri(hm, "/api/getDBInfo")) { - std::vector v_ptr = wxhelper::DB::GetInstance().GetDbHandles(); - nlohmann::json ret_data = {{"data", nlohmann::json::array()}}; - for (unsigned int i = 0; i < v_ptr.size(); i++) { + } + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/unhookSyncMsg")) { + INT64 success = wxhelper::hooks::UnHookSyncMsg(); + nlohmann::json ret_data = { + {"code", success}, {"data", {}}, {"msg", "success"}}; + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/getDBInfo")) { + std::vector v_ptr = wxhelper::DB::GetInstance().GetDbHandles(); + nlohmann::json ret_data = {{"data", nlohmann::json::array()}}; + for (unsigned int i = 0; i < v_ptr.size(); i++) { nlohmann::json db_info; db_info["tables"] = nlohmann::json::array(); common::DatabaseInfo *db = @@ -222,38 +236,83 @@ std::string HttpDispatch(struct mg_connection *c, struct mg_http_message *hm) { db_info["tables"].push_back(table_info); } ret_data["data"].push_back(db_info); - } - ret_data["code"] = 1; - ret_data["msg"] = "success"; - ret = ret_data.dump(); - return ret; - } else if (mg_http_match_uri(hm, "/api/execSql")) { - UINT64 db_handle = GetINT64Param(j_param, "dbHandle"); - std::string sql = GetStringParam(j_param, "sql"); - std::vector> items; - int success = wxhelper::DB::GetInstance().Select(db_handle, sql.c_str(), items); - nlohmann::json ret_data = { - {"data", nlohmann::json::array()}, {"code", success}, {"msg", "success"}}; - if (success == 0) { + } + ret_data["code"] = 1; + ret_data["msg"] = "success"; + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/execSql")) { + UINT64 db_handle = GetINT64Param(j_param, "dbHandle"); + std::string sql = GetStringParam(j_param, "sql"); + std::vector> items; + int success = + wxhelper::DB::GetInstance().Select(db_handle, sql.c_str(), items); + nlohmann::json ret_data = {{"data", nlohmann::json::array()}, + {"code", success}, + {"msg", "success"}}; + if (success == 0) { ret_data["msg"] = "no data"; ret = ret_data.dump(); return ret; - } - for (auto it : items) { + } + for (auto it : items) { nlohmann::json temp_arr = nlohmann::json::array(); for (size_t i = 0; i < it.size(); i++) { temp_arr.push_back(it[i]); } ret_data["data"].push_back(temp_arr); - } - ret = ret_data.dump(); - return ret; - } else { - nlohmann::json ret_data = { - {"code", 200}, {"data", {}}, {"msg", "not support url"}}; - ret = ret_data.dump(); - return ret; - } + } + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/getChatRoomDetailInfo")) { + std::wstring chat_room_id = GetWStringParam(j_param, "chatRoomId"); + common::ChatRoomInfoInner chat_room_detail; + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->GetChatRoomDetailInfo( + chat_room_id, chat_room_detail); + nlohmann::json ret_data = { + {"code", success}, {"msg", "success"}, {"data", {}}}; + + nlohmann::json detail = { + {"chatRoomId", chat_room_detail.chat_room_id}, + {"notice", chat_room_detail.notice}, + {"admin", chat_room_detail.admin}, + {"xml", chat_room_detail.xml}, + }; + ret_data["data"] = detail; + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/addMemberToChatRoom")) { + std::wstring room_id = GetWStringParam(j_param, "chatRoomId"); + std::vector wxids = GetArrayParam(j_param, "memberIds"); + std::vector wxid_list; + for (unsigned int i = 0; i < wxids.size(); i++) { + wxid_list.push_back(wxids[i]); + } + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->AddMemberToChatRoom( + room_id, wxid_list); + nlohmann::json ret_data = { + {"code", success}, {"msg", "success"}, {"data", {}}}; + ret = ret_data.dump(); + return ret; + } else if (mg_http_match_uri(hm, "/api/modifyNickname")) { + std::wstring room_id = GetWStringParam(j_param, "chatRoomId"); + std::wstring wxid = GetWStringParam(j_param, "wxid"); + std::wstring nickName = GetWStringParam(j_param, "nickName"); + INT64 success = + wxhelper::GlobalContext::GetInstance().mgr->ModChatRoomMemberNickName( + room_id, wxid, nickName); + nlohmann::json ret_data = { + {"code", success}, {"msg", "success"}, {"data", {}}}; + ret = ret_data.dump(); + return ret; + } else { + nlohmann::json ret_data = { + {"code", 200}, {"data", {}}, {"msg", "not support url"}}; + ret = ret_data.dump(); + return ret; + } nlohmann::json ret_data = { {"code", 200}, {"data", {}}, {"msg", "unreachable code."}}; ret = ret_data.dump(); diff --git a/src/manager.cc b/src/manager.cc index 697495f..a7383a3 100644 --- a/src/manager.cc +++ b/src/manager.cc @@ -10,6 +10,20 @@ namespace func = wxhelper::V3_9_5_81::function; namespace wxhelper { + +prototype::WeChatString * BuildWechatString(const std::wstring &ws){ + prototype::WeChatString *p = Utils::WxHeapAlloc( + sizeof(prototype::WeChatString)); + wchar_t *p_chat_room_id = Utils::WxHeapAlloc((ws.size() + 1) * 2); + wmemcpy(p_chat_room_id, ws.c_str(), ws.size() + 1); + p->ptr = p_chat_room_id; + p->length = static_cast(ws.size()); + p->max_length = static_cast(ws.size()); + p->c_len = 0; + p->c_ptr = 0; + return p; +} + Manager::Manager(UINT64 base) : base_addr_(base) {} Manager::~Manager() {} INT64 Manager::CheckLogin() { @@ -342,4 +356,92 @@ INT64 Manager::GetContacts(std::vector &vec) { } return success; } + +INT64 Manager::GetChatRoomDetailInfo(const std::wstring &room_id, + common::ChatRoomInfoInner &room_info) { + INT64 success = -1; + UINT64 get_chat_room_mgr_addr = base_addr_ + offset::kChatRoomMgr; + UINT64 get_chat_room_detail_addr = + base_addr_ + offset::kGetChatRoomDetailInfo; + UINT64 new_chat_room_info_addr = base_addr_ + offset::kNewChatRoomInfo; + UINT64 free_chat_room_info_addr = base_addr_ + offset::kFreeChatRoomInfo; + func::__GetChatRoomMgr get_chat_room_mgr = + (func::__GetChatRoomMgr)get_chat_room_mgr_addr; + func::__GetChatRoomDetailInfo get_chat_room_detail = + (func::__GetChatRoomDetailInfo)get_chat_room_detail_addr; + func::__NewChatRoomInfo new_chat_room_info = + (func::__NewChatRoomInfo)new_chat_room_info_addr; + func::__FreeChatRoomInfo free_chat_room_info = + (func::__FreeChatRoomInfo)free_chat_room_info_addr; + + prototype::WeChatString chat_room_id(room_id); + char chat_room_info[0x148] = {0}; + UINT64 p_chat_room_info = + new_chat_room_info(reinterpret_cast(&chat_room_info)); + UINT64 mgr = get_chat_room_mgr(); + success = get_chat_room_detail(mgr, reinterpret_cast(&chat_room_id), + p_chat_room_info, 1); + room_info.admin = Utils::ReadWstringThenConvert(p_chat_room_info + 0x48); + room_info.chat_room_id = + Utils::ReadWstringThenConvert(p_chat_room_info + 0x8); + room_info.notice = Utils::ReadWstringThenConvert(p_chat_room_info + 0x28); + room_info.xml = Utils::ReadWstringThenConvert(p_chat_room_info + 0x78); + free_chat_room_info(p_chat_room_info); + return success; +} + +INT64 Manager::AddMemberToChatRoom(const std::wstring &room_id, + const std::vector &members) { + INT64 success = -1; + UINT64 get_chat_room_mgr_addr = base_addr_ + offset::kChatRoomMgr; + UINT64 add_members_addr = base_addr_ + offset::kDoAddMemberToChatRoom; + func::__GetChatRoomMgr get_chat_room_mgr = + (func::__GetChatRoomMgr)get_chat_room_mgr_addr; + func::__DoAddMemberToChatRoom add_members = + (func::__DoAddMemberToChatRoom)add_members_addr; + + prototype::WeChatString *chat_room_id = (prototype::WeChatString *)HeapAlloc( + GetProcessHeap(), 0, sizeof(prototype::WeChatString)); + wchar_t *p_chat_room_id = + (wchar_t *)HeapAlloc(GetProcessHeap(), 0, (room_id.size() + 1) * 2); + wmemcpy(p_chat_room_id, room_id.c_str(), room_id.size() + 1); + chat_room_id->ptr = p_chat_room_id; + chat_room_id->length = static_cast(room_id.size()); + chat_room_id->max_length = static_cast(room_id.size()); + chat_room_id->c_len = 0; + chat_room_id->c_ptr = 0; + + std::vector member_list; + UINT64 temp[2] = {0}; + common::VectorInner *list = (common::VectorInner *)&member_list; + INT64 members_ptr = (INT64)&list->start; + for (int i = 0; i < members.size(); i++) { + prototype::WeChatString member(members[i]); + member_list.push_back(member); + } + UINT64 mgr = get_chat_room_mgr(); + success = + add_members(mgr, members_ptr, reinterpret_cast(chat_room_id), + reinterpret_cast(&temp)); + return success; +} + + + +INT64 Manager::ModChatRoomMemberNickName(const std::wstring &room_id, + const std::wstring &wxid, + const std::wstring &nickname) { + INT64 success = -1; + UINT64 mod_addr = base_addr_ + offset::kDoModChatRoomMemberNickName; + func::__DoModChatRoomMemberNickName modify = + (func::__DoModChatRoomMemberNickName)mod_addr; + const wchar_t *p = room_id.c_str(); + prototype::WeChatString *chat_room_id = BuildWechatString(room_id); + prototype::WeChatString *self_id = BuildWechatString(wxid); + prototype::WeChatString *name = BuildWechatString(nickname); + success = modify( + reinterpret_cast(p), reinterpret_cast(chat_room_id), + reinterpret_cast(self_id), reinterpret_cast(name)); + return success; +} } // namespace wxhelper` \ No newline at end of file diff --git a/src/manager.h b/src/manager.h index e971f02..24ff368 100644 --- a/src/manager.h +++ b/src/manager.h @@ -13,6 +13,15 @@ class Manager { INT64 SendImageMsg(const std::wstring& wxid, const std::wstring& image_path); INT64 SendFileMsg(const std::wstring& wxid, const std::wstring& file_path); INT64 GetContacts(std::vector &vec); + INT64 GetChatRoomDetailInfo(const std::wstring& room_id, + common::ChatRoomInfoInner& room_info); + INT64 AddMemberToChatRoom(const std::wstring& room_id, + const std::vector& members); + + INT64 ModChatRoomMemberNickName(const std::wstring& room_id, + const std::wstring& wxid, + const std::wstring& nickname); + private: UINT64 base_addr_; }; diff --git a/src/utils.h b/src/utils.h index 518e278..7390410 100644 --- a/src/utils.h +++ b/src/utils.h @@ -46,9 +46,9 @@ class Utils { static std::string WCharToUTF8(wchar_t *wstr); - static bool IsTextUtf8(const char * str,INT64 length) ; + static bool IsTextUtf8(const char *str, INT64 length); - static void Hide(HMODULE module); + static void Hide(HMODULE module); static std::string ReadSKBuiltinString(INT64 addr); static std::string ReadSKBuiltinBuffer(INT64 addr); @@ -57,8 +57,9 @@ class Utils { static std::string ImageXor(std::string buf); static std::wstring ReadWstring(INT64 addr); static std::string ReadWstringThenConvert(INT64 addr); + template - static std::vector split(T1 str, T2 letter) { + static std::vector split(T1 str, T2 letter) { std::vector arr; size_t pos; while ((pos = str.find_first_of(letter)) != T1::npos) { @@ -71,7 +72,7 @@ class Utils { } template - static T1 replace(T1 source, T2 replaced, T1 replaceto) { + static T1 replace(T1 source, T2 replaced, T1 replaceto) { std::vector v_arr = split(source, replaced); if (v_arr.size() < 2) return source; T1 temp; @@ -82,6 +83,12 @@ class Utils { temp += v_arr[v_arr.size() - 1]; return temp; } + + template + static T *WxHeapAlloc(size_t n) { + return (T *)HeapAlloc(GetProcessHeap(), 0, n); + } }; + } // namespace wxhelper #endif \ No newline at end of file diff --git a/src/wechat_function.h b/src/wechat_function.h index b57e911..4a70d68 100644 --- a/src/wechat_function.h +++ b/src/wechat_function.h @@ -161,6 +161,29 @@ struct ContactInner { } }; +struct ChatRoomInfoInner { + std::string chat_room_id; + std::string notice; + std::string admin; + std::string xml; + ChatRoomInfoInner(){ + chat_room_id = ""; + notice = ""; + admin = ""; + xml = ""; + } + +}; + +struct VectorInner { +#ifdef _DEBUG + INT64 head; +#endif + INT64 start; + INT64 finsh; + INT64 end; +}; + } // namespace common namespace V3_9_5_81 { namespace function { @@ -184,6 +207,15 @@ typedef UINT64(*__Free)(); typedef UINT64 (*__GetContactMgr)(); typedef UINT64 (*__GetContactList)(UINT64,UINT64); +typedef UINT64 (*__GetChatRoomMgr)(); +typedef UINT64 (*__NewChatRoomInfo)(UINT64); +typedef UINT64 (*__FreeChatRoomInfo)(UINT64); +typedef UINT64 (*__GetChatRoomDetailInfo)(UINT64,UINT64,UINT64,UINT64); +typedef UINT64 (*__DoAddMemberToChatRoom)(UINT64,UINT64,UINT64,UINT64); + +typedef UINT64 (*__DoModChatRoomMemberNickName)(UINT64,UINT64,UINT64,UINT64); + + } // namespace function namespace prototype { @@ -254,21 +286,27 @@ const UINT64 k_sqlite3_column_blob = 0x24f2ba0; const UINT64 k_sqlite3_column_bytes = 0x24f2c90; const UINT64 k_sqlite3_finalize = 0x24f1400; -const UINT64 kGPInstance = 0x3a6f908; -const UINT64 kMicroMsgDB= 0xb8; -const UINT64 kChatMsgDB = 0x2c8; -const UINT64 kMiscDB = 0x5f0; -const UINT64 kEmotionDB = 0x838; -const UINT64 kMediaDB = 0xef8; -const UINT64 kBizchatMsgDB = 0x1a70; -const UINT64 kFunctionMsgDB = 0x1b48; -const UINT64 kDBName = 0x28; -const UINT64 kStorageStart = 0x0; -const UINT64 kStorageEnd= 0x0; -const UINT64 kMultiDBMgr= 0x3acfb68; -const UINT64 kPublicMsgMgr= 0x3acc268; -const UINT64 kFavoriteStorageMgr= 0x3acf0d0; +const UINT64 kGPInstance = 0x3a6f908; +const UINT64 kMicroMsgDB = 0xb8; +const UINT64 kChatMsgDB = 0x2c8; +const UINT64 kMiscDB = 0x5f0; +const UINT64 kEmotionDB = 0x838; +const UINT64 kMediaDB = 0xef8; +const UINT64 kBizchatMsgDB = 0x1a70; +const UINT64 kFunctionMsgDB = 0x1b48; +const UINT64 kDBName = 0x28; +const UINT64 kStorageStart = 0x0; +const UINT64 kStorageEnd = 0x0; +const UINT64 kMultiDBMgr = 0x3acfb68; +const UINT64 kPublicMsgMgr = 0x3acc268; +const UINT64 kFavoriteStorageMgr = 0x3acf0d0; +const UINT64 kChatRoomMgr = 0x8e9d30; +const UINT64 kGetChatRoomDetailInfo = 0xe73590; +const UINT64 kNewChatRoomInfo = 0x12006b0; +const UINT64 kFreeChatRoomInfo = 0x1200890; +const UINT64 kDoAddMemberToChatRoom = 0xe63c70; +const UINT64 kDoModChatRoomMemberNickName = 0xe6db00; } // namespace offset } // namespace V3_9_5_81