Пример #1
0
LPKERNELEX_API BOOL WINAPI LPR_InitEx( int  nChannel )
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_InitEx pFN = ( PLPR_InitEx ) GetFunctionPointer( "LPR_InitEx" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	static BOOL bInitialize = FALSE;

	if ( !bInitialize ) {
		bInitialize = TRUE;
		nChannel = 1;
		bRet = pFN( nChannel );
	} else {
		bRet = TRUE;
	}

	return bRet;
}
Пример #2
0
LPKERNELEX_API BOOL WINAPI LPR_SetSpecialParameters(BOOL bNight,		
		int nImageplateThr, 
		int nImageRecogThr,
		int nPlatesNum,
		char *LocalProvince,
		int nChannel)
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_SetSpecialParameters pFN = ( PLPR_SetSpecialParameters ) GetFunctionPointer( "LPR_SetSpecialParameters" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	nChannel = 1;
	bRet = pFN( bNight,		
						nImageplateThr, 
						nImageRecogThr,
						nPlatesNum,
						LocalProvince,
						nChannel );

	return bRet;
}
Пример #3
0
// COM Support function: Can DLL be unloaded now
STDAPI DllCanUnloadNow(void)
{
    fnDllCanUnloadNow fpDllCanUnloadNow = NULL;
    HRESULT hr = GetFunctionPointer(STR_DLLCANUNLOADNOW, (FARPROC*)&fpDllCanUnloadNow);
    if (hr == S_OK)
    {
        hr = fpDllCanUnloadNow();
    }
    return hr;
}
Пример #4
0
// COM Support function: Unregister the provider
STDAPI DllUnregisterServer(void)
{
    fnUnRegisterDLL fpUnRegisterDLL = NULL;
    HRESULT hr = GetFunctionPointer(STR_UNREGISTERDLL, (FARPROC*)&fpUnRegisterDLL);
    if (hr == S_OK)
    {
        hr = fpUnRegisterDLL(g_providerClassID);
    }
    return hr;
}
Пример #5
0
// COM Support function: Get the class object
_Check_return_
STDAPI DllGetClassObject(_In_ REFCLSID rclsid,
                         _In_ REFIID riid,
                         _Outptr_ LPVOID * ppv)
{
    fnDllGetClassObject fpDllGetClassObject = NULL;
    HRESULT hr = GetFunctionPointer(STR_DLLGETCLASSOBJECT, (FARPROC*)&fpDllGetClassObject);
    if (SUCCEEDED(hr))
    {
        hr = fpDllGetClassObject(g_providerClassID, MI_Main, rclsid, riid, ppv);
    }

    return hr;
}
Пример #6
0
//GlobalStatus class constructor settings
void __fastcall GlobalStatusSetting(
	GlobalStatus *GlobalRunningStatusParameter)
{
#if defined(PLATFORM_LINUX)
	GlobalRunningStatusParameter->Daemon = true;
#endif
	std::random_device RamdomDevice;
	GlobalRunningStatusParameter->RamdomEngine->seed(RamdomDevice());
	memset(GlobalRunningStatusParameter->DomainTable, 0, strlen(RFC_DOMAIN_TABLE) + 1U);
	strncpy_s(GlobalRunningStatusParameter->DomainTable, strlen(RFC_DOMAIN_TABLE) + 1U, RFC_DOMAIN_TABLE, strlen(RFC_DOMAIN_TABLE));
	GlobalRunningStatusParameter->GatewayAvailable_IPv4 = true;
	memset(GlobalRunningStatusParameter->LocalAddress_Response[0], 0, PACKET_MAXSIZE);
	memset(GlobalRunningStatusParameter->LocalAddress_Response[1U], 0, PACKET_MAXSIZE);

//Windows XP with SP3 support
#if (defined(PLATFORM_WIN32) && !defined(PLATFORM_WIN64))
	GetFunctionPointer(FUNCTION_GETTICKCOUNT64);
	GetFunctionPointer(FUNCTION_INET_NTOP);
	GetFunctionPointer(FUNCTION_INET_PTON);
#endif

	return;
}
Пример #7
0
// COM Support function: Get the class object
STDAPI DllGetClassObject(_In_ REFCLSID rclsid,
                         _In_ REFIID riid,
                         _Outptr_result_maybenull_ LPVOID * ppv)
{
    fnDllGetClassObject fpDllGetClassObject = NULL;
    HRESULT hr = GetFunctionPointer(STR_DLLGETCLASSOBJECT, (FARPROC*)&fpDllGetClassObject);
    if (hr == S_OK)
    {
        hr = fpDllGetClassObject(g_providerClassID, MI_Main, rclsid, riid, ppv);
    }
    else
    {
        *ppv = NULL;
    }
    return hr;
}
Пример #8
0
LPKERNELEX_API BOOL WINAPI LPR_SetParameters( BOOL bMovingImage,
																				int nPlatesNum,
																				BOOL bFlipVertical, 
																				int nColorOrder,
																				BOOL bVertCompress,
																				int nImageplateThr, int nImageRecogThr, 
																				int nMinPlateWidth, int nMaxPlateWidth, 
																				char *LocalProvince,
																				BOOL bDwordAligned,
																				BOOL bInputHalfHeightImage,    												   
																				BOOL bOutputSingleFrame,
																				BOOL bYellow2, BOOL bIndivi, BOOL bArmPol, BOOL bArmy2, BOOL bTractor, 
																				BOOL bNight, 	
																				int nChannel )
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_SetParameters pFN = ( PLPR_SetParameters ) GetFunctionPointer( "LPR_SetParameters" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	nChannel = 1;
	bRet = pFN( bMovingImage,
						nPlatesNum,
						bFlipVertical, 
						nColorOrder,
						bVertCompress,
						nImageplateThr, nImageRecogThr, 
						nMinPlateWidth, nMaxPlateWidth, 
						LocalProvince,
						bDwordAligned,
						bInputHalfHeightImage,    												   
						bOutputSingleFrame,
						bYellow2, bIndivi, bArmPol, bArmy2, bTractor, 
						bNight, 	
						nChannel );

	return bRet;
}
Пример #9
0
LPKERNELEX_API BOOL WINAPI LPR_FileEx( char* lpszFileName, char *lpszPlateFile, TH_PlateResult* pResult, int &nRecogNum, TH_RECT *prcRange, int nChannel )
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_FileEx pFN = ( PLPR_FileEx ) GetFunctionPointer( "LPR_FileEx" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	nChannel = 1;
	bRet = pFN( lpszFileName, lpszPlateFile, pResult, nRecogNum, prcRange, nChannel );

	return bRet;
}
Пример #10
0
LPKERNELEX_API BOOL WINAPI LPR_GetImageBuf(unsigned char *&pImageBuf, int &nWidth, int &nHeight, int &nSize, int  nChannel)
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_GetImageBuf pFN = ( PLPR_GetImageBuf ) GetFunctionPointer( "LPR_GetImageBuf" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	nChannel = 1;
	bRet = pFN( pImageBuf, nWidth, nHeight, nSize, nChannel );

	return bRet;
}
Пример #11
0
LPKERNELEX_API BOOL WINAPI LPR_SetImageFormat(BOOL bMovingImage,		
		BOOL bFlipVertical, 
		int nColorOrder,
		BOOL bVertCompress, 
		int nMinPlateWidth, 
		int nMaxPlateWidth, 
		BOOL bDwordAligned,
		BOOL bInputHalfHeightImage,    												   
		BOOL bOutputSingleFrame,	
		int nChannel )
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_SetImageFormat pFN = ( PLPR_SetImageFormat ) GetFunctionPointer( "LPR_SetImageFormat" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	nChannel = 1;
	bRet = pFN( bMovingImage,		
						bFlipVertical, 
						nColorOrder,
						bVertCompress, 
						nMinPlateWidth, 
						nMaxPlateWidth, 
						bDwordAligned,
						bInputHalfHeightImage,    												   
						bOutputSingleFrame,	
						nChannel );

	return bRet;
}
Пример #12
0
LPKERNELEX_API BOOL WINAPI LPR_RGB888Ex(unsigned char *pImg, int nWidth, int  nHeight, TH_PlateResult* pResult, int &nRecogNum, TH_RECT *prcRange, int  nChannel)
{
	#pragma EXPORT

	//return FALSE; // Not supprot video stream

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_RGB888Ex pFN = ( PLPR_RGB888Ex ) GetFunctionPointer( "LPR_RGB888Ex" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	bRet = pFN( pImg, nWidth, nHeight, pResult, nRecogNum, prcRange, nChannel );

	return bRet;
}
Пример #13
0
LPKERNELEX_API BOOL WINAPI LPR_SetPlateType(BOOL bYellow2, 
		BOOL bIndivi,
		BOOL bArmPol, 
		BOOL bArmy2,
		BOOL bTractor,
		BOOL bOnlyDyellow,
		BOOL bEmbassy,
		BOOL bDarmpolice,
		BOOL bOnlyLocation,
		int  nChannel )
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return FALSE;
	}

	static PLPR_SetPlateType pFN = ( PLPR_SetPlateType ) GetFunctionPointer( "LPR_SetPlateType" );

	if ( NULL == pFN ) {
		return FALSE;
	}

	nChannel = 1;
	bRet = pFN( bYellow2, 
						bIndivi,
						bArmPol, 
						bArmy2,
						bTractor,
						bOnlyDyellow,
						bEmbassy,
						bDarmpolice,
						bOnlyLocation,
						nChannel );

	return bRet;
}
Пример #14
0
LPKERNELEX_API void WINAPI LPR_UninitEx( int  nChannel )
{
	#pragma EXPORT

	BOOL bRet = ValidateChannel( nChannel );

	if ( !bRet ) {
		return;
	}

	static PLPR_UninitEx pFN = ( PLPR_UninitEx ) GetFunctionPointer( "LPR_UninitEx" );

	if ( NULL == pFN ) {
		return;
	}

	static BOOL bUninitialize = FALSE;

	if ( !bUninitialize ) {
		bUninitialize = TRUE;
		nChannel = 1;
		pFN( nChannel );
	}
}
Пример #15
0
int wmain(int argc, wchar_t* argv[])
{
//Windows XP with SP3 support
	#if (defined(PLATFORM_WIN32) && !defined(PLATFORM_WIN64))
		GetFunctionPointer(FUNCTION_GETTICKCOUNT64);
		GetFunctionPointer(FUNCTION_INET_NTOP);
	#endif
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
int main(int argc, char *argv[])
{
#endif

//Get commands.
	if (argc > 0)
	{
		if (!ReadCommand(argc, argv))
			return EXIT_SUCCESS;
	}
	else {
		return EXIT_FAILURE;
	}

//Read configuration file and WinPcap or LibPcap initialization.
	if (!ReadParameter())
	{
		WSACleanup();
		return EXIT_FAILURE;
	}

//Mark Local DNS address to PTR Records.
	std::thread NetworkInformationMonitorThread(NetworkInformationMonitor);
	NetworkInformationMonitorThread.detach();

//Read IPFilter and Hosts.
	if (Parameter.OperationMode == LISTEN_MODE_CUSTOM || Parameter.BlacklistCheck || Parameter.LocalRouting)
	{
		std::thread IPFilterThread(ReadIPFilter);
		IPFilterThread.detach();
	}

	std::thread HostsThread(ReadHosts);
	HostsThread.detach();

//DNSCurve initialization
#if defined(ENABLE_LIBSODIUM)
	if (Parameter.DNSCurve && DNSCurveParameter.IsEncryption)
	{
		randombytes_set_implementation(&randombytes_salsa20_implementation);
		randombytes_stir();
		DNSCurveInit();
	}
#endif

#if defined(PLATFORM_WIN)
//Service initialization and start service.
	SERVICE_TABLE_ENTRYW ServiceTable[] = {{DEFAULT_LOCAL_SERVICE_NAME, (LPSERVICE_MAIN_FUNCTIONW)ServiceMain}, {nullptr, nullptr}};
	if (!StartServiceCtrlDispatcherW(ServiceTable))
	{
		Parameter.Console = true;
		wprintf_s(L"System Error: Service start error, error code is %lu.\n", GetLastError());
		wprintf_s(L"System Error: Program will continue to run in console mode.\n");
		wprintf_s(L"Please ignore those error messages if you want to run in console mode.\n");

	//Handle the system signal and start all monitors.
		SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
		MonitorInit();
	}

#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	MonitorInit();
#endif

	WSACleanup();
	return EXIT_SUCCESS;
}

//Read commands from main program
#if defined(PLATFORM_WIN)
bool __fastcall ReadCommand(int argc, wchar_t* argv[])
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
bool ReadCommand(int argc, char *argv[])
#endif
{
//Path initialization
#if defined(PLATFORM_WIN)
	if (!FileNameInit(argv[0]))
		return false;
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	std::shared_ptr<char> FileName(new char[PATH_MAX + 1U]());
	memset(FileName.get(), 0, PATH_MAX + 1U);
	if (getcwd(FileName.get(), PATH_MAX) == nullptr)
	{
		wprintf(L"Path initialization error.\n");
		return false;
	}
	if (!FileNameInit(FileName.get()))
		return false;
	FileName.reset();
#endif

#if defined(PLATFORM_WIN)
//Winsock initialization
	std::shared_ptr<WSAData> WSAInitialization(new WSAData());
	if (WSAStartup(MAKEWORD(WINSOCK_VERSION_HIGH, WINSOCK_VERSION_LOW), WSAInitialization.get()) != 0 ||
		LOBYTE(WSAInitialization->wVersion) != WINSOCK_VERSION_LOW || HIBYTE(WSAInitialization->wVersion) != WINSOCK_VERSION_HIGH)
	{
		wprintf_s(L"Winsock initialization error, error code is %d.\n", WSAGetLastError());
		PrintError(LOG_ERROR_NETWORK, L"Winsock initialization error", WSAGetLastError(), nullptr, 0);

		WSACleanup();
		return false;
	}

//Read commands.
	std::wstring Commands;
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	std::string Commands;
#endif
	for (size_t Index = 1U;(SSIZE_T)Index < argc;++Index)
	{
		Commands = argv[Index];

	//Flush DNS Cache from user.
		if (Commands == COMMAND_FLUSH_DNS)
		{
		#if defined(PLATFORM_WIN)
			FlushDNSMailSlotSender();
		#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
			FlushDNSFIFOSender();
		#endif

			WSACleanup();
			return false;
		}
	//Windows Firewall Test in first start.
	#if defined(PLATFORM_WIN)
		else if (Commands == COMMAND_FIREWALL_TEST)
		{
			if (!FirewallTest(AF_INET6) && !FirewallTest(AF_INET))
			{
				wprintf_s(L"Windows Firewall Test error.\n");
				PrintError(LOG_ERROR_NETWORK, L"Windows Firewall Test error", WSAGetLastError(), nullptr, 0);
			}

			WSACleanup();
			return false;
		}
	#endif
	//Set system daemon.
	#if defined(PLATFORM_LINUX)
		else if (Commands == COMMAND_DISABLE_DAEMON)
		{
			Parameter.Daemon = false;
		}
	#endif
	//Print current version.
		else if (Commands == COMMAND_LONG_PRINT_VERSION || Commands == COMMAND_SHORT_PRINT_VERSION)
		{
			wprintf_s(L"Pcap_DNSProxy ");
			wprintf_s(FULL_VERSION);
			wprintf_s(L"\n");

			WSACleanup();
			return false;
		}
	//Print help messages.
		else if (Commands == COMMAND_LONG_HELP || Commands == COMMAND_SHORT_HELP)
		{
			wprintf_s(L"Usage: Please see ReadMe... files in Documents folder.\n");

			WSACleanup();
			return false;
		}
	//Set working directory from commands.
		else if (Commands == COMMAND_LONG_SET_PATH || Commands == COMMAND_SHORT_SET_PATH)
		{
		//Commands check
			if ((SSIZE_T)Index + 1 >= argc)
			{
				wprintf_s(L"Commands error.\n");
				PrintError(LOG_ERROR_SYSTEM, L"Commands error", 0, nullptr, 0);

				WSACleanup();
				return false;
			}
			else {
				++Index;
				Commands = argv[Index];

			//Path check.
				if (Commands.length() > MAX_PATH)
				{
					wprintf_s(L"Commands error.\n");
					PrintError(LOG_ERROR_SYSTEM, L"Commands error", 0, nullptr, 0);

					WSACleanup();
					return false;
				}
				else {
					if (!FileNameInit(Commands.c_str()))
						return false;
				}
			}
		}
	}

//Set system daemon.
#if defined(PLATFORM_LINUX)
	if (Parameter.Daemon && daemon(0, 0) == RETURN_ERROR)
	{
		PrintError(LOG_ERROR_SYSTEM, L"Set system daemon error", 0, nullptr, 0);
		return false;
	}
#endif

	return true;
}

//Get path of program from the main function parameter and Winsock initialization
#if defined(PLATFORM_WIN)
bool __fastcall FileNameInit(const wchar_t *OriginalPath)
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
bool FileNameInit(const char *OriginalPath)
#endif
{
//Path process
#if defined(PLATFORM_WIN)
	Parameter.Path_Global->clear();
	Parameter.Path_Global->push_back(OriginalPath);
	Parameter.Path_Global->front().erase(Parameter.Path_Global->front().rfind(L"\\") + 1U);
	for (size_t Index = 0;Index < Parameter.Path_Global->front().length();++Index)
	{
		if ((Parameter.Path_Global->front()).at(Index) == L'\\')
		{
			Parameter.Path_Global->front().insert(Index, L"\\");
			++Index;
		}
	}
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	Parameter.sPath_Global->clear();
	Parameter.sPath_Global->push_back(OriginalPath);
	Parameter.sPath_Global->front().append("/");
	std::wstring StringTemp;
	MBSToWCSString(StringTemp, OriginalPath);
	StringTemp.append(L"/");
	Parameter.Path_Global->clear();
	Parameter.Path_Global->push_back(StringTemp);
	StringTemp.clear();
#endif

//Get path of error/running status log file and mark start time.
	Parameter.Path_ErrorLog->clear();
	*Parameter.Path_ErrorLog = Parameter.Path_Global->front();
	Parameter.Path_ErrorLog->append(L"Error.log");
#if (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	Parameter.sPath_ErrorLog->clear();
	*Parameter.sPath_ErrorLog = Parameter.sPath_Global->front();
	Parameter.sPath_ErrorLog->append("Error.log");
#endif
	Parameter.PrintError = true;
	time(&StartTime);

	return true;
}
Пример #16
0
//Configuration class constructor
ConfigurationTable::ConfigurationTable(void)
{
	memset(this, 0, sizeof(CONFIGURATION_TABLE));
	try {
	//[Listen] block
		PcapDevicesBlacklist = new std::vector<std::string>();
		ListenPort = new std::vector<uint16_t>();
	//[Addresses] block
		ListenAddress_IPv6 = new std::vector<sockaddr_storage>();
		ListenAddress_IPv4 = new std::vector<sockaddr_storage>();
		LocalhostSubnet.IPv6 = new ADDRESS_PREFIX_BLOCK();
		LocalhostSubnet.IPv4 = new ADDRESS_PREFIX_BLOCK();
		DNSTarget.IPv6_Multi = new std::vector<DNS_SERVER_DATA>();
		DNSTarget.IPv4_Multi = new std::vector<DNS_SERVER_DATA>();
	//[Data] block(A part)
	#if defined(ENABLE_PCAP)
		ICMP_PaddingData = new char[ICMP_PADDING_MAXSIZE]();
		DomainTest_Data = new char[DOMAIN_MAXSIZE]();
	#endif
	//[Data] block(B part)
		LocalFQDN_Response = new char[DOMAIN_MAXSIZE]();
		LocalFQDN_String = new std::string();
	#if !defined(PLATFORM_MACX)
		LocalServer_Response = new char[DOMAIN_MAXSIZE + sizeof(dns_record_ptr) + sizeof(dns_record_opt)]();
	#endif
		LocalAddress_Response[0] = new char[PACKET_MAXSIZE]();
		LocalAddress_Response[1U] = new char[PACKET_MAXSIZE]();
	#if !defined(PLATFORM_MACX)
		LocalAddress_ResponsePTR[0] = new std::vector<std::string>();
		LocalAddress_ResponsePTR[1U] = new std::vector<std::string>();
	#endif
	//Global block
		LocalSocket = new std::vector<SYSTEM_SOCKET>();
		RamdomEngine = new std::default_random_engine();
		Path_Global = new std::vector<std::wstring>();
		Path_ErrorLog = new std::wstring();
		FileList_Hosts = new std::vector<std::wstring>();
		FileList_IPFilter = new std::vector<std::wstring>();
	#if (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
		sPath_Global = new std::vector<std::string>();
		sPath_ErrorLog = new std::string();
		sFileList_Hosts = new std::vector<std::string>();
		sFileList_IPFilter = new std::vector<std::string>();
	#endif
		DomainTable = new char[strlen(RFC_DOMAIN_TABLE) + 1U]();
		AcceptTypeList = new std::vector<uint16_t>();
	}
	catch (std::bad_alloc)
	{
	//[Listen] block
		delete PcapDevicesBlacklist;
		delete ListenPort;
	//[Addresses] block
		delete ListenAddress_IPv6;
		delete ListenAddress_IPv4;
		delete LocalhostSubnet.IPv6;
		delete LocalhostSubnet.IPv4;
		delete DNSTarget.IPv6_Multi;
		delete DNSTarget.IPv4_Multi;
	//[Data] block(A part)
	#if defined(ENABLE_PCAP)
		delete[] ICMP_PaddingData;
		delete[] DomainTest_Data;
	#endif
	//[Data] block(B part)
		delete[] LocalFQDN_Response;
		delete LocalFQDN_String;
	#if !defined(PLATFORM_MACX)
		delete[] LocalServer_Response;
	#endif
		delete[] LocalAddress_Response[0];
		delete[] LocalAddress_Response[1U];
	#if !defined(PLATFORM_MACX)
		delete LocalAddress_ResponsePTR[0];
		delete LocalAddress_ResponsePTR[1U];
	#endif
	//Global block
		delete LocalSocket;
		delete RamdomEngine;
		delete Path_Global;
		delete Path_ErrorLog;
		delete FileList_Hosts;
		delete FileList_IPFilter;
		delete[] DomainTable;
		delete AcceptTypeList;

		exit(EXIT_FAILURE);
		return;
	}

//Initialization
	BufferQueueSize = DEFAULT_BUFFER_QUEUE;
	//[Data] block(A part)
#if defined(ENABLE_PCAP)
	memset(ICMP_PaddingData, 0, ICMP_PADDING_MAXSIZE);
	memset(DomainTest_Data, 0, DOMAIN_MAXSIZE);
#endif
	//[Data] block(B part)
	memset(LocalFQDN_Response, 0, DOMAIN_MAXSIZE);
#if !defined(PLATFORM_MACX)
	memset(LocalServer_Response, 0, DOMAIN_MAXSIZE + sizeof(dns_record_ptr) + sizeof(dns_record_opt));
#endif
	memset(LocalAddress_Response[0], 0, PACKET_MAXSIZE);
	memset(LocalAddress_Response[1U], 0, PACKET_MAXSIZE);
	//Global block
	memset(DomainTable, 0, strlen(RFC_DOMAIN_TABLE) + 1U);

//Default settings
	strncpy_s(DomainTable, strlen(RFC_DOMAIN_TABLE) + 1U, RFC_DOMAIN_TABLE, strlen(RFC_DOMAIN_TABLE));
	std::random_device RamdomDevice;
	RamdomEngine->seed(RamdomDevice());

//Default values
	FileRefreshTime = DEFAULT_FILEREFRESH_TIME * SECOND_TO_MILLISECOND;
	LogMaxSize = DEFAULT_LOG_MAXSIZE;
	HostsDefaultTTL = DEFAULT_HOSTS_TTL;
	AlternateTimes = DEFAULT_ALTERNATE_TIMES;
	AlternateTimeRange = DEFAULT_ALTERNATE_RANGE * SECOND_TO_MILLISECOND;
	AlternateResetTime = DEFAULT_ALTERNATE_RESET_TIME * SECOND_TO_MILLISECOND;
#if defined(PLATFORM_WIN)
	SocketTimeout_Reliable = DEFAULT_RELIABLE_SOCKET_TIMEOUT;
	SocketTimeout_Unreliable = DEFAULT_UNRELIABLE_SOCKET_TIMEOUT;
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	SocketTimeout_Reliable.tv_sec = DEFAULT_RELIABLE_SOCKET_TIMEOUT;
	SocketTimeout_Unreliable.tv_sec = DEFAULT_UNRELIABLE_SOCKET_TIMEOUT;
#endif
#if defined(PLATFORM_LINUX)
	Daemon = true;
#endif
#if defined(ENABLE_PCAP)
	PcapReadingTimeout = DEFAULT_PCAP_CAPTURE_TIMEOUT;
	#if defined(PLATFORM_MACX)
		ICMP_ID = htons(*(uint16_t *)pthread_self());
	#else
		ICMP_ID = htons((uint16_t)GetCurrentProcessId()); //Default ICMP ID is current process ID.
	#endif
		ICMP_Sequence = htons(DEFAULT_SEQUENCE);
		DomainTest_Speed = DEFAULT_DOMAINTEST_INTERVAL_TIME * SECOND_TO_MILLISECOND;
	#if defined(PLATFORM_MACX)
		DomainTest_ID = htons(*(uint16_t *)pthread_self());
	#else
		DomainTest_ID = htons((uint16_t)GetCurrentProcessId()); //Default DNS ID is current process ID.
	#endif
	#if defined(PLATFORM_WIN)
		ICMP_PaddingLength = strlen(DEFAULT_PADDING_DATA) + 1U;
		memcpy_s(ICMP_PaddingData, ICMP_PADDING_MAXSIZE, DEFAULT_PADDING_DATA, Parameter.ICMP_PaddingLength - 1U); //Load default padding data.
	#elif defined(PLATFORM_LINUX)
		size_t CharData = ICMP_STRING_START_NUM_LINUX;
		for (size_t Index = 0;Index < ICMP_PADDING_LENGTH_LINUX;++Index, ++CharData)
			ICMP_PaddingData[Index] = CharData;
		ICMP_PaddingLength = strlen(ICMP_PaddingData) + 1U;
	#elif defined(PLATFORM_MACX)
		size_t CharData = ICMP_STRING_START_NUM_MAC;
		for (size_t Index = 0;Index < ICMP_PADDING_LENGTH_MAC;++Index, ++CharData)
			ICMP_PaddingData[Index] = CharData;
		ICMP_PaddingLength = strlen(ICMP_PaddingData) + 1U;
	#endif
#endif

//Default status
	GatewayAvailable_IPv4 = true;

//Windows XP with SP3 support
#if (defined(PLATFORM_WIN32) && !defined(PLATFORM_WIN64))
	GetFunctionPointer(FUNCTION_GETTICKCOUNT64);
	GetFunctionPointer(FUNCTION_INET_NTOP);
	GetFunctionPointer(FUNCTION_INET_PTON);
#endif

	return;
}