www.pudn.com > DetourQQ.rar > DetourQQ.cpp


 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 预处理 
#include "Define.h" 
#include  
#include "AboutDlg.h" 
#include "CodeAtom.h" 
#include "Resource.h" 
 
#pragma warning(disable:4244) 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 补丁数据 
/* 
00405D9C  |.  50            PUSH EAX 
00405D9D  |.  51            PUSH ECX 
00405D9E  |.  53            PUSH EBX 
00405D9F  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8] 
00405DA2  |.  52            PUSH EDX 
00405DA3  |.  FF57 20       CALL DWORD PTR DS:[EDI+20] 
00405DA6      85C0          TEST EAX,EAX 
00405DA8  |.  5F            POP EDI 
00405DA9  |.  0F84 99000000 JE QQ.00405E48*/ 
 
#define STR_LoginStamp	"\x50\x51\x53\xFF\x75\x3F\x52\xFF\x57\x3F\x85\xC0\x5F\x0F\x84" 
#define STR_LoginPatch	"\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x33\x3F\x3F\x3F\x3F" 
 
CODEATOM caPatch[] =  
{ 
	{0x00400000, 0x000A0000, sizeof(STR_LoginStamp) - 1, STR_LoginStamp, STR_LoginPatch}, 
}; 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 命令处理 
VOID OnCommand(HWND hWnd, WPARAM wParam) 
{ 
	OPENFILENAME ofnFile; 
	TCHAR tzPath[MAX_PATH]; 
 
	switch (LOWORD(wParam)) 
	{ 
	case IDC_Path: 
		// 路径文本改变 
		if (HIWORD(wParam) == EN_CHANGE) 
		{			 
			EnableWindow(GetDlgItem(hWnd, IDOK), (BOOL) SendDlgItemMessage(hWnd, IDC_Path, WM_GETTEXTLENGTH, 0, 0)); 
		} 
		break; 
 
	case IDC_Browse: 
		// 浏览获取文件名 
		tzPath[0] = 0; 
		ZeroMemory(&ofnFile, sizeof(OPENFILENAME)); 
		ofnFile.lStructSize = sizeof(OPENFILENAME); 
		ofnFile.hwndOwner = hWnd; 
		ofnFile.lpstrFile = tzPath; 
		ofnFile.nMaxFile = MAX_PATH; 
		ofnFile.lpstrFilter = STR_Filter; 
		ofnFile.lpstrDefExt = STR_Exe; 
		ofnFile.Flags = OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; 
		if (GetOpenFileName(&ofnFile)) 
		{ 
			SetDlgItemText(hWnd, IDC_Path, tzPath); 
		} 
		break; 
 
	case IDC_About: 
		// 显示关于对话框 
		CAboutDlg::Show(hWnd); 
		break; 
 
	case IDOK: 
		// 执行 
		GetDlgItemText(hWnd, IDC_Path, tzPath, MAX_PATH); 
		if (CCodeAtom::Execute(tzPath, caPatch, _NumberOf(caPatch))) 
		{ 
			MessageBox(hWnd, STR_Sucess, STR_AppName, MB_ICONINFORMATION | MB_TOPMOST); 
		} 
		else 
		{ 
			if (MessageBox(hWnd, STR_Failure, STR_AppName, MB_ICONQUESTION | MB_TOPMOST | MB_YESNO) == IDYES) 
			{ 
				ShellExecute(NULL, NULL, STR_WebUrl, NULL, NULL, SW_NORMAL); 
			} 
		} 
		break; 
 
	case IDCANCEL: 
		// 退出 
		EndDialog(hWnd, 0); 
		break; 
	} 
} 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 初始化对话框 
VOID OnInitDialog(HWND hWnd) 
{ 
	HKEY hKey; 
	DWORD dwLength; 
	TCHAR tzPath[MAX_PATH];	 
 
	// 设置图标 
	SetClassLongPtr(hWnd, GCL_HICON, (LONG_PTR) LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_Main))); 
 
	// 搜索路径 
	tzPath[0] = 0; 
	if (SearchPath(NULL, STR_ExeName, NULL, MAX_PATH, tzPath, NULL) == 0) 
	{ 
		// 查询注册表中的路径 
		if (RegOpenKey(HKEY_LOCAL_MACHINE, STR_SubKey, &hKey) == 0) 
		{ 
			dwLength = sizeof(tzPath); 
			RegQueryValueEx(hKey, STR_Install, NULL, NULL, (PBYTE) tzPath, &dwLength); 
			RegCloseKey(hKey); 
		} 
		SearchPath(tzPath, STR_ExeName, NULL, MAX_PATH, tzPath, NULL); 
	} 
 
	// 设置路径 
	if (tzPath[0]) 
	{ 
		SetDlgItemText(hWnd, IDC_Path, tzPath); 
	} 
	else 
	{ 
		OnCommand(hWnd, IDC_Browse); 
	} 
} 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 回调函数 
INT_PTR CALLBACK MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
	switch (uMsg) 
	{ 
	case WM_INITDIALOG: 
		OnInitDialog(hWnd); 
		break; 
 
	case WM_COMMAND: 
		OnCommand(hWnd, wParam); 
		break; 
 
	case WM_CLOSE: 
		OnCommand(hWnd, IDCANCEL); 
		break; 
 
	default: 
		return FALSE; 
	} 
 
	return TRUE; 
} 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 程序入口 
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pszCmdLine, INT iCmdShow) 
{ 
	return (INT) DialogBox(hInstance, MAKEINTRESOURCE(IDD_Main), NULL, MainDlgProc);	 
} 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////