Browse Source

1、添加对目标进程的劫持和恢复处理; 2、回调函数优化处理。

JeffWang 3 years ago
parent
commit
7bb4ef992a

+ 26 - 3
Source/OGCAssistTool/OGCAssistTool/PageDebug.cpp

@@ -58,7 +58,7 @@ BOOL CPageDebug::OnInitDialog()
 	SetBackgroundColor(RGB(200,200,200));
 	InitListCtrl();
 
-	GLOBAL::g_IOCP.SetCallBack(ConnectProc, NULL, NULL, NULL);
+	GLOBAL::g_IOCP.SetCallBack(ConnectProc, NULL, GoProc, NULL);
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 异常: OCX 属性页应返回 FALSE
@@ -131,12 +131,21 @@ HWND MyFindWindow(LPCTSTR lpClassName)
 	return hWnd;
 }
 
-BOOL CPageDebug::ConnectProc(MSG_INFO *pMsg)
+BOOL CPageDebug::ConnectProc(DATAHEADER *pHeader, MSG_INFO *pMsg)
 {
 	if ( m_pDlg == NULL )
 		return FALSE;
 
-	m_pDlg->SetDlgItemText(BTN_CONNECT, pMsg->byResult ? _T("断开连接") : _T("连接设备"));
+	if ( pHeader->byMsgType == C2S_CONNECT )
+		m_pDlg->SetDlgItemText(BTN_CONNECT, pMsg->byResult ? _T("断开连接") : _T("连接设备"));
+	else if ( pHeader->byMsgType == C2S_DISCONNECT )
+		m_pDlg->SetDlgItemText(BTN_CONNECT, pMsg->byResult ? _T("连接设备") : _T("断开连接"));
+}
+
+BOOL CPageDebug::GoProc(DATAHEADER *pHeader, MSG_INFO *pMsg)
+{
+
+	return FALSE;
 }
 
 void CPageDebug::OnBnClickedShowWnd()
@@ -161,10 +170,24 @@ void CPageDebug::OnBnClickedHijack()
 	if ( bCheck )
 	{
 		// 劫持窗口;
+		MSG_INFO msg;
+		DATAHEADER header;
+		header.byMsgType = S2C_HIJACK;
+		GLOBAL::g_IOCP.SendPackage(header, msg);
+#ifdef _DEBUG
+		MessageBox(_T("劫持窗口"), _T("提示"), MB_OK);
+#endif
 	}
 	else
 	{
 		// 恢复窗口;
+		MSG_INFO msg;
+		DATAHEADER header;
+		header.byMsgType = S2C_RESUME;
+		GLOBAL::g_IOCP.SendPackage(header, msg);
+#ifdef _DEBUG
+		MessageBox(_T("恢复窗口"), _T("提示"), MB_OK);
+#endif
 	}
 }
 

+ 2 - 1
Source/OGCAssistTool/OGCAssistTool/PageDebug.h

@@ -37,7 +37,8 @@ public:
 		SetDlgItemText(BTN_SHOW_WND, nCmdShow == SW_SHOW ? _T("Òþ²Ø´°¿Ú") : _T("ÏÔʾ´°¿Ú"));
 	}
 	static CPageDebug *m_pDlg;
-	static BOOL CALLBACK ConnectProc(MSG_INFO *pMsg);
+	static BOOL CALLBACK ConnectProc(DATAHEADER *pHeader, MSG_INFO *pMsg);
+	static BOOL CALLBACK GoProc(DATAHEADER *pHeader, MSG_INFO *pMsg);
 	afx_msg void OnBnClickedShowWnd();
 	afx_msg void OnBnClickedHijack();
 	afx_msg void OnBnClickedTest();

+ 38 - 2
Source/OGCAssistTool/OGCAssistTool/PipeService.cpp

@@ -496,7 +496,7 @@ void CIOCPPipe::RecvProcess(PER_PIPE_CONTEXT* pPipeContext, PER_IO_CONTEXT* pIoC
 				// 发送第一个请求:回调处理;
 				if ( lpOnConnectCallback )
 				{
-					lpOnConnectCallback(&msg_info);
+					lpOnConnectCallback(&header, &msg_info);
 				}
 			}
 			break;
