#include <windows.h>
TCHAR szServiceName[] = "ServiceProject";
DWORD g_CurrentState;
SERVICE_STATUS_HANDLE g_SSHandle;
void MyWriteFileA(const CHAR* aaa, DWORD bbb = 0)
{
HANDLE fileHandle = CreateFile("C:\\Info.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (fileHandle == INVALID_HANDLE_VALUE)
{
return;
}
int dwPos = SetFilePointer(fileHandle, 0, NULL, FILE_END);
DWORD writeSize = 0;
if (bbb == 0)
{
if (!WriteFile(fileHandle, aaa, lstrlen(aaa), &writeSize, NULL) && writeSize != lstrlen(aaa))
{
CloseHandle(fileHandle);
return;
}
}
else {
if (!WriteFile(fileHandle, aaa, bbb, &writeSize, NULL) && writeSize != bbb)
{
CloseHandle(fileHandle);
return;
}
}
CloseHandle(fileHandle);
}
BOOL TellSCM(DWORD dwState, DWORD dwExitCode, DWORD dwProgress)
{
SERVICE_STATUS srvStatus;
srvStatus.dwServiceType = SERVICE_WIN32;
srvStatus.dwCurrentState = g_CurrentState = dwState;
srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;
srvStatus.dwWin32ExitCode = dwExitCode;
srvStatus.dwServiceSpecificExitCode = 0;
srvStatus.dwCheckPoint = dwProgress;
srvStatus.dwWaitHint = 1000;
return SetServiceStatus(g_SSHandle, &srvStatus);
}
void WINAPI ServiceControl(DWORD dwCommand)
{
switch (dwCommand)
{
case SERVICE_CONTROL_STOP:
MyWriteFileA("SERVICE_CONTROL_STOP\r\n");
TellSCM(SERVICE_STOP_PENDING, 0, 1);
TellSCM(SERVICE_STOPPED, 0, 0);
break;
case SERVICE_CONTROL_PAUSE:
MyWriteFileA("SERVICE_CONTROL_PAUSE\r\n");
TellSCM(SERVICE_PAUSE_PENDING, 0, 1);
TellSCM(SERVICE_PAUSED, 0, 0);
break;
case SERVICE_CONTROL_CONTINUE:
MyWriteFileA("SERVICE_CONTROL_CONTINUE\r\n");
TellSCM(SERVICE_CONTINUE_PENDING, 0, 1);
TellSCM(SERVICE_RUNNING, 0, 0);
break;
case SERVICE_CONTROL_INTERROGATE:
MyWriteFileA("SERVICE_CONTROL_INTERROGATE\r\n");
TellSCM(g_CurrentState, 0, 0);
break;
case SERVICE_CONTROL_SHUTDOWN:
MyWriteFileA("SERVICE_CONTROL_SHUTDOWN\r\n");
TellSCM(SERVICE_STOPPED, 0, 0);
break;
default:
MyWriteFileA("SERVICE_CONTROL_NONE\r\n");
break;
}
}
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
CHAR svcname[256] = { 0 };
lstrcpy(svcname, argv[0]);
g_SSHandle = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceControl);
if (!g_SSHandle)
{
return;
}
MyWriteFileA("SERVICE_CONTROL_START");
TellSCM(SERVICE_START_PENDING, 0, 1);
TellSCM(SERVICE_RUNNING, 0, 0);
//CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MainStart, NULL, 0, NULL));
}
int main()
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = szServiceName;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
StartServiceCtrlDispatcher(ServiceTable);
return 0;
}
Windows exe服务程序
由
·
发表回复