Sfoglia il codice sorgente

针对:Panel Max Lv too Low for HDR弹框处理。

JeffWang 3 anni fa
parent
commit
b97f6b6984
1 ha cambiato i file con 57 aggiunte e 5 eliminazioni
  1. 57 5
      Source/OGCAssist/OGCAssist/OGCAssist.cpp

+ 57 - 5
Source/OGCAssist/OGCAssist/OGCAssist.cpp

@@ -20,6 +20,7 @@ namespace Assist
 	CALLDATA _cd_Go_SN;
 	CALLDATA _cd_Go_CommunicationError;
 	CALLDATA _cd_Go_SetCommunicationError;
+	CALLDATA _cd_Go_PanelTooLow;
 	CALLDATA _cd_Initial_failed;
 	CALLDATA _cd_ExternalException;
 	BOOL bConnectStatus = FALSE;
@@ -56,6 +57,7 @@ namespace Assist
 	void Call_MyGoSN();
 	void Call_MyCheckFW();
 	void Call_MyCheckFWCommunicationError();
+	void Call_MyGoPanelTooLow();
 	void Call_MySaveAsOutputData();
 	void Call_MyInitial_Failed();
 	void Call_MyGoCommunicationError();
@@ -200,6 +202,20 @@ namespace Assist
 		memset(_cd_Go_CommunicationError.szMyCallData, 0x90, CALL_LEN);
 		_cd_Go_CommunicationError.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
 		*(LPDWORD)(&_cd_Go_CommunicationError.szMyCallData[1]) = (DWORD)_cd_Go_CommunicationError.myCall - _cd_Go_CommunicationError.dwOriginalAddr - JMP_DLEN;
+
+
+		// _cd_Go_PanelTooLow
+		// 消除"Panel Max Lv too Low for HDR"弹框;
+		// 0042A140 | E8 F3480A00         | call demo.4CEA38  
+		_cd_Go_PanelTooLow.myCall = Call_MyGoPanelTooLow;
+		_cd_Go_PanelTooLow.dwBack2Addr = 0x0042A145;
+		_cd_Go_PanelTooLow.dwOriginalAddr = 0x0042A140;
+		_cd_Go_PanelTooLow.dwOriginalCallAddr = 0x004CEA38;
+
+		_cd_Go_PanelTooLow.nMyCallDataLen = JMP_DLEN;
+		memset(_cd_Go_PanelTooLow.szMyCallData, 0x90, CALL_LEN);
+		_cd_Go_PanelTooLow.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
+		*(LPDWORD)(&_cd_Go_PanelTooLow.szMyCallData[1]) = (DWORD)_cd_Go_PanelTooLow.myCall - _cd_Go_PanelTooLow.dwOriginalAddr - JMP_DLEN;
 #pragma endregion
 
 #pragma region CheckFW按钮处理
@@ -250,8 +266,8 @@ namespace Assist
 		if ( !(bHijack = HijackedCall(&_cd_Go)) )
 			goto end;
 
-		//if ( !(bHijack = HijackedCall(&_cd_Go_SN)) )
-		//	goto end;
+		if ( !(bHijack = HijackedCall(&_cd_Go_PanelTooLow)) )
+			goto end;
 
 		if ( !(bHijack = HijackedCall(&_cd_Go_CommunicationError)) )
 			goto end;
@@ -292,8 +308,8 @@ end:
 		if ( !(bRestor = RecoveryCall(&_cd_Go)) )
 			goto end;
 
-		//if ( !(bRestor = RecoveryCall(&_cd_Go_SN)) )
-		//	goto end;
+		if ( !(bRestor = RecoveryCall(&_cd_Go_PanelTooLow)) )
+			goto end;
 
 		if ( !(bRestor = RecoveryCall(&_cd_Go_CommunicationError)) )
 			goto end;
@@ -405,7 +421,7 @@ namespace Assist
 #pragma region 向服务器发送消息;
 		MSG_INFO msg;
 		// Go成功;
-		msg.byResult = TRUE;
+		msg.byResult = BYTE(*(LPDWORD)dwResutl);
 		_stprintf((TCHAR*)msg.byData, _T("%ld"), *(LPDWORD)dwElapsedAddr);
 
 		DATAHEADER head;				
@@ -600,6 +616,42 @@ namespace Assist
 		}
 	}
 
+	
+	void MyGoPanelTooLow()
+	{
+#ifdef _DEBUG
+		MessageBox(NULL, _T("MyGoPanelTooLow"), _T("劫持"), MB_OK);
+#endif
+#pragma region 向服务器发送消息;
+		MSG_INFO msg;
+		msg.byResult = FALSE;
+		_stprintf((TCHAR*)msg.byData, _T("%s"), _T("OGCAssist Panel Max Lv too Low for HDR"));
+
+		DATAHEADER head;				
+		head.byMsgType = C2S_GO;
+		//head.byMsgType = C2S_COMMUNICATION_ERROR;
+		head.dwPackageLen = sizeof(DATAHEADER) + sizeof(MSG_INFO);
+
+		Utility::g_pPipeClient->SendPackage(head, msg);
+#pragma endregion
+	}
+	
+	void __declspec(naked) Call_MyGoPanelTooLow()
+	{
+		// 备份寄存器;
+		__asm pushad;;
+		MyGoPanelTooLow();
+
+		__asm{
+			// 恢复寄存器; 
+			popad;
+			// 执行原Call;
+			//call _cd_Go_PanelTooLow.dwOriginalCallAddr
+			// 返回劫持地址下一行;
+			jmp _cd_Go_PanelTooLow.dwBack2Addr
+		}
+	}
+
 	BOOL MyConnect()
 	{
 		// 读取AL的值; 0表示Connect失败;1表示成功;