Windows exe服务程序

·

#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;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注