247 lines
13 KiB
C++
247 lines
13 KiB
C++
// ESMService.cpp : Defines the entry point for the console application.
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "ESMFrameWork.h"
|
||
|
||
TNetLauncherPatcherConfig g_Config;
|
||
|
||
#ifdef _SERVICEMODE
|
||
#include <Winsvc.h>
|
||
|
||
SERVICE_STATUS m_ServiceStatus;
|
||
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
|
||
|
||
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
|
||
void WINAPI ServiceCtrlHandler(DWORD Opcode);
|
||
BOOL InstallService(LPCTSTR sExeFileName, LPCTSTR sServiceName, LPCTSTR sDisplayName);
|
||
BOOL DeleteService(LPCTSTR sServiceName);
|
||
|
||
void TextOut(const TCHAR * format, ...) {} //파일로그 심을 수 있도록 하자
|
||
|
||
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
|
||
{
|
||
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
|
||
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
|
||
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
|
||
m_ServiceStatus.dwWin32ExitCode = 0;
|
||
m_ServiceStatus.dwServiceSpecificExitCode = 0;
|
||
m_ServiceStatus.dwCheckPoint = 0;
|
||
m_ServiceStatus.dwWaitHint = 0;
|
||
|
||
m_ServiceStatusHandle = RegisterServiceCtrlHandler("ESM Service",ServiceCtrlHandler);
|
||
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
|
||
{
|
||
_ASSERT_EXPR(0, L"SERVICE_STATUS_HANDLE NULL");
|
||
return;
|
||
}
|
||
|
||
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
|
||
m_ServiceStatus.dwCheckPoint = 0;
|
||
m_ServiceStatus.dwWaitHint = 0;
|
||
if (!SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus))
|
||
{
|
||
_ASSERT_EXPR(0, L"SetServiceStatus error");
|
||
return;
|
||
}
|
||
|
||
CESMFrameWork::GetInstance()->AppInit();
|
||
return;
|
||
}
|
||
|
||
void WINAPI ServiceCtrlHandler(DWORD Opcode)
|
||
{
|
||
switch(Opcode)
|
||
{
|
||
case SERVICE_CONTROL_PAUSE:
|
||
{
|
||
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
|
||
}
|
||
break;
|
||
|
||
case SERVICE_CONTROL_CONTINUE:
|
||
{
|
||
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
|
||
}
|
||
break;
|
||
|
||
case SERVICE_CONTROL_STOP:
|
||
{
|
||
m_ServiceStatus.dwWin32ExitCode = 0;
|
||
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
|
||
m_ServiceStatus.dwCheckPoint = 0;
|
||
m_ServiceStatus.dwWaitHint = 0;
|
||
|
||
SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);
|
||
|
||
CESMFrameWork::GetInstance()->AppClose();
|
||
}
|
||
break;
|
||
|
||
case SERVICE_CONTROL_INTERROGATE:
|
||
{
|
||
}
|
||
break;
|
||
}
|
||
return;
|
||
}
|
||
|
||
BOOL InstallService(LPCTSTR sExeFileName, LPCTSTR sServiceName, LPCTSTR sDisplayName)
|
||
{
|
||
char strDir[1024];
|
||
char strbackspace[2]; strbackspace[0] = 0x5C; strbackspace[1] = 0;
|
||
|
||
SC_HANDLE schSCManager,schService;
|
||
|
||
GetCurrentDirectory(1024,strDir);
|
||
|
||
if(strDir[strlen(strDir) - 1] != 0x5C)
|
||
strcat(strDir, strbackspace);
|
||
strcat(strDir, sExeFileName);
|
||
|
||
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
|
||
|
||
if (schSCManager == NULL)
|
||
return false;
|
||
|
||
LPCTSTR lpszBinaryPathName=strDir;
|
||
|
||
schService = CreateService(schSCManager,
|
||
sServiceName, //Service Name
|
||
sDisplayName, // service name to display
|
||
SERVICE_ALL_ACCESS, // desired access
|
||
SERVICE_WIN32_OWN_PROCESS, // service type
|
||
SERVICE_DEMAND_START, // start type
|
||
SERVICE_ERROR_NORMAL, // error control type
|
||
lpszBinaryPathName, // service's binary
|
||
NULL, // no load ordering group
|
||
NULL, // no tag identifier
|
||
NULL, // no dependencies
|
||
NULL, // LocalSystem account
|
||
NULL); // no password
|
||
|
||
if (schService == NULL)
|
||
return false;
|
||
|
||
CloseServiceHandle(schService);
|
||
|
||
return true;
|
||
}
|
||
|
||
BOOL DeleteService(LPCTSTR sServiceName)
|
||
{
|
||
SC_HANDLE schSCManager;
|
||
SC_HANDLE hService;
|
||
|
||
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
|
||
|
||
if (schSCManager == NULL)
|
||
return false;
|
||
|
||
hService=OpenService(schSCManager, sServiceName, SERVICE_ALL_ACCESS);
|
||
|
||
if (hService == NULL)
|
||
return false;
|
||
|
||
if(DeleteService(hService)==0)
|
||
return false;
|
||
|
||
if(CloseServiceHandle(hService)==0)
|
||
return false;
|
||
else
|
||
return true;
|
||
}
|
||
|
||
int _tmain(int argc, _TCHAR* argv[])
|
||
{
|
||
SERVICE_TABLE_ENTRY DispatchTable[]={{"ESM Service",ServiceMain},{NULL,NULL}};
|
||
|
||
if (argc > 1)
|
||
{
|
||
if (!stricmp(argv[1],"install"))
|
||
{
|
||
//install인데 아규먼트가 부족하면 안데에에에에
|
||
if (argc < 6)
|
||
{
|
||
_ASSERT_EXPR(0, L"Check cmd arg");
|
||
return 0;
|
||
}
|
||
|
||
#ifdef _DEBUG
|
||
#ifdef WIN64
|
||
if (InstallService("ESMService64D.exe", "ESM Service", "EyedentityGames Service Manager") == TRUE)
|
||
#else
|
||
if (InstallService("ESMServiceD.exe", "ESM Service", "EyedentityGames Service Manager") == TRUE)
|
||
#endif
|
||
#else
|
||
#ifdef WIN64
|
||
if (InstallService("ESMService64.exe", "ESM Service", "EyedentityGames Service Manager") == TRUE)
|
||
#else
|
||
if (InstallService("ESMService.exe", "ESM Service", "EyedentityGames Service Manager") == TRUE)
|
||
#endif
|
||
#endif
|
||
{
|
||
//정상적이면 레지스트리에 등록하자
|
||
LONG nRet = AddRegistryKey(HKEY_LOCAL_MACHINE, "Software", "EyedentityGames");
|
||
if (nRet == ERROR_SUCCESS)
|
||
{
|
||
nRet = SetRegistryString(HKEY_LOCAL_MACHINE, "Software\\EyedentityGames", "ServiceManagerIP", argv[2]);
|
||
nRet = SetRegistryString(HKEY_LOCAL_MACHINE, "Software\\EyedentityGames", "ServiceManagerPort", argv[3]);
|
||
nRet = SetRegistryString(HKEY_LOCAL_MACHINE, "Software\\EyedentityGames", "LauncherPath", argv[4]);
|
||
nRet = SetRegistryString(HKEY_LOCAL_MACHINE, "Software\\EyedentityGames", "LauncherName", argv[5]);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"EyedentityGames Service Manager Installservice Failed");
|
||
return 0;
|
||
}
|
||
}
|
||
else if (!stricmp(argv[1],"uninstall"))
|
||
{
|
||
if (DeleteService("ESM Service") == TRUE)
|
||
{
|
||
//정상적이면 레지스트리에서 지우자
|
||
DeleteRegistry(HKEY_LOCAL_MACHINE, "Software\\EyedentityGames");
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"EyedentityGames Service Manager UnInstallservice Failed");
|
||
return 0;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (StartServiceCtrlDispatcher(DispatchTable) == 0)
|
||
{
|
||
_ASSERT_EXPR(0, L"no ESM Service");
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
#else
|
||
int _tmain(int argc, _TCHAR* argv[])
|
||
{
|
||
if (CESMFrameWork::GetInstance()->AppInit() == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"Init Failed");
|
||
return 0;
|
||
}
|
||
|
||
wprintf(L"exit 명령을 치면 종료\r\n");
|
||
|
||
char szCmd[256] = {0,};
|
||
while (1)
|
||
{
|
||
if (strcmp(szCmd, "exit") == 0) break;
|
||
|
||
printf("CMD>");
|
||
gets(szCmd);
|
||
}
|
||
|
||
CESMFrameWork::GetInstance()->AppClose();
|
||
|
||
return 0;
|
||
}
|
||
#endif
|