@@ -504,6 +504,11 @@ void CIOCPPipe::RecvProcess(PER_PIPE_CONTEXT* pPipeContext, PER_IO_CONTEXT* pIoC
 			{
 				dprintf(_T("接收到客户端消息:断开"));
 				GLOBAL::g_procWndInfo.bConnectStatus = !msg_info.byResult;
+				// 发送第一个请求:回调处理;
+				if ( lpOnConnectCallback )
+				{
+					lpOnConnectCallback(&header, &msg_info);
+				}
 			}
 			break;
 		case C2S_CHECKFW:
@@ -594,6 +599,37 @@ bool CIOCPPipe::HandleError( PER_PIPE_CONTEXT *pPipeContext, const DWORD& dwErr
 	return false;
 }
 
-
+BOOL CIOCPPipe::SendPackage(DATAHEADER &header, MSG_INFO &msg)
+{
+	// 从客户端列表中,找到目标客户端;
+	if ( m_arrayClientContext.GetSize() == 0 )
+		return FALSE;
+
+	// 当前是单对单客户端;
+	PER_PIPE_CONTEXT *pPipe = m_arrayClientContext.GetAt(0);
+	if ( pPipe == NULL )
+		return FALSE;
+
+	std::string data;
+	data.append((char*)&header, sizeof(DATAHEADER));
+	//data.append((char*)(MSG_INFO*)pak.buf, sizeof(MSG_INFO));
+	data.append((char*)&msg, sizeof(MSG_INFO));
+	dprintf(_T("往客户端发送消息:Result=%d, Tpye=%d, Proctocl=%d, Len=%ld, Name=%s, Id=%ld, Data=%s"), 
+		msg.byResult,
+		header.byMsgType, 
+		header.byProtocol, 
+		header.dwPackageLen, 
+		msg.szClientName,
+		msg.dwClientId,
+		msg.byData
+		);
+
+	// 发送数据使用同步模式;
+	DWORD dwNumberOfBytesWritten = 0;
+	BOOL fWrite = WriteFile(pPipe->m_hPipe, data.data(), data.size(), &dwNumberOfBytesWritten, NULL);
+	dprintf(_T("SendData:Error=%ld, %d\n"), GetLastError(), fWrite);
+
+	return FALSE;
+}
 
 

+ 3 - 3
Source/OGCAssistTool/OGCAssistTool/PipeService.h

@@ -145,9 +145,9 @@ typedef struct _PER_PIPE_CONTEXT
 }PER_PIPE_CONTEXT, *PPER_PIPE_CONTEXT;
 
 // 回调客户端接入时;
-typedef BOOL(CALLBACK *OnGoCallback)(MSG_INFO* pIoContext);
+typedef BOOL(CALLBACK *OnGoCallback)(DATAHEADER *pHeader, MSG_INFO* pMsg);
 // 回调客户端接入时;
-typedef BOOL(CALLBACK *OnConnectCallback)(MSG_INFO* pIoContext);
+typedef BOOL(CALLBACK *OnConnectCallback)(DATAHEADER *pHeader, MSG_INFO* pMsg);
 // 回调客户端断开时;
 typedef BOOL(CALLBACK* OnDisconnectCallback)(PER_IO_CONTEXT* pIoContext);
 // 回调客户端消息到来时;
@@ -178,7 +178,7 @@ public:
     // 设置主界面的指针,用于调用显示信息到界面中
     void SetMainDlg(CDialog *p) { m_pMain = p; }
 	// 向客户端发送消息;
-	bool SendMessage();
+	BOOL SendPackage(DATAHEADER &header, MSG_INFO &msg);
 	// SetCallback;
 	static void SetCallBack(LPVOID lpOnConnect, LPVOID lpOnDisconnect, LPVOID lpOnGo, LPVOID lpOnRecive)
 	{