#include "stdafx.h"
#include "NewAppDlg.h"
#include <Mmsystem.h>
#include <Tlhelp32.h>
// Defines
#define LAUNCHER_FILENAME "GunzLauncher.exe" // °ÇÁî ·±ÃÄ ½ÇÇà ÆÄÀÏ À̸§
// DoDataExchange
void CNewAppDlg::DoDataExchange( CDataExchange* pDX)
{
CDDBDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewAppDlg)
DDX_Control(pDX, IDOK, m_cOK);
//}}AFX_DATA_MAP
}
// Message map
BEGIN_MESSAGE_MAP( CNewAppDlg, CDDBDialog)
//{{AFX_MSG_MAP(CNewAppDlg)
ON_WM_TIMER()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/************************************************************************************
Dialog
*************************************************************************************/
// Ŭ·¡½º »ý¼ºÀÚ
CNewAppDlg::CNewAppDlg( CWnd* pParent) : CDDBDialog( IDD_DIALOG_MAINDLG, pParent)
{
// À̰÷¿¡¼ »ý¼ºÇÒ ´ÙÀ̾ó·Î±×ÀÇ Á¤º¸¸¦ ÀÔ·ÂÇÑ´Ù
// Á» ´õ ÀÚ¼¼ÇÑ ¼³¸íÀ» ¿øÇϸé CDDBDialog.h ÈÀÏÀÇ Structure of CDDBDIALOGINFO ³»¿ëÀ» Âü°íÇÑ´Ù
CDDBDLGINFO DlgInfo;
DlgInfo.nWidth = 300;
DlgInfo.nHeight = 200;
DlgInfo.IDSkinResource = IDR_BMP_MAINDLG;
DlgInfo.IDIconResource = IDR_ICO_MAINFRAME;
DlgInfo.nTextColor = RGB( 38, 38, 38);
DlgInfo.nTextBkColor = RGB( 182, 182, 182);
//#ifdef LOCALE_NHNUSA
DlgInfo.nTextColor = RGB( 150, 150, 150);
DlgInfo.nTextBkColor = RGB( 38, 38, 38);
/*#else
DlgInfo.bUseTitlebar = true;
#endif*/
SetDialogInfo( DlgInfo);
}
CNewAppDlg::~CNewAppDlg()
{
}
/************************************************************************************
Ŭ·¡½º ¸Þ¼¼Áö Çڵ鷯
*************************************************************************************/
// OnInitDialog : ´ÙÀ̾ó·Î±×¸¦ ÃʱâÈ´Â ÇÔ¼ö
BOOL CNewAppDlg::OnInitDialog()
{
CDDBDialog::OnInitDialog();
// ´ÙÀ̾ó·Î±× ŸÀÌÆ² º¯°æ
SetWindowText( "GunZ Updater");
//#ifdef LOCALE_NHNUSA
GetScreen()->PutText( 1, 3, GetWidth(), 20, 16, "Arial", "GunZ Updater", RGB( 20, 20, 20), TS_BOLD, DT_CENTER);
GetScreen()->PutText( 0, 2, GetWidth(), 20, 16, "Arial", "GunZ Updater", RGB( 200, 200, 200), TS_BOLD, DT_CENTER);
GetScreen()->PutBox( 12, 24, GetWidth() - 24, GetHeight() - 68, RGB( 80, 80, 80));
//#endif
// ´ÙÀ̾ó·Î±× À§Ä¡ À̵¿ ¹× Å©±â Á¶Àý
CRect rect;
GetWindowRect( &rect);
int nWidth = rect.Width(), nHeight = rect.Height();
rect.right = rect.left + nWidth;
rect.bottom = rect.top + nHeight;
MoveWindow( rect, true);
// ¸Þ½ÃÁö Ç¥½Ã
((CListBox*)GetDlgItem( IDC_OUTPUT))->ResetContent();
((CListBox*)GetDlgItem( IDC_OUTPUT))->MoveWindow( 13, 25, GetWidth() - 26, GetHeight() - 70);
OutputMsg( "Ready...");
// ¹öư ÃʱâÈ
m_cOK.InitDDBButton( IDR_BMP_BUTTON, NULL);
m_cOK.MoveWindow( GetWidth() / 2 - m_cOK.GetWidth() / 2, GetHeight() - 35);
m_cOK.EnableWindow( FALSE);
// ŸÀÌ¸Ó °³½Ã
SetTimer( 0, 200, NULL);
return true;
}
/************************************************************************************
ŸÀ̸Ó
*************************************************************************************/
void CNewAppDlg::OnTimer(UINT nIDEvent)
{
// ¾÷µ¥ÀÌÆ® ŸÀ̸Ó
if ( nIDEvent == 0)
{
static DWORD tStartTime = timeGetTime();
DWORD currTime = timeGetTime() - tStartTime;
// ·±ÃÄ ÇÁ·Î¼¼½º°¡ Á¾·áµÇ´Â °ÍÀ» È®ÀÎÇÑ´Ù
static bool bClosedLauncher = false;
if ( !bClosedLauncher && (currTime > 500))
{
bClosedLauncher = FindLauncherProcess();
}
// ÆÄÀÏ ÆÐÄ¡
if ( bClosedLauncher)
{
static int nPatchCount = 0;
static int nErrorCount = 0;
switch ( nPatchCount)
{
case 0 :
nPatchCount++;
if ( PatchFile( ".\\PATCH\\GunzLauncher.exe_", ".\\GunzLauncher.exe") == false)
nErrorCount++;
break;
case 1 :
nPatchCount++;
if ( PatchFile( ".\\PATCH\\HanAuthForClient.dll_", ".\\HanAuthForClient.dll") == false)
nErrorCount++;
break;
case 2 :
nPatchCount++;
if ( PatchFile( ".\\PATCH\\HanReportForClient.dll_", ".\\HanReportForClient.dll") == false)
nErrorCount++;
break;
case 3 :
nPatchCount++;
if ( nErrorCount)
{
((CListBox*)GetDlgItem( IDC_OUTPUT))->ShowScrollBar( SB_HORZ);
((CListBox*)GetDlgItem( IDC_OUTPUT))->SetHorizontalExtent( 1000);
char szMsg[ 512];
sprintf( szMsg, "%d error has been found.", nErrorCount);
OutputMsg( szMsg);
}
else
OutputMsg( "Patch successfully completed.");
tStartTime = timeGetTime();
m_cOK.EnableWindow( TRUE);
break;
// À©µµ¿ì Á¾·á
case 4 :
if ( (nErrorCount == 0) && (currTime > 2000))
OnOK();
break;
default :
break;
}
}
}
CDDBDialog::OnTimer(nIDEvent);
}
/************************************************************************************
¸Þ½ÃÁö Ãâ·ÂÇÏ´Â ÇÔ¼ö
*************************************************************************************/
void CNewAppDlg::OutputMsg( const char* pszMsg)
{
((CListBox*)GetDlgItem( IDC_OUTPUT))->AddString( pszMsg);
((CListBox*)GetDlgItem( IDC_OUTPUT))->SetCaretIndex( ((CListBox*)GetDlgItem( IDC_OUTPUT))->GetCount());
}
/************************************************************************************
Á¾·á ó¸®
*************************************************************************************/
void CNewAppDlg::OnOK()
{
// ·±Ãĸ¦ ´Ù½Ã ½ÃÀÛÇÑ´Ù.
char szCmdLine[ 4096] = { 0,};
sprintf( szCmdLine, ".\\GunzLauncher.exe \"%s\"", GetCommandLine());
WinExec( szCmdLine, SW_SHOW);
// À©µµ¿ì Á¾·á
CDialog::OnOK();
}
void CNewAppDlg::OnCancel()
{
}
/************************************************************************************
ÆÐÄ¡ ½ÃÀÛ
*************************************************************************************/
bool CNewAppDlg::FindLauncherProcess()
{
// ·±Ãİ¡ ¾ÆÁ÷ ½ÇÇàÁßÀÎÁö È®ÀÎÇÑ´Ù
if ( FindProcess( LAUNCHER_FILENAME) != NULL)
return false;
// ¸¸¾àÀ» À§Çؼ 1ÃÊ Á¤µµ ±â´Ù¸°´Ù
Sleep( 1000);
return true;
}
/************************************************************************************
ÆÄÀÏ ÆÐÄ¡
*************************************************************************************/
bool CNewAppDlg::PatchFile( const char* szPatchFileName, const char* szFileName)
{
// ¾÷µ¥ÀÌÆ® ÆÄÀÏÀ» ã´Â´Ù
WIN32_FIND_DATA FindData;
HANDLE hFind = FindFirstFile( _T( szPatchFileName), &FindData);
if ( hFind != INVALID_HANDLE_VALUE) // ÆÄÀÏÀÌ ÀÖÀ¸¸é...
{
FindClose( hFind);
// ¾÷µ¥ÀÌÆ® ÆÄÀÏÀ» º¹»çÇÑ´Ù.
if ( CopyFile( _T( szPatchFileName), _T( szFileName), false) == TRUE) // º¹»ç ÇßÀ¸¸é...
{
// ¾÷µ¥ÀÌÆ® ÆÄÀÏÀ» »èÁ¦ÇÑ´Ù.
DeleteFile( _T( szPatchFileName));
// Ãâ·Â ¸Þ½ÃÁö ÀÛ¼º
char szMsg[ 512];
sprintf( szMsg, "%s : Patched", szFileName);
OutputMsg( szMsg);
return true;
}
// º¹»ç ½ÇÆÐÀ̸é...
else
{
// ¿¡·¯ ÄÚµå
LPVOID lpMsgBuf;
DWORD error = GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, 0, NULL);
// Ãâ·Â ¸Þ½ÃÁö ÀÛ¼º
char szMsg[ 512];
sprintf( szMsg, "%s : Failed (%s)\n", szFileName, lpMsgBuf);
OutputMsg( szMsg);
LocalFree( lpMsgBuf);
return false;
}
}
return true;
}
/************************************************************************************
ÇØ´ç ÇÁ·Î¼¼½ºÀÇ ÇÚµéÀ» ±¸ÇÑ´Ù
*************************************************************************************/
/* 98¿¡¼ µ¿ÀÛ ¾ÈÇÔ... =_=
HANDLE CNewAppDlg::FindProcess( const char* pszFileName)
{
DWORD ProcessIDList[ 1024], cbNeeded;
if ( !EnumProcesses( ProcessIDList, sizeof( ProcessIDList), &cbNeeded))
return NULL;
// Calculate how many process identifiers were returned.
int nProcessCount = cbNeeded / sizeof( DWORD);
for ( int i = 0; i < nProcessCount; i++)
{
DWORD nProcessID = ProcessIDList[ i];
char szProcessName[ MAX_PATH] = "unknown";
char szProcessPath[ MAX_PATH] = "unknown";
// Get a handle to the process.
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, TRUE, nProcessID);
if ( NULL != hProcess) // Get the process name.
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof( hMod), &cbNeeded))
{
GetModuleBaseName( hProcess, hMod, szProcessName, sizeof( szProcessName));
GetModuleFileNameEx( hProcess, hMod, szProcessPath, sizeof( szProcessPath));
// ÆÄÀÏ À̸§¸¸ ºñ±³
if ( stricmp( pszFileName, szProcessName) == 0)
return hProcess;
// Àüü °æ·Î±îÁö ºñ±³
else if ( stricmp( pszFileName, szProcessPath) == 0)
return hProcess;
}
CloseHandle( hProcess);
}
}
return NULL;
}
*/
HANDLE CNewAppDlg::FindProcess( const char* pszFileName)
{
// Take a snapshot of all processes in the system.
HANDLE hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
if ( hProcessSnap == INVALID_HANDLE_VALUE)
return NULL;
// Set the size of the structure before using it.
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof( PROCESSENTRY32);
// Retrieve information about the first process, and exit if unsuccessful
if ( !Process32First( hProcessSnap, &pe32))
{
CloseHandle( hProcessSnap);
return NULL;
}
// Now walk the snapshot of processes, and
// display information about each process in turn
do
{
// Retrieve the priority class.
DWORD dwPriorityClass = 0;
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
if ( hProcess == NULL)
continue;
// Get module name
char szModuleName[ 256];
strcpy( szModuleName, (LPCTSTR)pe32.szExeFile);
if ( stricmp( pszFileName, szModuleName) == 0)
{
// Find module
CloseHandle( hProcess);
CloseHandle( hProcessSnap);
return hProcess;
}
CloseHandle( hProcess);
} while( Process32Next( hProcessSnap, &pe32));
CloseHandle( hProcessSnap);
return NULL;
}