Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64a603c96b | ||
|
|
63ac97c864 | ||
|
|
1b8c3a851c | ||
|
|
d38f413c3d |
@@ -41,6 +41,8 @@
|
|||||||
62.发送公众号消息
|
62.发送公众号消息
|
||||||
63.转发公众号消息
|
63.转发公众号消息
|
||||||
64.发送小程序
|
64.发送小程序
|
||||||
|
65.退款
|
||||||
|
66.下载头像
|
||||||
|
|
||||||
### 接口文档:
|
### 接口文档:
|
||||||
|
|
||||||
@@ -1911,6 +1913,87 @@
|
|||||||
"wxid": "filehelper"
|
"wxid": "filehelper"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{"code":1,"result":"OK"}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### 65.退款**
|
||||||
|
###### 接口功能
|
||||||
|
> 收到转账消息后,自动退款。type=49 即是转账消息。
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/?type=65](/api/?type=65)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|wxid|string|转账人微信id,从hook的消息中获取|
|
||||||
|
|transcationId|string|从hook的消息中获取对应的字段内容。|
|
||||||
|
|transferId|string|从hook的消息中获取对应的字段内容。|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,1成功|
|
||||||
|
|result|string|成功提示|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"wxid":"wxid_agz5q76f11112",
|
||||||
|
"transcationId":"10000500012302060002831233124719620",
|
||||||
|
"transferId":"10000500012023020619112332136412"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{"code":1,"result":"OK"}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### 66.查询或下载头像**
|
||||||
|
###### 接口功能
|
||||||
|
> 暂时没用的功能
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/?type=66](/api/?type=66)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|wxid|string|微信id|
|
||||||
|
|imageUrl|string|头像地址|
|
||||||
|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,1成功|
|
||||||
|
|result|string|成功提示|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"wxid":"wxid_agz5q76f11112",
|
||||||
|
"imageUrl":""
|
||||||
|
}
|
||||||
```
|
```
|
||||||
响应:
|
响应:
|
||||||
``` javascript
|
``` javascript
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ typedef enum HTTP_API_ROUTE {
|
|||||||
WECHAT_FORWARD_PUBLIC_MSG,
|
WECHAT_FORWARD_PUBLIC_MSG,
|
||||||
WECHAT_FORWARD_PUBLIC_MSG_BY_SVRID,
|
WECHAT_FORWARD_PUBLIC_MSG_BY_SVRID,
|
||||||
WECHAT_SEND_APP_MSG,
|
WECHAT_SEND_APP_MSG,
|
||||||
|
WECHAT_REFUSE,
|
||||||
|
WECHAT_GET_HEAD_IMG,
|
||||||
} WECHAT_HTTP_APIS,
|
} WECHAT_HTTP_APIS,
|
||||||
*PWECHAT_HTTP_APIS;
|
*PWECHAT_HTTP_APIS;
|
||||||
|
|
||||||
|
|||||||
@@ -255,4 +255,30 @@ int ContactMgr::AddFriendByWxid(wchar_t *wxid,wchar_t* msg) {
|
|||||||
success = 1;
|
success = 1;
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ContactMgr::GetHeadImage(wchar_t* wxid,wchar_t* url){
|
||||||
|
int success = -1;
|
||||||
|
WeChatString contact(wxid);
|
||||||
|
WeChatString img_url(url);
|
||||||
|
DWORD head_image_mgr_addr = base_addr_ + WX_HEAD_IMAGE_MGR_OFFSET;
|
||||||
|
DWORD get_img_download_addr = base_addr_ + QUERY_THEN_DOWNLOAD_OFFSET;
|
||||||
|
char temp[0x8] ={0};
|
||||||
|
__asm{
|
||||||
|
PUSHAD
|
||||||
|
PUSHFD
|
||||||
|
CALL head_image_mgr_addr
|
||||||
|
LEA ECX,img_url
|
||||||
|
PUSH ECX
|
||||||
|
LEA ECX,contact
|
||||||
|
PUSH ECX
|
||||||
|
LEA ECX,temp
|
||||||
|
PUSH ECX
|
||||||
|
MOV ECX,EAX
|
||||||
|
CALL get_img_download_addr
|
||||||
|
POPFD
|
||||||
|
POPAD
|
||||||
|
}
|
||||||
|
success = 1;
|
||||||
|
return success;
|
||||||
|
}
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
||||||
@@ -16,6 +16,7 @@ class ContactMgr : public BaseMgr {
|
|||||||
int AddFriendByWxid(wchar_t* wxid,wchar_t* msg);
|
int AddFriendByWxid(wchar_t* wxid,wchar_t* msg);
|
||||||
int VerifyApply(wchar_t *v3, wchar_t *v4,int permission);
|
int VerifyApply(wchar_t *v3, wchar_t *v4,int permission);
|
||||||
int GetContactByWxid(wchar_t* wxid,ContactProfile& profile);
|
int GetContactByWxid(wchar_t* wxid,ContactProfile& profile);
|
||||||
|
int GetHeadImage(wchar_t* wxid,wchar_t* url);
|
||||||
};
|
};
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ void GlobalContext::initialize(HMODULE module) {
|
|||||||
#ifndef _DEBUG
|
#ifndef _DEBUG
|
||||||
hide_module->Hide(module_);
|
hide_module->Hide(module_);
|
||||||
#endif
|
#endif
|
||||||
|
ThreadPool::GetInstance().Create(2,8);
|
||||||
HttpServer::GetInstance().Init(config->GetPort());
|
HttpServer::GetInstance().Init(config->GetPort());
|
||||||
HttpServer::GetInstance().HttpStart();
|
HttpServer::GetInstance().HttpStart();
|
||||||
DB::GetInstance().init(base);
|
DB::GetInstance().init(base);
|
||||||
@@ -28,7 +28,6 @@ void GlobalContext::initialize(HMODULE module) {
|
|||||||
account_mgr.emplace(AccountMgr{base});
|
account_mgr.emplace(AccountMgr{base});
|
||||||
chat_room_mgr.emplace(ChatRoomMgr{base});
|
chat_room_mgr.emplace(ChatRoomMgr{base});
|
||||||
sns_mgr.emplace(SNSMgr{base});
|
sns_mgr.emplace(SNSMgr{base});
|
||||||
ThreadPool::GetInstance().Create(1,512);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalContext::finally() {
|
void GlobalContext::finally() {
|
||||||
|
|||||||
+11
-75
@@ -43,54 +43,6 @@ static DWORD user_info_next_addr_ = 0;
|
|||||||
|
|
||||||
UserInfo userinfo = {};
|
UserInfo userinfo = {};
|
||||||
|
|
||||||
void SendSocketMessage(InnerMessageStruct *msg) {
|
|
||||||
if (msg == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
unique_ptr<InnerMessageStruct> sms(msg);
|
|
||||||
json j_msg =
|
|
||||||
json::parse(msg->buffer, msg->buffer + msg->length, nullptr, false);
|
|
||||||
if (j_msg.is_discarded() == true) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
string jstr = j_msg.dump() + "\n";
|
|
||||||
|
|
||||||
if (server_port_ == 0) {
|
|
||||||
SPDLOG_ERROR("http server port error :{}",server_port_);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SOCKET client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|
||||||
if (client_socket < 0) {
|
|
||||||
SPDLOG_ERROR("socket init fail");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BOOL status = false;
|
|
||||||
sockaddr_in client_addr;
|
|
||||||
memset(&client_addr, 0, sizeof(client_addr));
|
|
||||||
client_addr.sin_family = AF_INET;
|
|
||||||
client_addr.sin_port = htons((u_short)server_port_);
|
|
||||||
InetPtonA(AF_INET, server_ip_, &client_addr.sin_addr.s_addr);
|
|
||||||
if (connect(client_socket, reinterpret_cast<sockaddr *>(&client_addr),
|
|
||||||
sizeof(sockaddr)) < 0) {
|
|
||||||
SPDLOG_ERROR("socket connect fail");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
char recv_buf[1024] = {0};
|
|
||||||
int ret = send(client_socket, jstr.c_str(), jstr.size(), 0);
|
|
||||||
if (ret == -1 || ret == 0) {
|
|
||||||
SPDLOG_ERROR("socket send fail ,ret::{}",ret);
|
|
||||||
closesocket(client_socket);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
memset(recv_buf, 0, sizeof(recv_buf));
|
|
||||||
ret = recv(client_socket, recv_buf, sizeof(recv_buf), 0);
|
|
||||||
closesocket(client_socket);
|
|
||||||
if (ret == -1 || ret == 0) {
|
|
||||||
SPDLOG_ERROR("socket recv fail ,ret:{}",ret);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
||||||
PTP_WORK Work) {
|
PTP_WORK Work) {
|
||||||
InnerMessageStruct *msg = (InnerMessageStruct *)context;
|
InnerMessageStruct *msg = (InnerMessageStruct *)context;
|
||||||
@@ -131,34 +83,26 @@ VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
|||||||
if (connect(client_socket, reinterpret_cast<sockaddr *>(&client_addr),
|
if (connect(client_socket, reinterpret_cast<sockaddr *>(&client_addr),
|
||||||
sizeof(sockaddr)) < 0) {
|
sizeof(sockaddr)) < 0) {
|
||||||
SPDLOG_ERROR("socket connect fail");
|
SPDLOG_ERROR("socket connect fail");
|
||||||
closesocket(client_socket);
|
goto clean;
|
||||||
WSACleanup();
|
|
||||||
return ;
|
|
||||||
}
|
}
|
||||||
char recv_buf[1024] = {0};
|
char recv_buf[1024] = {0};
|
||||||
ret = send(client_socket, jstr.c_str(), jstr.size(), 0);
|
ret = send(client_socket, jstr.c_str(), jstr.size(), 0);
|
||||||
if (ret == -1 || ret == 0) {
|
if (ret < 0) {
|
||||||
SPDLOG_ERROR("socket send fail ,ret:{}", ret);
|
SPDLOG_ERROR("socket send fail ,ret:{}", ret);
|
||||||
closesocket(client_socket);
|
goto clean;
|
||||||
WSACleanup();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
ret = shutdown(client_socket, SD_SEND);
|
ret = shutdown(client_socket, SD_SEND);
|
||||||
if (ret == SOCKET_ERROR) {
|
if (ret == SOCKET_ERROR) {
|
||||||
SPDLOG_ERROR("shutdown failed with erro:{}", ret);
|
SPDLOG_ERROR("shutdown failed with erro:{}", ret);
|
||||||
closesocket(client_socket);
|
goto clean;
|
||||||
WSACleanup();
|
|
||||||
return ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(recv_buf, 0, sizeof(recv_buf));
|
|
||||||
ret = recv(client_socket, recv_buf, sizeof(recv_buf), 0);
|
ret = recv(client_socket, recv_buf, sizeof(recv_buf), 0);
|
||||||
closesocket(client_socket);
|
if (ret < 0) {
|
||||||
if (ret == -1 || ret == 0) {
|
|
||||||
SPDLOG_ERROR("socket recv fail ,ret:{}", ret);
|
SPDLOG_ERROR("socket recv fail ,ret:{}", ret);
|
||||||
WSACleanup();
|
goto clean;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
clean:
|
||||||
|
closesocket(client_socket);
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -211,12 +155,7 @@ void __cdecl OnRecvMsg(DWORD msg_addr) {
|
|||||||
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
|
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
|
||||||
inner_msg->length = jstr.size();
|
inner_msg->length = jstr.size();
|
||||||
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
|
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
|
||||||
SPDLOG_INFO("add work:{}",add);
|
SPDLOG_INFO("add msg work:{}",add);
|
||||||
// HANDLE thread = CreateThread(
|
|
||||||
// NULL, 0, (LPTHREAD_START_ROUTINE)SendSocketMessage, inner_msg, NULL, 0);
|
|
||||||
// if (thread) {
|
|
||||||
// CloseHandle(thread);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -263,11 +202,8 @@ void __cdecl OnSnsTimeLineMsg(DWORD msg_addr) {
|
|||||||
inner_msg->buffer = new char[jstr.size() + 1];
|
inner_msg->buffer = new char[jstr.size() + 1];
|
||||||
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
|
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
|
||||||
inner_msg->length = jstr.size();
|
inner_msg->length = jstr.size();
|
||||||
HANDLE thread = CreateThread(
|
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
|
||||||
NULL, 0, (LPTHREAD_START_ROUTINE)SendSocketMessage, inner_msg, NULL, 0);
|
SPDLOG_INFO("add sns work:{}",add);
|
||||||
if (thread) {
|
|
||||||
CloseHandle(thread);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief hook sns msg implement
|
/// @brief hook sns msg implement
|
||||||
|
|||||||
+20
-2
@@ -429,9 +429,9 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
|
|||||||
wstring wxid = GetWStringParam(j_param, "wxid");
|
wstring wxid = GetWStringParam(j_param, "wxid");
|
||||||
wstring transcationid = GetWStringParam(j_param, "transcationId");
|
wstring transcationid = GetWStringParam(j_param, "transcationId");
|
||||||
wstring transferid = GetWStringParam(j_param, "transferId");
|
wstring transferid = GetWStringParam(j_param, "transferId");
|
||||||
BOOL response =g_context.misc_mgr->DoConfirmReceipt(
|
int success =g_context.misc_mgr->DoConfirmReceipt(
|
||||||
WS2LPWS(wxid), WS2LPWS(transcationid), WS2LPWS(transferid));
|
WS2LPWS(wxid), WS2LPWS(transcationid), WS2LPWS(transferid));
|
||||||
json ret_data = {{"msg", response}, {"result", "OK"}};
|
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||||
ret = ret_data.dump();
|
ret = ret_data.dump();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -650,6 +650,24 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
|
|||||||
ret = ret_data.dump();
|
ret = ret_data.dump();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case WECHAT_REFUSE:{
|
||||||
|
wstring wxid = GetWStringParam(j_param, "wxid");
|
||||||
|
wstring transcationid = GetWStringParam(j_param, "transcationId");
|
||||||
|
wstring transferid = GetWStringParam(j_param, "transferId");
|
||||||
|
int success =g_context.misc_mgr->DoRefuseReceipt(
|
||||||
|
WS2LPWS(wxid), WS2LPWS(transcationid), WS2LPWS(transferid));
|
||||||
|
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||||
|
ret = ret_data.dump();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WECHAT_GET_HEAD_IMG:{
|
||||||
|
wstring wxid = GetWStringParam(j_param, "wxid");
|
||||||
|
wstring url = GetWStringParam(j_param, "imageUrl");
|
||||||
|
int success =g_context.contact_mgr->GetHeadImage(WS2LPWS(wxid), WS2LPWS(url));
|
||||||
|
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||||
|
ret = ret_data.dump();
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
json ret_data = {{"result", "ERROR"}, {"msg", "not support api"}};
|
json ret_data = {{"result", "ERROR"}, {"msg", "not support api"}};
|
||||||
ret = ret_data.dump();
|
ret = ret_data.dump();
|
||||||
|
|||||||
@@ -135,6 +135,44 @@ int MiscMgr::DoConfirmReceipt(wchar_t *wxid, wchar_t *transcationid,
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int MiscMgr::DoRefuseReceipt(wchar_t *wxid, wchar_t *transcationid,
|
||||||
|
wchar_t *transferid) {
|
||||||
|
int success = -1;
|
||||||
|
WeChatString recv_id(wxid);
|
||||||
|
WeChatString transcation_id(transcationid);
|
||||||
|
WeChatString transfer_id(transferid);
|
||||||
|
char pay_info[0x134] = {0};
|
||||||
|
DWORD new_pay_info_addr = base_addr_ + WX_NEW_WCPAYINFO_OFFSET;
|
||||||
|
DWORD free_pay_info_addr = base_addr_ + WX_FREE_WCPAYINFO_OFFSET;
|
||||||
|
DWORD do_confirm_addr = base_addr_ + WX_CONFIRM_RECEIPT_OFFSET;
|
||||||
|
__asm {
|
||||||
|
PUSHAD
|
||||||
|
LEA ECX,pay_info
|
||||||
|
CALL new_pay_info_addr
|
||||||
|
MOV dword ptr [pay_info + 0x4], 0x1
|
||||||
|
MOV dword ptr [pay_info + 0x4C], 0x1
|
||||||
|
POPAD
|
||||||
|
}
|
||||||
|
memcpy(&pay_info[0x1c], &transcation_id, sizeof(transcation_id));
|
||||||
|
memcpy(&pay_info[0x38], &transfer_id, sizeof(transfer_id));
|
||||||
|
|
||||||
|
__asm {
|
||||||
|
PUSHAD
|
||||||
|
PUSH 0x0
|
||||||
|
SUB ESP,0x8
|
||||||
|
LEA EDX,recv_id
|
||||||
|
LEA ECX,pay_info
|
||||||
|
CALL do_confirm_addr
|
||||||
|
MOV success,EAX
|
||||||
|
ADD ESP,0xC
|
||||||
|
PUSH 0x0
|
||||||
|
LEA ECX,pay_info
|
||||||
|
CALL free_pay_info_addr
|
||||||
|
POPAD
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
int MiscMgr::DoDownloadTask(ULONG64 msg_id) {
|
int MiscMgr::DoDownloadTask(ULONG64 msg_id) {
|
||||||
int success = -1;
|
int success = -1;
|
||||||
int db_index = 0;
|
int db_index = 0;
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ class MiscMgr :public BaseMgr{
|
|||||||
int DoOCRTask(wchar_t* img_path, std::string& result);
|
int DoOCRTask(wchar_t* img_path, std::string& result);
|
||||||
int DoConfirmReceipt(wchar_t* wxid, wchar_t* transcationid,
|
int DoConfirmReceipt(wchar_t* wxid, wchar_t* transcationid,
|
||||||
wchar_t* transferid);
|
wchar_t* transferid);
|
||||||
|
int DoRefuseReceipt(wchar_t* wxid, wchar_t* transcationid,
|
||||||
|
wchar_t* transferid);
|
||||||
int DoDownloadTask(ULONG64 msg_id);
|
int DoDownloadTask(ULONG64 msg_id);
|
||||||
|
|
||||||
int GetVoice(ULONG64 msg_id, wchar_t* dir);
|
int GetVoice(ULONG64 msg_id, wchar_t* dir);
|
||||||
|
|||||||
+10
-3
@@ -6,10 +6,16 @@
|
|||||||
|
|
||||||
namespace wxhelper {
|
namespace wxhelper {
|
||||||
ThreadPool::~ThreadPool() {
|
ThreadPool::~ThreadPool() {
|
||||||
CloseThreadpoolCleanupGroupMembers(cleanup_group_, true, NULL);
|
if(cleanup_group_){
|
||||||
CloseThreadpoolCleanupGroup(cleanup_group_);
|
CloseThreadpoolCleanupGroupMembers(cleanup_group_, true, NULL);
|
||||||
CloseThreadpool(pool_);
|
CloseThreadpoolCleanupGroup(cleanup_group_);
|
||||||
|
}
|
||||||
|
DestroyThreadpoolEnvironment(&env_);
|
||||||
|
if (pool_){
|
||||||
|
CloseThreadpool(pool_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ThreadPool::Create(unsigned long min, unsigned long max) {
|
bool ThreadPool::Create(unsigned long min, unsigned long max) {
|
||||||
InitializeThreadpoolEnvironment(&env_);
|
InitializeThreadpoolEnvironment(&env_);
|
||||||
pool_ = CreateThreadpool(NULL);
|
pool_ = CreateThreadpool(NULL);
|
||||||
@@ -38,4 +44,5 @@ bool ThreadPool::AddWork(PTP_WORK_CALLBACK callback,PVOID opt) {
|
|||||||
SubmitThreadpoolWork(work);
|
SubmitThreadpoolWork(work);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
||||||
@@ -13,9 +13,6 @@ class ThreadPool :public Singleton<ThreadPool>{
|
|||||||
bool AddWork(PTP_WORK_CALLBACK callback,PVOID opt);
|
bool AddWork(PTP_WORK_CALLBACK callback,PVOID opt);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void operator=(const ThreadPool&) = delete;
|
|
||||||
void operator=(ThreadPool&&) = delete;
|
|
||||||
|
|
||||||
PTP_POOL pool_;
|
PTP_POOL pool_;
|
||||||
PTP_CLEANUP_GROUP cleanup_group_;
|
PTP_CLEANUP_GROUP cleanup_group_;
|
||||||
TP_CALLBACK_ENVIRON env_;
|
TP_CALLBACK_ENVIRON env_;
|
||||||
|
|||||||
@@ -26,7 +26,9 @@
|
|||||||
// sendMessageMgr
|
// sendMessageMgr
|
||||||
#define WX_SEND_MESSAGE_MGR_OFFSET 0x768be0
|
#define WX_SEND_MESSAGE_MGR_OFFSET 0x768be0
|
||||||
// shareRecordMgr
|
// shareRecordMgr
|
||||||
#define WX_SHARE_RECORD_MGR_OFFSET 0x78d5f0
|
#define WX_SHARE_RECORD_MGR_OFFSET 0x78d5f0
|
||||||
|
// headImageMgr
|
||||||
|
#define WX_HEAD_IMAGE_MGR_OFFSET 0x808850
|
||||||
|
|
||||||
|
|
||||||
// setChatMsgValue
|
// setChatMsgValue
|
||||||
@@ -203,6 +205,8 @@
|
|||||||
#define FREE_WA_UPDATABLE_MSG_INFO_OFFSET 0x79d4c0
|
#define FREE_WA_UPDATABLE_MSG_INFO_OFFSET 0x79d4c0
|
||||||
#define SEND_APP_MSG_OFFSET 0xfe8e40
|
#define SEND_APP_MSG_OFFSET 0xfe8e40
|
||||||
|
|
||||||
|
// query head image then download
|
||||||
|
#define QUERY_THEN_DOWNLOAD_OFFSET 0xc642f0
|
||||||
|
|
||||||
|
|
||||||
/*******************hook*********************************************/
|
/*******************hook*********************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user