⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntservices.cpp

📁 DES算法及其在VC++6.0下的实现,编译时需要WinPcap开发包,您可以从http://www.vckbase.com/tools下载 WinPcap Developer s pack
💻 CPP
字号:
#include	"stdafx.h"
#include	<windows.h>
#include	<stdio.h>
#include	<iostream.h>
#include	<stdlib.h>
#include	"PIPMasq.h"
#include	<winsock.h>

char *SERVICE_NAME = "PIPMasqService";

HANDLE terminateEvent = NULL;
SERVICE_STATUS_HANDLE serviceStatusHandle;

BOOL pauseService = FALSE;
BOOL runningService = FALSE;

PROCESS_INFORMATION pi;

HANDLE threadHandle = 0;

void ErrorHandler(char *s, DWORD err)
{
	cout << s << endl;
	cout << "Error number: " << err << endl;
	ExitProcess(err);
}

BOOL InitService()
{
	DWORD id;

	threadHandle = CreateThread(0, 0,
		(LPTHREAD_START_ROUTINE) ServiceThread,
		0, 0, &id);

	if (threadHandle==0)
		return FALSE;
	else
	{
		runningService = TRUE;
		return TRUE;
	}
}


VOID ResumeService()
{
	pauseService=FALSE;
	ResumeThread(threadHandle);
}

VOID PauseService()
{
	pauseService = TRUE;
	SuspendThread(threadHandle);
}


VOID StopService() 
{
	WSACleanup();
	
	runningService=FALSE;

	TerminateProcess(pi.hProcess, 0);

	SetEvent(terminateEvent);
}

BOOL SendStatusToSCM (DWORD dwCurrentState,
	DWORD dwWin32ExitCode, 
	DWORD dwServiceSpecificExitCode,
	DWORD dwCheckPoint,
	DWORD dwWaitHint)
{
	BOOL success;
	SERVICE_STATUS serviceStatus;

	serviceStatus.dwServiceType =
		SERVICE_WIN32_OWN_PROCESS;
	serviceStatus.dwCurrentState = dwCurrentState;

	if (dwCurrentState == SERVICE_START_PENDING)
		serviceStatus.dwControlsAccepted = 0;
	else
		serviceStatus.dwControlsAccepted = 
			SERVICE_ACCEPT_STOP |
			SERVICE_ACCEPT_PAUSE_CONTINUE |
			SERVICE_ACCEPT_SHUTDOWN;

	if (dwServiceSpecificExitCode == 0)
		serviceStatus.dwWin32ExitCode =
			dwWin32ExitCode;
	else
		serviceStatus.dwWin32ExitCode = 
			ERROR_SERVICE_SPECIFIC_ERROR;
	serviceStatus.dwServiceSpecificExitCode =
		dwServiceSpecificExitCode;

	serviceStatus.dwCheckPoint = dwCheckPoint;
	serviceStatus.dwWaitHint = dwWaitHint;

	success = SetServiceStatus (serviceStatusHandle,
		&serviceStatus);
	if (!success)
		StopService();

	return success;
}


VOID ServiceCtrlHandler (DWORD controlCode) 
{
	DWORD  currentState = 0;
	BOOL success;

	switch(controlCode)
	{
		case SERVICE_CONTROL_STOP:
			currentState = SERVICE_STOP_PENDING;

			success = SendStatusToSCM(
				SERVICE_STOP_PENDING,
				NO_ERROR, 0, 1, 5000);

			StopService();
			return;

		case SERVICE_CONTROL_PAUSE:
			if (runningService && !pauseService)
			{
				success = SendStatusToSCM(
					SERVICE_PAUSE_PENDING,
					NO_ERROR, 0, 1, 1000);
				PauseService();
				currentState = SERVICE_PAUSED;
			}
			break;

		case SERVICE_CONTROL_CONTINUE:
			if (runningService && pauseService)
			{
				success = SendStatusToSCM(
					SERVICE_CONTINUE_PENDING,
					NO_ERROR, 0, 1, 1000);
					ResumeService();
					currentState = SERVICE_RUNNING;
			}
			break;

		case SERVICE_CONTROL_INTERROGATE:
			break;

		case SERVICE_CONTROL_SHUTDOWN:
			return;
		default:
 			break;
	}
	SendStatusToSCM(currentState, NO_ERROR,
		0, 0, 0);
}


VOID terminate(DWORD error)
{
	if (terminateEvent)
		CloseHandle(terminateEvent);

	if (serviceStatusHandle)
		SendStatusToSCM(SERVICE_STOPPED, error,
			0, 0, 0);

	if (threadHandle)
		CloseHandle(threadHandle);
}


VOID ServiceMain(DWORD argc, LPTSTR *argv) 
{
	BOOL success;

	serviceStatusHandle =
		RegisterServiceCtrlHandler(
			SERVICE_NAME,
			(LPHANDLER_FUNCTION) ServiceCtrlHandler);
	if (!serviceStatusHandle)
	{
		terminate(GetLastError());
		return;
	}

	success = SendStatusToSCM(
		SERVICE_START_PENDING,
		NO_ERROR, 0, 1, 5000);
	if (!success)
	{
		terminate(GetLastError()); 
		return;
	}

	terminateEvent = CreateEvent (0, TRUE, FALSE,0);
	if (!terminateEvent)
	{
		terminate(GetLastError());
		return;
	}

	success = SendStatusToSCM(
		SERVICE_START_PENDING,NO_ERROR, 0, 2, 1000);
	if (!success)
	{
		terminate(GetLastError()); 
		return;
	}

	success = SendStatusToSCM(
		SERVICE_START_PENDING,
		NO_ERROR, 0, 3, 5000);
	if (!success)
	{
		terminate(GetLastError()); 
		return;
	}

	success = InitService();
	if (!success)
	{
		terminate(GetLastError());
		return;
	}

	success = SendStatusToSCM(
		SERVICE_RUNNING,
		NO_ERROR, 0, 0, 0);
	if (!success)
	{
		terminate(GetLastError()); 
		return;
	}

	WaitForSingleObject (terminateEvent, INFINITE);

	terminate(0);
}



VOID main(int argc, char* argv[])
{
	if (!((argc == 2) && (strcmp("-exec", argv[1]) == 0)))
	{
		if (argc == 2) 
		{
			if (strcmp("-install", argv[1]) == 0)
				install();
			else if (strcmp("-remove", argv[1]) == 0)
				remove();

			exit(0);
		}
		else 
		{
			printf("Usage: \n");
			printf("PIPMasqService -install\n");
			printf("	This is to install PIPMasqService as a NT Service\n");
			printf("PIPMasqService -remove\n");
			printf("	This is to remove PIPMasqService\n");
			printf("After install it, you can start PIPMasqService from NT Services Panel.\n\n");
		
			exit(0);
		}
	}


	SERVICE_TABLE_ENTRY serviceTable[] = 
	{ 
	{ SERVICE_NAME,
		(LPSERVICE_MAIN_FUNCTION) ServiceMain},
	{ NULL, NULL }
	};
	BOOL success;

	success = 
		StartServiceCtrlDispatcher(serviceTable);
	if (!success)
		ErrorHandler("In StartServiceCtrlDispatcher",
			GetLastError());
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -