Browse Source

完成进程通信功能。

JeffWang 3 năm trước cách đây
mục cha
commit
e3383b9644

+ 86 - 16
Source/OGCAssist/OGCAssist/OGCAssist.cpp

@@ -186,18 +186,20 @@ namespace Assist
 		_cd_CheckFW.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
 		*(LPDWORD)(&_cd_CheckFW.szMyCallData[1]) = (DWORD)_cd_CheckFW.myCall - _cd_CheckFW.dwOriginalAddr - JMP_DLEN;
 
+#if 0 // 与_cd_Go_CommunicationError一样;
 		/* 针对弹框Communication Error的消除处理 */
 		// 00404408 | E8 2BA60C00       | call demo.4CEA38 | # Dailogs::ShowMessage(string) 弹出提示框:Communication Error
 		_cd_CheckFW_CommunicationError.myCall = Call_MyCheckFWCommunicationError;	// 成功获取版本后跳转处理;
 		// 0040440D | FF4D BC           | dec dword ptr ss:[ebp-44]     | [ebp-44]:&"脥I"
 		_cd_CheckFW_CommunicationError.dwBack2Addr = 0x0040440D;
 		_cd_CheckFW_CommunicationError.dwOriginalAddr = 0x00404408;
-		_cd_CheckFW_CommunicationError.dwOriginalCallAddr = 0x4CEA38;
+		_cd_CheckFW_CommunicationError.dwOriginalCallAddr = 0x004CEA38;
 
 		_cd_CheckFW_CommunicationError.nMyCallDataLen = JMP_DLEN;
 		memset(_cd_CheckFW_CommunicationError.szMyCallData, 0x90, CALL_LEN);
 		_cd_CheckFW_CommunicationError.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
 		*(LPDWORD)(&_cd_CheckFW_CommunicationError.szMyCallData[1]) = (DWORD)_cd_CheckFW_CommunicationError.myCall - _cd_CheckFW_CommunicationError.dwOriginalAddr - JMP_DLEN;
+#endif
 #pragma endregion
 	}
 
@@ -213,8 +215,8 @@ namespace Assist
 		if ( !(bHijack = HijackedCall(&_cd_Go)) )
 			goto end;
 
-		if ( !(bHijack = HijackedCall(&_cd_Go_SN)) )
-			goto end;
+		//if ( !(bHijack = HijackedCall(&_cd_Go_SN)) )
+		//	goto end;
 
 		if ( !(bHijack = HijackedCall(&_cd_Go_CommunicationError)) )
 			goto end;
@@ -228,8 +230,9 @@ namespace Assist
 		if ( !(bHijack = HijackedCall(&_cd_CheckFW)) )
 			goto end;
 
-		if ( !(bHijack = HijackedCall(&_cd_CheckFW_CommunicationError)) )
-			goto end;
+		// _cd_CheckFW_CommunicationError与_cd_Go_CommunicationError一样,无须重复处理;
+		//if ( !(bHijack = HijackedCall(&_cd_CheckFW_CommunicationError)) )
+		//	goto end;
 
 end:
 		Utility::dprintf(_T("HijackedCall<%s>. GLE=%d\n"), bHijack ? _T("True") : _T("False"), GetLastError() ); 
@@ -248,8 +251,8 @@ end:
 		if ( !(bRestor = RecoveryCall(&_cd_Go)) )
 			goto end;
 
-		if ( !(bRestor = RecoveryCall(&_cd_Go_SN)) )
-			goto end;
+		//if ( !(bRestor = RecoveryCall(&_cd_Go_SN)) )
+		//	goto end;
 
 		if ( !(bRestor = RecoveryCall(&_cd_Go_CommunicationError)) )
 			goto end;
@@ -263,8 +266,8 @@ end:
 		if ( !(bRestor = RecoveryCall(&_cd_CheckFW)) )
 			goto end;
 
-		if ( !(bRestor = RecoveryCall(&_cd_CheckFW_CommunicationError)) )
-			goto end;
+		//if ( !(bRestor = RecoveryCall(&_cd_CheckFW_CommunicationError)) )
+		//	goto end;
 
 end:
 		return ( bHijacked = !bRestor );
@@ -455,7 +458,17 @@ namespace Assist
 #ifdef _DEBUG
 		MessageBox(NULL, _T("MyGoSetCommunicationError"), _T("劫持"), MB_OK);
 #endif
-		// 向服务器发送消息;
+#pragma region 向服务器发送消息;
+		MSG_INFO msg;
+		msg.byResult = TRUE;
+		_stprintf((TCHAR*)msg.byData, _T("%s"), _T("OGCAssist Communication Error"));
+
+		DATAHEADER head;				
+		head.byMsgType = C2S_COMMUNICATION_ERROR;
+		head.dwPackageLen = sizeof(DATAHEADER) + sizeof(MSG_INFO);
+
+		Utility::g_pPipeClient->SendPackage(head, msg);
+#pragma endregion
 	}
 
 	void __declspec(naked) Call_MyGoSetCommunicationError()
@@ -497,7 +510,17 @@ namespace Assist
 #ifdef _DEBUG
 		MessageBox(NULL, _T("MyGoCommunicationError"), _T("劫持"), MB_OK);
 #endif
