/* --------------- 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; }
//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; }
//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; }
//Service Main process thread DWORD WINAPI ServiceProc( PVOID lpParameter) { if (!IsServiceRunning || !MonitorInit()) { TerminateService(); return FALSE; } TerminateService(); return EXIT_SUCCESS; }
//Service Main process thread DWORD WINAPI ServiceProc(LPVOID lpParameter) { if (!bServiceRunning || MonitorInitialization() == EXIT_FAILURE) { WSACleanup(); TerminateService(); return FALSE; } WSACleanup(); TerminateService(); return EXIT_SUCCESS; }
//Service Main process thread DWORD WINAPI ServiceProc( _In_ PVOID lpParameter) { if (!IsServiceRunning || !MonitorInit()) { WSACleanup(); TerminateService(); return FALSE; } WSACleanup(); TerminateService(); return EXIT_SUCCESS; }
//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; }
//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; }
//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; }