Esempio n. 1
0
/* --------------- Service main handler */
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
    ServiceStatus = RegisterServiceCtrlHandler(ServiceName, &CtrlHandler);
    if(!ServiceStatus)
    {
        TerminateService(GetLastError());
        return;
    }
    SendStatus(SERVICE_START_PENDING, NO_ERROR, 0, 1, 5000);
    ServiceEvent = CreateEvent(0, TRUE, FALSE, 0);
    if(!ServiceEvent)
    {
        TerminateService(GetLastError());
        return;
    }
    SendStatus(SERVICE_START_PENDING, NO_ERROR, 0, 2, 1000);
    SendStatus(SERVICE_START_PENDING, NO_ERROR, 0, 3, 5000);
    if(!InitServiceThread())
    {
        TerminateService(GetLastError());
        return;
    }
    SendStatus(SERVICE_RUNNING, NO_ERROR, 0, 0, 0);
    /* Endless loop */
    WaitForSingleObject(ServiceEvent, INFINITE);
    TerminateService(0);
    return;
}
Esempio n. 2
0
//Service controller
size_t WINAPI ServiceControl(
	_In_ const DWORD dwControlCode)
{
	switch(dwControlCode)
	{
		case SERVICE_CONTROL_SHUTDOWN:
		{
			WSACleanup();
			TerminateService();

			return EXIT_SUCCESS;
		}
		case SERVICE_CONTROL_STOP:
		{
			ServiceCurrentStatus = SERVICE_STOP_PENDING;
			UpdateServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0, 1U, UPDATE_SERVICE_TIME);
			WSACleanup();
			TerminateService();

			return EXIT_SUCCESS;
		}
		default:
		{
			break;
		}
	}

	UpdateServiceStatus(ServiceCurrentStatus, NO_ERROR, 0, 0, 0);
	return EXIT_SUCCESS;
}
Esempio n. 3
0
//Service controller
size_t WINAPI ServiceControl(
	const DWORD dwControlCode)
{
	switch(dwControlCode)
	{
	//Handle the shutdown signal.
		case SERVICE_CONTROL_SHUTDOWN:
		{
			TerminateService();
			return EXIT_SUCCESS;
		}
	//Handle the stop signal.
		case SERVICE_CONTROL_STOP:
		{
			ServiceCurrentStatus = SERVICE_STOP_PENDING;
			UpdateServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0, 1U, UPDATE_SERVICE_TIME);
			TerminateService();

			return EXIT_SUCCESS;
		}
	//Handle other signals.
		default:
		{
			break;
		}
	}

	UpdateServiceStatus(ServiceCurrentStatus, NO_ERROR, 0, 0, 0);
	return EXIT_SUCCESS;
}
Esempio n. 4
0
//Service Main process thread
DWORD WINAPI ServiceProc(
	PVOID lpParameter)
{
	if (!IsServiceRunning || !MonitorInit())
	{
		TerminateService();
		return FALSE;
	}

	TerminateService();
	return EXIT_SUCCESS;
}
Esempio n. 5
0
//Service Main process thread
DWORD WINAPI ServiceProc(LPVOID lpParameter)
{
	if (!bServiceRunning || MonitorInitialization() == EXIT_FAILURE)
	{
		WSACleanup();
		TerminateService();
		return FALSE;
	}

	WSACleanup();
	TerminateService();
	return EXIT_SUCCESS;
}
Esempio n. 6
0
//Service Main process thread
DWORD WINAPI ServiceProc(
	_In_ PVOID lpParameter)
{
	if (!IsServiceRunning || !MonitorInit())
	{
		WSACleanup();
		TerminateService();
		return FALSE;
	}

	WSACleanup();
	TerminateService();
	return EXIT_SUCCESS;
}
Esempio n. 7
0
//Change status of service
BOOL WINAPI UpdateServiceStatus(
	_In_ const DWORD dwCurrentState, 
	_In_ const DWORD dwWin32ExitCode, 
	_In_ const DWORD dwServiceSpecificExitCode, 
	_In_ const DWORD dwCheckPoint, 
	_In_ const DWORD dwWaitHint)
{
	std::shared_ptr<SERVICE_STATUS> ServiceStatus(new SERVICE_STATUS());
	memset(ServiceStatus.get(), 0, sizeof(SERVICE_STATUS));
	ServiceStatus->dwServiceType = SERVICE_WIN32;
	ServiceStatus->dwCurrentState = dwCurrentState;

	if (dwCurrentState == SERVICE_START_PENDING)
		ServiceStatus->dwControlsAccepted = 0;
	else 
		ServiceStatus->dwControlsAccepted = (SERVICE_ACCEPT_STOP|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;

	if (!SetServiceStatus(ServiceStatusHandle, ServiceStatus.get()))
	{
		WSACleanup();
		TerminateService();
		return FALSE;
	}

	return TRUE;
}
Esempio n. 8
0
//Change status of service
BOOL __stdcall UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD dwWaitHint)
{
	SERVICE_STATUS ServiceStatus = {0};
	ServiceStatus.dwServiceType = SERVICE_WIN32;
	ServiceStatus.dwCurrentState = dwCurrentState;

	if (dwCurrentState == SERVICE_START_PENDING)
		ServiceStatus.dwControlsAccepted = 0;
	else
		ServiceStatus.dwControlsAccepted = (SERVICE_ACCEPT_STOP | 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;

	if(!SetServiceStatus(hServiceStatus, &ServiceStatus))
	{
		WSACleanup();
		TerminateService();
		return FALSE;
 	}

	return TRUE;
}
Esempio n. 9
0
//Change status of service
BOOL WINAPI UpdateServiceStatus(
	const DWORD dwCurrentState, 
	const DWORD dwWin32ExitCode, 
	const DWORD dwServiceSpecificExitCode, 
	const DWORD dwCheckPoint, 
	const DWORD dwWaitHint)
{
	SERVICE_STATUS ServiceStatus;
	memset(&ServiceStatus, 0, sizeof(ServiceStatus));
	ServiceStatus.dwServiceType = SERVICE_WIN32;
	ServiceStatus.dwCurrentState = dwCurrentState;

	if (dwCurrentState == SERVICE_START_PENDING)
		ServiceStatus.dwControlsAccepted = 0;
	else 
		ServiceStatus.dwControlsAccepted = (SERVICE_ACCEPT_STOP|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;

	if (!SetServiceStatus(ServiceStatusHandle, &ServiceStatus))
	{
		TerminateService();
		return FALSE;
	}

	return TRUE;
}
//AlternateSwapTable class constructor
AlternateSwapTable::AlternateSwapTable(void)
{
	memset(this, 0, sizeof(AlternateSwapTable));
	try {
		PcapAlternateTimeout = new size_t[QUEUE_MAXLEN * QUEUE_PARTNUM]();
	}
	catch (std::bad_alloc)
	{
		WSACleanup();
		TerminateService();
		return;
	}

	return;
}
//PortTable class constructor
PortTable::PortTable(void)
{
	memset((PSTR)this + sizeof(SendData), 0, sizeof(PortTable) - sizeof(SendData));
	RecvData = nullptr;
	try {
		RecvData = new SOCKET_DATA[QUEUE_MAXLEN * QUEUE_PARTNUM]();
	}
	catch (std::bad_alloc)
	{
		WSACleanup();
		TerminateService();
		return;
	}

	return;
}
//Configuration class constructor
Configuration::Configuration(void)
{
	memset(this, 0, sizeof(Configuration));
	DomainTestOptions.DomainTest = nullptr, PaddingDataOptions.PaddingData = nullptr, LocalhostServerOptions.LocalhostServer = nullptr;
	try {
		DomainTestOptions.DomainTest = DomainTestOptions.DomainTest = new char[DOMAIN_MAXSIZE]();
		PaddingDataOptions.PaddingData = new char[ICMP_PADDING_MAXSIZE](); 
		LocalhostServerOptions.LocalhostServer = new char[DOMAIN_MAXSIZE]();
	}
	catch (std::bad_alloc)
	{
		delete[] DomainTestOptions.DomainTest;
		delete[] PaddingDataOptions.PaddingData;
		delete[] LocalhostServerOptions.LocalhostServer;

		WSACleanup();
		TerminateService();
		return;
	}

	return;
}
//DNSCurveConfiguration class constructor
DNSCurveConfiguration::DNSCurveConfiguration(void)
{
	memset(this, 0, sizeof(DNSCurveConfiguration));
	DNSCurveTarget.IPv4_ProviderName = nullptr, DNSCurveTarget.Alternate_IPv4_ProviderName = nullptr, DNSCurveTarget.IPv6_ProviderName = nullptr, DNSCurveTarget.Alternate_IPv6_ProviderName = nullptr;
	DNSCurveKey.Client_PublicKey = nullptr, DNSCurveKey.Client_SecretKey = nullptr;
	DNSCurveKey.IPv4_PrecomputationKey = nullptr, DNSCurveKey.Alternate_IPv4_PrecomputationKey = nullptr, DNSCurveKey.IPv6_PrecomputationKey = nullptr, DNSCurveKey.Alternate_IPv6_PrecomputationKey = nullptr;
	DNSCurveKey.IPv4_ServerPublicKey = nullptr, DNSCurveKey.Alternate_IPv4_ServerPublicKey = nullptr, DNSCurveKey.IPv6_ServerPublicKey = nullptr, DNSCurveKey.Alternate_IPv6_ServerPublicKey = nullptr;
	DNSCurveKey.IPv4_ServerFingerprint = nullptr, DNSCurveKey.Alternate_IPv4_ServerFingerprint = nullptr, DNSCurveKey.IPv6_ServerFingerprint = nullptr, DNSCurveKey.Alternate_IPv6_ServerFingerprint = nullptr;
	DNSCurveMagicNumber.IPv4_MagicNumber = nullptr, DNSCurveMagicNumber.Alternate_IPv4_MagicNumber = nullptr, DNSCurveMagicNumber.IPv6_MagicNumber = nullptr, DNSCurveMagicNumber.Alternate_IPv6_MagicNumber = nullptr;
	DNSCurveMagicNumber.IPv4_ReceiveMagicNumber = nullptr, DNSCurveMagicNumber.Alternate_IPv4_ReceiveMagicNumber = nullptr, DNSCurveMagicNumber.IPv6_ReceiveMagicNumber = nullptr, DNSCurveMagicNumber.Alternate_IPv6_ReceiveMagicNumber = nullptr;
	try {
	//DNSCurve Provider Names
		DNSCurveTarget.IPv4_ProviderName = new char[DOMAIN_MAXSIZE]();
		DNSCurveTarget.Alternate_IPv4_ProviderName = new char[DOMAIN_MAXSIZE]();
		DNSCurveTarget.IPv6_ProviderName = new char[DOMAIN_MAXSIZE]();
		DNSCurveTarget.Alternate_IPv6_ProviderName = new char[DOMAIN_MAXSIZE]();
	//DNSCurve Keys
		DNSCurveKey.Client_PublicKey = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.Client_SecretKey = new uint8_t[crypto_box_SECRETKEYBYTES]();
		DNSCurveKey.IPv4_PrecomputationKey = new uint8_t[crypto_box_BEFORENMBYTES]();
		DNSCurveKey.Alternate_IPv4_PrecomputationKey = new uint8_t[crypto_box_BEFORENMBYTES]();
		DNSCurveKey.IPv6_PrecomputationKey = new uint8_t[crypto_box_BEFORENMBYTES]();
		DNSCurveKey.Alternate_IPv6_PrecomputationKey = new uint8_t[crypto_box_BEFORENMBYTES]();
		DNSCurveKey.IPv4_ServerPublicKey = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.Alternate_IPv4_ServerPublicKey = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.IPv6_ServerPublicKey = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.Alternate_IPv6_ServerPublicKey = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.IPv4_ServerFingerprint = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.Alternate_IPv4_ServerFingerprint = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.IPv6_ServerFingerprint = new uint8_t[crypto_box_PUBLICKEYBYTES]();
		DNSCurveKey.Alternate_IPv6_ServerFingerprint = new uint8_t[crypto_box_PUBLICKEYBYTES]();
	//DNSCurve Magic Numbers
		DNSCurveMagicNumber.IPv4_ReceiveMagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
		DNSCurveMagicNumber.Alternate_IPv4_ReceiveMagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
		DNSCurveMagicNumber.IPv6_ReceiveMagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
		DNSCurveMagicNumber.Alternate_IPv6_ReceiveMagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
		DNSCurveMagicNumber.IPv4_MagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
		DNSCurveMagicNumber.Alternate_IPv4_MagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
		DNSCurveMagicNumber.IPv6_MagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
		DNSCurveMagicNumber.Alternate_IPv6_MagicNumber = new char[DNSCURVE_MAGIC_QUERY_LEN]();
	}
	catch (std::bad_alloc)
	{
	//DNSCurve Provider Names
		delete[] DNSCurveTarget.IPv4_ProviderName;
		delete[] DNSCurveTarget.Alternate_IPv4_ProviderName;
		delete[] DNSCurveTarget.IPv6_ProviderName;
		delete[] DNSCurveTarget.Alternate_IPv6_ProviderName;
	//DNSCurve Keys
		delete[] DNSCurveKey.Client_PublicKey;
		delete[] DNSCurveKey.Client_SecretKey;
		delete[] DNSCurveKey.IPv4_PrecomputationKey;
		delete[] DNSCurveKey.Alternate_IPv4_PrecomputationKey;
		delete[] DNSCurveKey.IPv6_PrecomputationKey;
		delete[] DNSCurveKey.Alternate_IPv6_PrecomputationKey;
		delete[] DNSCurveKey.IPv4_ServerPublicKey;
		delete[] DNSCurveKey.Alternate_IPv4_ServerPublicKey;
		delete[] DNSCurveKey.IPv6_ServerPublicKey;
		delete[] DNSCurveKey.Alternate_IPv6_ServerPublicKey;
		delete[] DNSCurveKey.IPv4_ServerFingerprint;
		delete[] DNSCurveKey.Alternate_IPv4_ServerFingerprint;
		delete[] DNSCurveKey.IPv6_ServerFingerprint;
		delete[] DNSCurveKey.Alternate_IPv6_ServerFingerprint;
	//DNSCurve Magic Numbers
		delete[] DNSCurveMagicNumber.IPv4_ReceiveMagicNumber;
		delete[] DNSCurveMagicNumber.Alternate_IPv4_ReceiveMagicNumber;
		delete[] DNSCurveMagicNumber.IPv6_ReceiveMagicNumber;
		delete[] DNSCurveMagicNumber.Alternate_IPv6_ReceiveMagicNumber;
		delete[] DNSCurveMagicNumber.IPv4_MagicNumber;
		delete[] DNSCurveMagicNumber.Alternate_IPv4_MagicNumber;
		delete[] DNSCurveMagicNumber.IPv6_MagicNumber;
		delete[] DNSCurveMagicNumber.Alternate_IPv6_MagicNumber;

		WSACleanup();
		TerminateService();
		return;
	}

	return;
}