-		// 向服务器发送消息;
+#pragma region 向服务器发送消息;
+		MSG_INFO msg;
+		msg.byResult = TRUE;
+		_stprintf((TCHAR*)msg.byData, _T("%s"), _T("OGCAssist Communication Error"));
+
+		DATAHEADER head;				
+		head.byMsgType = C2S_COMMUNICATION_ERROR;
+		head.dwPackageLen = sizeof(DATAHEADER) + sizeof(MSG_INFO);
+
+		Utility::g_pPipeClient->SendPackage(head, msg);
+#pragma endregion
 	}
 
 	void __declspec(naked) Call_MyGoCommunicationError()
@@ -554,7 +577,17 @@ namespace Assist
 #endif
 		}
 
-		// 向服务器发送消息;
+#pragma region 向服务器发送消息;
+		MSG_INFO msg;
+		msg.byResult = bConnectStatus;
+		_stprintf((TCHAR*)msg.byData, _T("%s"), _T("OGCAssist Connect"));
+
+		DATAHEADER head;				
+		head.byMsgType = C2S_CONNECT;
+		head.dwPackageLen = sizeof(DATAHEADER) + sizeof(MSG_INFO);
+
+		Utility::g_pPipeClient->SendPackage(head, msg);
+#pragma endregion
 
 		return TRUE;
 	}
@@ -594,6 +627,17 @@ namespace Assist
 		MessageBox(NULL, _T("MyExternalExceptionE06D7363,重启异常待重启"), _T("提示"), MB_OK);
 #endif
 		// 向服务器发送消息;
+#pragma region 向服务器发送消息;
+		MSG_INFO msg;
+		msg.byResult = TRUE;
+		_stprintf((TCHAR*)msg.byData, _T("%s"), _T("OGCAssist Exception"));
+
+		DATAHEADER head;				
+		head.byMsgType = C2S_EXCEPTION;		// 服务端要重置Connect及其他状态
+		head.dwPackageLen = sizeof(DATAHEADER) + sizeof(MSG_INFO);
+
+		Utility::g_pPipeClient->SendPackage(head, msg);
+#pragma endregion
 		::exit(0);
 	}
 
@@ -622,7 +666,17 @@ namespace Assist
 #ifdef _DEBUG
 		MessageBox(NULL, _T("MyDisconnect Function"), _T("MyDisconnect"), MB_OK);
 #endif
-		// 向服务器发送消息;
+#pragma region 向服务器发送消息;
+		MSG_INFO msg;
+		msg.byResult = TRUE;
+		_stprintf((TCHAR*)msg.byData, _T("%s"), _T("OGCAssist Disconnect"));
+
+		DATAHEADER head;				
+		head.byMsgType = C2S_DISCONNECT;
+		head.dwPackageLen = sizeof(DATAHEADER) + sizeof(MSG_INFO);
+
+		Utility::g_pPipeClient->SendPackage(head, msg);
+#pragma endregion
 	}
 
 	void __declspec(naked) Call_MyDisconnect()
@@ -637,13 +691,29 @@ namespace Assist
 		}
 	}
 
-	void __declspec(naked) Call_MyCheckFW()
+	void MyCheckFW()
 	{
-		// 备份寄存器;
-		__asm pushad;
 #ifdef _DEBUG
 		MessageBox(NULL, _T("Call_MyCheckFW"), _T("MyCheckFW"), MB_OK);
 #endif
+#pragma region 向服务器发送消息;
+		MSG_INFO msg;
+		msg.byResult = TRUE;
+		_stprintf((TCHAR*)msg.byData, _T("%s"), _T("OGCAssist CheckFW"));
+
+		DATAHEADER head;				
+		head.byMsgType = C2S_CHECKFW;
+		head.dwPackageLen = sizeof(DATAHEADER) + sizeof(MSG_INFO);
+
+		Utility::g_pPipeClient->SendPackage(head, msg);
+#pragma endregion
+	}
+
+	void __declspec(naked) Call_MyCheckFW()
+	{
+		// 备份寄存器;
+		__asm pushad;
+		MyCheckFW();
 		__asm{
 			// 恢复寄存器; 
 			popad;

+ 2 - 0
Source/OGCAssist/OGCAssist/Protocol.h

@@ -34,6 +34,8 @@ typedef enum
 	C2S_CHECKFW,
 	// 客户端:发出Go触发结果;成功/失败; 成功->耗时值、输出目录
 	C2S_GO,
+	// 客户端:通信错误;
+	C2S_COMMUNICATION_ERROR,
 	// 客户端:产生异常时通知服务端结束程序;
 	C2S_EXCEPTION,
 };

+ 2 - 0
Source/OGCAssistTool/OGCAssistTool/Protocol.h

@@ -34,6 +34,8 @@ typedef enum
 	C2S_CHECKFW,
 	// 客户端:发出Go触发结果;成功/失败; 成功->耗时值、输出目录
 	C2S_GO,
+	// 客户端:通信错误;
+	C2S_COMMUNICATION_ERROR,
 	// 客户端:产生异常时通知服务端结束程序;
 	C2S_EXCEPTION,
 };