Пример #1
0
//MailSlot of flush DNS cache sender
bool WINAPI FlushDNSMailSlotSender(
	void)
{
//Create mailslot.
	HANDLE hFile = CreateFileW(MAILSLOT_NAME, GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
		fwprintf_s(stderr, L"Create mailslot error, error code is %lu.\n", GetLastError());

		return false;
	}

//Write into mailslot.
	DWORD cbWritten = 0;
	if (!WriteFile(hFile, MAILSLOT_MESSAGE_FLUSH_DNS, (DWORD)(lstrlenW(MAILSLOT_MESSAGE_FLUSH_DNS) + 1U) * sizeof(wchar_t), &cbWritten, nullptr))
	{
		std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
		fwprintf_s(stderr, L"MailSlot write messages error, error code is %lu.\n", GetLastError());

		CloseHandle(hFile);
		return false;
	}

	CloseHandle(hFile);
	std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
	fwprintf_s(stderr, L"Flush DNS cache message was sent successfully.\n");
	return true;
}
Пример #2
0
//Catch Control-C exception from keyboard.
BOOL WINAPI CtrlHandler(
	const DWORD fdwCtrlType)
{
//Print to screen.
	if (GlobalRunningStatus.Console)
	{
		std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
		switch (fdwCtrlType)
		{
			case CTRL_C_EVENT: //Handle the CTRL-C signal.
			{
				fwprintf_s(stderr, L"Get Control-C.\n");
			}break;
			case CTRL_BREAK_EVENT: //Handle the CTRL-Break signal.
			{
				fwprintf_s(stderr, L"Get Control-Break.\n");
			}break;
			default: //Handle other signals.
			{
				fwprintf_s(stderr, L"Get closing signal.\n");
			}break;
		}
	}

	return FALSE;
}
Пример #3
0
void debug(const wchar_t* format, ...)
{
	wchar_t tmpbuf[128];
	time_t rawtime;
	struct tm timeinfo;
	va_list valist;

	if (!DEBUG && EXECUTE_FROM_GPE)
		return;

	time(&rawtime);
	localtime_s(&timeinfo, &rawtime);
	wcsftime(tmpbuf, 128, L"%Y-%m-%d %H:%M:%S ", &timeinfo);

	va_start(valist, format);
	if (!EXECUTE_FROM_GPE){
		fwprintf_s(stdout, L"%ls", tmpbuf);
		vfwprintf_s(stdout, format, valist);
	}
	if (debugfh != NULL && DEBUG) {
		fwprintf_s(debugfh, L"%ls", tmpbuf);
		vfwprintf_s(debugfh, format, valist);
		fflush(debugfh);
	}
	va_end(valist);
}
Пример #4
0
//SHA-1 hash function
bool __fastcall SHA1_Hash(
	FILE *Input)
{
//Parameters check
	if (HashFamilyID != HASH_ID_SHA1 || Input == nullptr)
	{
		fwprintf_s(stderr, L"Parameters error.\n");
		return false;
	}

//Initialization
	std::shared_ptr<char> Buffer(new char[FILE_BUFFER_SIZE]()), StringBuffer(new char[FILE_BUFFER_SIZE]());
	auto HashInstance = std::make_shared<SHA1_State>();
	memset(Buffer.get(), 0, FILE_BUFFER_SIZE);
	memset(StringBuffer.get(), 0, FILE_BUFFER_SIZE);
	memset(HashInstance.get(), 0, sizeof(SHA1_State));
	size_t ReadLength = 0;

//SHA-1 initialization
	SHA1_Init(HashInstance.get());

//Hash process
	while (!feof(Input))
	{
		memset(Buffer.get(), 0, FILE_BUFFER_SIZE);
		ReadLength = fread_s(Buffer.get(), FILE_BUFFER_SIZE, sizeof(char), FILE_BUFFER_SIZE, Input);
		if (ReadLength == 0 && errno == EINVAL)
		{
			fwprintf_s(stderr, L"Hash process error.\n");
			return false;
		}
		else {
			SHA1_Process(HashInstance.get(), (uint8_t *)Buffer.get(), (unsigned long)ReadLength);
		}
	}

//Binary to hex
	memset(Buffer.get(), 0, FILE_BUFFER_SIZE);
	SHA1_Done(HashInstance.get(), (uint8_t *)Buffer.get());
	if (sodium_bin2hex(StringBuffer.get(), FILE_BUFFER_SIZE, (const unsigned char *)Buffer.get(), SHA1_SIZE_DIGEST) == nullptr)
	{
		fwprintf_s(stderr, L"Convert binary to hex error.\n");
		return false;
	}
	else {
	//Print to screen.
		std::string HashResult = StringBuffer.get();
		CaseConvert(true, HashResult);
		for (size_t Index = 0;Index < HashResult.length();++Index)
			fwprintf_s(stderr, L"%c", HashResult.c_str()[Index]);
		fwprintf_s(stderr, L"\n");
	}

	return true;
}
Пример #5
0
void saveOptions()
{
	FILE* optionsFile = getOptionsFile(L"w");

	if (optionsFile)
	{
		fwprintf_s(optionsFile, L"%s,%hhu\n", reqFSOptionName, reqFullscreen);
		fwprintf_s(optionsFile, L"%s,%i\n", soundOptionName, soundOption);
		fclose(optionsFile);
	}
}
Пример #6
0
//Catch system signal
BOOL WINAPI SignalHandler(
	const DWORD SignalType)
{
//Print to screen.
	switch (SignalType)
	{
	//Handle the CTRL-C signal.
		case CTRL_C_EVENT:
		{
			fwprintf_s(stderr, L"[Notice] Get Control-C.\n");
			PrintProcess(true, true);
		}break;
	//Handle the CTRL-Break signal.
		case CTRL_BREAK_EVENT:
		{
			fwprintf_s(stderr, L"[Notice] Get Control-Break.\n");
			PrintProcess(true, true);

		//Exit process.
			return TRUE;
		}break;
	//Handle other signals.
		default:
		{
			fwprintf_s(stderr, L"[Notice] Get closing signal.\n");
			PrintProcess(true, true);
		}
	}

//Close file handle.
	if (ConfigurationParameter.OutputFile != nullptr)
	{
		fclose(ConfigurationParameter.OutputFile);
		ConfigurationParameter.OutputFile = nullptr;
	}

//Close all file handles and WinSock cleanup.
#if defined(PLATFORM_WIN)
	if (ConfigurationParameter.IsInitialized_WinSock)
	{
		WSACleanup();
		ConfigurationParameter.IsInitialized_WinSock = false;
	}

	_fcloseall();
#elif (defined(PLATFORM_FREEBSD) || (defined(PLATFORM_LINUX) && !defined(PLATFORM_OPENWRT)))
	fcloseall();
#endif

//Exit process.
//	exit(EXIT_SUCCESS);
	return FALSE;
}
Пример #7
0
void left_print_string(FILE * fp, wchar_t * s, wchar_t * t) {
/* prints s then prints the last |t|-|s| characters of t.
   if s is longer than t, it truncates s.
*/
    int i, j, k;
    j = wcslen(t);
    k = wcslen(s);
    for (i=0; i<j; i++) {
	if (i<k) {
	    fwprintf_s(fp, L"%c", s[i]);
	} else {
	    fwprintf_s(fp, L"%c", t[i]);
	}
    }
}
Пример #8
0
int logLoadResources()
{
	int iReturnCode = DIAGLIB_OK;
		
	if(g_pfile)  return DIAGLIB_OK;
	
	if(g_wsLogFile.empty()) logInit(NULL);
	
	errno_t err = 0;
	
	//Create the file (Erase previous file)
	for(int i=0;i<LOG_OPEN_ATTEMPT_COUNT;i++)
	{
		err = _wfopen_s(&g_pfile, g_wsLogFile.c_str(), (g_logFirstOpen?L"w":L"a"));
		
		if (g_pfile)
		{
			break;
		}
		else if( err == ENOENT ) //Folder does not exist
		{
			g_logAvailable = false;
			return DIAGLIB_ERR_NOT_AVAILABLE;
		}
		else
		{
			Sleep(50);
		}
	}
	
	if(g_pfile && g_logFirstOpen)
	{
#ifdef WIN32
		fwprintf_s(g_pfile,L"RUNNING DIAGLIB VERSION: %hs\n",diaglibVersion());
#elif __APPLE__
		fwprintf_s(g_pfile,L"RUNNING DIAGLIB VERSION: %s\n",diaglibVersion());
#endif	
	}
	
	g_logFirstOpen = false;
	
	if (!g_pfile)
	{
		return DIAGLIB_ERR_FILE_CREATE_FAILED;
	}
	
	return iReturnCode;
}
Пример #9
0
//Flush DNS cache
void __fastcall FlushAllDNSCache(
	void)
{
//Flush DNS cache in program.
	std::unique_lock<std::mutex> DNSCacheListMutex(DNSCacheListLock);
	DNSCacheList.clear();
	DNSCacheList.shrink_to_fit();
	DNSCacheListMutex.unlock();

//Flush DNS cache in system.
	std::unique_lock<std::mutex> ScreenMutex(ScreenLock);

#if defined(PLATFORM_WIN)
	system("ipconfig /flushdns 2>nul"); //All Windows version
	fwprintf_s(stderr, L"\n");
#elif defined(PLATFORM_LINUX)
	#if defined(PLATFORM_OPENWRT)
		system("/etc/init.d/dnsmasq restart 2>/dev/null"); //Dnsmasq manage DNS cache on OpenWrt
	#else
		auto Result = system("service nscd restart 2>/dev/null"); //Name Service Cache Daemon service
		Result = system("service dnsmasq restart 2>/dev/null"); //Dnsmasq service
		Result = system("rndc restart 2>/dev/null"); //Name server control utility of BIND(9.1.3 and older version)
		Result = system("rndc flush 2>/dev/null"); //Name server control utility of BIND(9.2.0 and newer version)
	#endif
#elif defined(PLATFORM_MACX)
//	system("lookupd -flushcache 2>/dev/null"); //Less than Mac OS X Tiger(10.4)
//	system("dscacheutil -flushcache 2>/dev/null"); //Mac OS X Leopard(10.5) and Snow Leopard(10.6)
	system("killall -HUP mDNSResponder 2>/dev/null"); //Mac OS X Lion(10.7), Mountain Lion(10.8) and Mavericks(10.9)
	system("discoveryutil mdnsflushcache 2>/dev/null"); //Mac OS X Yosemite(10.10) and newer version
#endif

	return;
}
Пример #10
0
int logWrite(bool time, const wchar_t *format, va_list argList)
{
	int iReturnCode = DIAGLIB_OK;
	
	if(!g_logAvailable)
		return DIAGLIB_OK;
	
	if(format==NULL)
		return DIAGLIB_ERR_BAD_CALL;

	if(!g_pfile) 
	{
		if(DIAGLIB_OK != (iReturnCode = logLoadResources()))
		{
		   return iReturnCode;
		}
	}
		   
	if(!g_pfile) return DIAGLIB_ERR_INTERNAL;
	
	if(time)
	{
		std::wstring timestamp;
		getLocalTime(timestamp);
		fwprintf_s(g_pfile,L"%ls - ",timestamp.c_str());
	}
	vfwprintf_s(g_pfile, format, argList);
	
	return DIAGLIB_OK;
}
Пример #11
0
UINT CALLBACK LogThread(void* param)
{
  TCHAR fileName[MAX_PATH];
  LogPath(fileName, _T("log"));
  while ( m_bLoggerRunning || (m_logQueue.size() > 0) ) 
  {
    if ( m_logQueue.size() > 0 ) 
    {
      SYSTEMTIME systemTime;
      GetLocalTime(&systemTime);
			WIN32_FILE_ATTRIBUTE_DATA fileInformation;

			GetFileAttributesEx(fileName, GetFileExInfoStandard, &fileInformation);

      if(logFileParsed != systemTime.wDay || fileInformation.nFileSizeLow > 10485760)
      {
        LogRotate();
        logFileParsed=systemTime.wDay;
        LogPath(fileName, _T("log"));
      }
      
      CAutoLock lock(&m_logFileLock);
      FILE* fp = _tfopen(fileName, _T("a+"));
      if (fp!=NULL)
      {
        SYSTEMTIME systemTime;
        GetLocalTime(&systemTime);
        wstring line = GetLogLine();
        while (!line.empty())
        {
          fwprintf_s(fp, L"%s", line.c_str());
          line = GetLogLine();
        }
        fclose(fp);
      }
      else //discard data
      {
        wstring line = GetLogLine();
        while (!line.empty())
        {
          line = GetLogLine();
        }
      }
    }
    if (m_bLoggerRunning)
    {
      m_EndLoggingEvent.Wait(1000); //Sleep for 1000ms, unless thread is ending
    }
    else
    {
      Sleep(1);
    }
  }
	_endthreadex(0);
  return 0;
}
Пример #12
0
void CLog::writeLineMessageW(const wchar_t *format, va_list argList)
{

 	if(!m_f)	//Should not happend, as this method must only be called if the writeLineHeader succeed
		throw CMWEXCEPTION(EIDMW_FILE_NOT_OPENED);

	vfwprintf_s(m_f, format, argList);
	fwprintf_s(m_f,L"%c",'\n');
	close();
}
Пример #13
0
IDiaSymbol* PF_OpenAndFindGlobalScopeFromPdbFile(const wchar_t *szFilename)
{
	IDiaSession *pSession = NULL;
	IDiaSymbol *pGlobalScope = NULL;
	IDiaDataSource *pSource;

	HRESULT hr = CoCreateInstance(CLSID_DiaSource,
		NULL,
		CLSCTX_INPROC_SERVER,
		__uuidof(IDiaDataSource),
		(void **)&pSource);
	if (FAILED(hr))
	{
		fwprintf_s(stdout, L"Could not CoCreate CLSID_DiaSource.\n");
		return NULL;
	}

	if (FAILED(pSource->loadDataFromPdb(szFilename)))
	{
		fwprintf_s(stdout, L"loadDataFromPdb.\n");
		return NULL;
	}
	if (FAILED(pSource->openSession(&pSession)))
	{
		fwprintf_s(stdout, L"openSession.\n");
		pSession = 0;
		return NULL;
	}

	if (FAILED(pSession->get_globalScope(&pGlobalScope)))
	{
		fwprintf_s(stdout, L"globalscope.\n");
		pSession = 0;
		pGlobalScope = 0;
		return NULL;
	}
	pSession = 0;
	return pGlobalScope;
}
Пример #14
0
//Flush DNS cache
void FlushDNSCache(
	const uint8_t *Domain)
{
//Flush DNS cache in program.
	std::unique_lock<std::mutex> DNSCacheListMutex(DNSCacheListLock);
	if (Domain == nullptr) //Flush all DNS cache.
	{
		DNSCacheList.clear();
	}
//Flush single domain cache.
	else {
		for (auto DNSCacheDataIter = DNSCacheList.begin();DNSCacheDataIter != DNSCacheList.end();)
		{
			if (DNSCacheDataIter->Domain == (const char *)Domain)
				DNSCacheDataIter = DNSCacheList.erase(DNSCacheDataIter);
			else 
				++DNSCacheDataIter;
		}
	}
	DNSCacheListMutex.unlock();

//Flush DNS cache in system.
	std::lock_guard<std::mutex> ScreenMutex(ScreenLock);
#if defined(PLATFORM_WIN)
	system("ipconfig /flushdns 2>nul"); //All Windows version
	fwprintf_s(stderr, L"\n");
#elif defined(PLATFORM_LINUX)
	#if defined(PLATFORM_OPENWRT)
		system("/etc/init.d/dnsmasq restart 2>/dev/null"); //Dnsmasq manage DNS cache on OpenWrt
	#else
		auto Result = system("service nscd restart 2>/dev/null"); //Name Service Cache Daemon service
		Result = system("service dnsmasq restart 2>/dev/null"); //Dnsmasq service
		Result = system("rndc restart 2>/dev/null"); //Name server control utility of BIND(9.1.3 and older version)
		Result = system("rndc flush 2>/dev/null"); //Name server control utility of BIND(9.2.0 and newer version)
	#endif
#elif defined(PLATFORM_MACX)
//	system("lookupd -flushcache 2>/dev/null"); //Less than Mac OS X Tiger(10.4)
//	system("dscacheutil -flushcache 2>/dev/null"); //Mac OS X Leopard(10.5) and Snow Leopard(10.6)
	system("killall -HUP mDNSResponder 2>/dev/null"); //Mac OS X Lion(10.7), Mountain Lion(10.8) and Mavericks(10.9)
	system("discoveryutil mdnsflushcache 2>/dev/null"); //Mac OS X Yosemite(10.10) and newer version
#endif

	return;
}
Пример #15
0
void CALLBACK MyDllNotification(ULONG Reason, PLDR_DLL_NOTIFICATION_DATA NotificationData,
	PVOID Context)
{
	//Check for the reason
	switch (Reason)
	{
	//LDR_DLL_NOTIFICATION_REASON_LOADED
	case LDR_DLL_NOTIFICATION_REASON_LOADED:
		break;
	//LDR_DLL_NOTIFICATION_REASON_UNLOADED
	case LDR_DLL_NOTIFICATION_REASON_UNLOADED:
	{

		wchar_t message[256] = { 0 };
		swprintf(message, L"DLL was unloaded event for %wZ\n", (*NotificationData->Unloaded.FullDllName));
		//MessageBoxW(0, message, L"Event", MB_OK);
		fwprintf_s(fp, message);
	}
	default:
		return;
	}
}
Пример #16
0
static void Output(const char *fmt, ... )
{
  va_list ap;
  va_start(ap, fmt);

#ifndef XP_WIN
  vfprintf(stderr, fmt, ap);
#ifdef XP_OS2
  char msg[2048];
  vsnprintf(msg, sizeof(msg), fmt, ap);
  HAB hab = WinInitialize(0);
  WinCreateMsgQueue(hab, 0);
  WinMessageBox(HWND_DESKTOP, 0, msg, "Firefox", 0,
                MB_OK | MB_ERROR | MB_MOVEABLE);
#endif
#else
  char msg[2048];
  vsnprintf_s(msg, _countof(msg), _TRUNCATE, fmt, ap);

  wchar_t wide_msg[2048];
  MultiByteToWideChar(CP_UTF8,
                      0,
                      msg,
                      -1,
                      wide_msg,
                      _countof(wide_msg));
#if MOZ_WINCONSOLE
  fwprintf_s(stderr, wide_msg);
#else
  MessageBoxW(NULL, wide_msg, L"Firefox", MB_OK
                                        | MB_ICONERROR
                                        | MB_SETFOREGROUND);
#endif
#endif

  va_end(ap);
}
Пример #17
0
void addPtToKml( FILE* outKml, Item* pitem )
{
    TCHAR* ptTchar = NULL;
    TCHAR ptName[ MAX_PATH ] = { 0 };

    // Set up point's name
    wcscpy_s( ptName, _countof( ptName ), pitem->findInfo.cFileName );
    ptTchar = wcsrchr( ptName, L'.' );
    if ( ptTchar != NULL )
        *ptTchar = L'\0';

    // Output point placemark
    fwprintf_s( outKml, TEXT( "<Placemark>\n" ) );
    fwprintf_s( outKml, TEXT( "  <name>%s</name>\n" ),
        ptName );
    fwprintf_s( outKml, TEXT( "  <styleUrl>#mypushpin</styleUrl>\n" ) );
    fwprintf_s( outKml, TEXT( "  <Point>\n" ) );
    fwprintf_s( outKml, TEXT( "    <coordinates>%s</coordinates>\n" ),
        pitem->coords );
    fwprintf_s( outKml, TEXT( "  </Point>\n" ) );
    fwprintf_s( outKml, TEXT( "</Placemark>\n\n" ) );
}
Пример #18
0
//ATTENTION : Design for use with macro
//            Must be follow by writeLineMessage to close the file
//Write to log the first part of the line
bool CLog::writeLineHeaderW(tLOG_Level level,const int line,const wchar_t *file)
{

 	if(level>m_maxlevel)
		return false;

	long lPreviousOpenFailed = getOpenFailed();

	if(!open(true))
		return false;

	std::wstring timestamp;
	getLocalTimeW(timestamp);	
	
	if(lPreviousOpenFailed > 0)
	{
		if(isFileMixingGroups())
		{
			fwprintf_s(m_f,L"%ls - %ld - %ls: ...ERROR: This file could not be opened. %ld logging line(s) are missing...\n",timestamp.c_str(),CThread::getCurrentPid(),m_group.c_str(),lPreviousOpenFailed);
		}
		else
		{
			fwprintf_s(m_f,L"%ls - %ld: ...ERROR: This file could not be opened. %ld logging line(s) are missing...\n",timestamp.c_str(),CThread::getCurrentPid(),lPreviousOpenFailed);
		}
	}

	if(isFileMixingGroups())
	{
		if(line>0 && wcslen(file)>0)
			fwprintf_s(m_f,L"%ls - %ld|%ld - %ls - %ls -'%ls'-line=%d: ",timestamp.c_str(),CThread::getCurrentPid(),CThread::getCurrentThreadId(),m_group.c_str(),getLevel(level),file,line);
		else
			fwprintf_s(m_f,L"%ls - %ld|%ld - %ls - %ls: ",timestamp.c_str(),CThread::getCurrentPid(),CThread::getCurrentThreadId(),m_group.c_str(),getLevel(level));
	}
	else
	{
		if(line>0 && wcslen(file)>0)
			fwprintf_s(m_f,L"%ls - %ld|%ld - %ls -'%ls'-line=%d: ",timestamp.c_str(),CThread::getCurrentPid(),CThread::getCurrentThreadId(),getLevel(level),file,line);
		else
			fwprintf_s(m_f,L"%ls - %ld|%ld - %ls: ",timestamp.c_str(),CThread::getCurrentPid(),CThread::getCurrentThreadId(),getLevel(level));
	}

	return true;

}
Пример #19
0
//MD4 hash function
bool __fastcall MD4_Hash(
	FILE *Input)
{
//Parameters check
	if ((HashFamilyID != HASH_ID_MD4 && HashFamilyID != HASH_ID_ED2K) || Input == nullptr)
	{
		fwprintf_s(stderr, L"Parameters error.\n");
		return false;
	}

//Initialization
	size_t ReadBlockSize = FILE_BUFFER_SIZE, ReadLength = 0, RoundCount = 0;
	if (HashFamilyID == HASH_ID_ED2K)
		ReadBlockSize = ED2K_SIZE_BLOCK;
	std::shared_ptr<char> Buffer(new char[ReadBlockSize]()), StringBuffer(new char[FILE_BUFFER_SIZE]()), BufferED2K(new char[MD4_SIZE_DIGEST]());
	memset(Buffer.get(), 0, ReadBlockSize);
	memset(StringBuffer.get(), 0, FILE_BUFFER_SIZE);
	memset(BufferED2K.get(), 0, MD4_SIZE_DIGEST);
	MD4_CTX HashInstance, HashInstanceED2K;
	memset(&HashInstance, 0, sizeof(MD4_CTX));
	memset(&HashInstanceED2K, 0, sizeof(MD4_CTX));

//MD4 initialization
	MD4_Init(&HashInstance);
	if (HashFamilyID == HASH_ID_ED2K)
		MD4_Init(&HashInstanceED2K);

//Hash process
	while (!feof(Input))
	{
		memset(Buffer.get(), 0, ReadBlockSize);
		_set_errno(0);
		ReadLength = fread_s(Buffer.get(), ReadBlockSize, sizeof(char), ReadBlockSize, Input);
		if (ReadLength == 0)
		{
			fwprintf_s(stderr, L"Hash process error");
			if (errno > 0)
				fwprintf_s(stderr, L", error code is %d.\n", errno);
			else
				fwprintf_s(stderr, L".\n");

			return false;
		}
		else {
			MD4_Update(&HashInstance, Buffer.get(), ReadLength);
			if (HashFamilyID == HASH_ID_ED2K)
			{
				MD4_Final((unsigned char *)Buffer.get(), &HashInstance);
				memcpy_s(BufferED2K.get(), MD4_SIZE_DIGEST, Buffer.get(), MD4_SIZE_DIGEST);
				MD4_Update(&HashInstanceED2K, Buffer.get(), MD4_SIZE_DIGEST);
				MD4_Init(&HashInstance);
			}

			++RoundCount;
		}
	}

//Binary to hex
	memset(Buffer.get(), 0, ReadBlockSize);
	if (HashFamilyID == HASH_ID_MD4)
	{
		MD4_Final((unsigned char *)Buffer.get(), &HashInstance);
	}
	else if (HashFamilyID == HASH_ID_ED2K)
	{
		if (RoundCount > 1U)
			MD4_Final((unsigned char *)Buffer.get(), &HashInstanceED2K);
		else 
			memcpy_s(Buffer.get(), MD4_SIZE_DIGEST, BufferED2K.get(), MD4_SIZE_DIGEST);
	}
	else {
		return false;
	}
	if (sodium_bin2hex(StringBuffer.get(), FILE_BUFFER_SIZE, (const unsigned char *)Buffer.get(), MD4_SIZE_DIGEST) == nullptr)
	{
		fwprintf_s(stderr, L"Convert binary to hex error.\n");
		return false;
	}
	else {
	//Print to screen.
		std::string HashResult = StringBuffer.get();
		CaseConvert(true, HashResult);
		for (size_t Index = 0;Index < HashResult.length();++Index)
			fwprintf_s(stderr, L"%c", HashResult.c_str()[Index]);
		fwprintf_s(stderr, L"\n");
	}

	return true;
}
Пример #20
0
int wmain(
	_In_ int argc, 
	_In_ wchar_t* argv[])
{
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
int main(int argc, char *argv[])
{
#endif

#if defined(ENABLE_LIBSODIUM)
//Libsodium initialization
	if (sodium_init() != EXIT_SUCCESS)
	{
		wprintf_s(L"Libsodium initialization error\n");
#if defined(PLATFORM_WIN)
		system("Pause");
#endif

		return EXIT_FAILURE;
	}

	FILE *Output = nullptr;
//Output.
#if defined(PLATFORM_WIN)
	_wfopen_s(&Output, L"KeyPair.txt", L"w+,ccs=UTF-8");
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	Output = fopen("KeyPair.txt", "w+");
#endif
	if (Output != nullptr)
	{
	//Initialization and make keypair.
		size_t Index = 0;
		std::shared_ptr<char> Buffer(new char[KEYPAIR_MESSAGE_LEN]());
		std::shared_ptr<uint8_t> PublicKey(new uint8_t[crypto_box_PUBLICKEYBYTES]()), SecretKey(new uint8_t[crypto_box_SECRETKEYBYTES]());
		memset(Buffer.get(), 0, KEYPAIR_MESSAGE_LEN);
		memset(PublicKey.get(), 0, crypto_box_PUBLICKEYBYTES);
		memset(SecretKey.get(), 0, crypto_box_SECRETKEYBYTES);
		crypto_box_keypair(PublicKey.get(), SecretKey.get());

	//Write public key.
		memset(Buffer.get(), 0, KEYPAIR_MESSAGE_LEN);
		if (sodium_bin2hex(Buffer.get(), KEYPAIR_MESSAGE_LEN, PublicKey.get(), crypto_box_PUBLICKEYBYTES) == nullptr)
			wprintf_s(L"Create ramdom key pair failed, please try again.\n");
		CaseConvert(true, Buffer.get(), KEYPAIR_MESSAGE_LEN);
		fwprintf_s(Output, L"Client Public Key = ");
		for (Index = 0;Index < strnlen_s(Buffer.get(), KEYPAIR_MESSAGE_LEN);++Index)
		{
			if (Index > 0 && Index % KEYPAIR_INTERVAL == 0 && Index + 1U < strnlen_s(Buffer.get(), KEYPAIR_MESSAGE_LEN))
				fwprintf_s(Output, L":");

			fwprintf_s(Output, L"%c", Buffer.get()[Index]);
		}
		memset(Buffer.get(), 0, KEYPAIR_MESSAGE_LEN);
		fwprintf_s(Output, L"\n");

	//Write secret key.
		if (sodium_bin2hex(Buffer.get(), KEYPAIR_MESSAGE_LEN, SecretKey.get(), crypto_box_SECRETKEYBYTES) == nullptr)
			wprintf_s(L"Create ramdom key pair failed, please try again.\n");
		CaseConvert(true, Buffer.get(), KEYPAIR_MESSAGE_LEN);
		fwprintf_s(Output, L"Client Secret Key = ");
		for (Index = 0;Index < strnlen_s(Buffer.get(), KEYPAIR_MESSAGE_LEN);++Index)
		{
			if (Index > 0 && Index % KEYPAIR_INTERVAL == 0 && Index + 1U < strnlen_s(Buffer.get(), KEYPAIR_MESSAGE_LEN))
				fwprintf_s(Output, L":");

			fwprintf_s(Output, L"%c", Buffer.get()[Index]);
		}
		fwprintf_s(Output, L"\n");

	//Close file.
		fclose(Output);
	}
	else {
		wprintf_s(L"Cannot create target file(KeyPair.txt)\n");
	#if defined(PLATFORM_WIN)
		system("Pause");
	#endif

		return EXIT_FAILURE;
	}

	wprintf_s(L"Create ramdom key pair success, please check KeyPair.txt.\n\n");
#if defined(PLATFORM_WIN)
	system("Pause");
#endif
#else
	#if defined(PLATFORM_WIN)
		wprintf_s(L"LibSodium is disable.\n\n");
		system("Pause");
	#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
		wprintf(L"LibSodium is disable.\n\n");
	#endif
#endif

	return EXIT_SUCCESS;
}

//Convert lowercase/uppercase words to uppercase/lowercase words(Character version)
#if defined(ENABLE_LIBSODIUM)
void __fastcall CaseConvert(
	_In_ const bool IsLowerToUpper, 
	_Inout_ char *Buffer, 
	_In_ const size_t Length)
{
	for (size_t Index = 0;Index < Length;++Index)
	{
	//Lowercase to uppercase
		if (IsLowerToUpper)
			Buffer[Index] = (char)toupper(Buffer[Index]);
	//Uppercase to lowercase
		else 
			Buffer[Index] = (char)tolower(Buffer[Index]);
	}

	return;
}
Пример #21
0
//Print errors to log file
size_t __fastcall PrintError(const size_t Type, const PWSTR Message, const SSIZE_T Code, const PWSTR FileName, const size_t Line)
{
//Print Errors: ON/OFF.
	if (!Parameter.PrintError || Message == nullptr)
		return FALSE;

//Get current date&time.
	tm Time = {0};
	time_t tTime = 0;
	time(&tTime);
	localtime_s(&Time, &tTime);
/*
//Windows API
	SYSTEMTIME Time = {0};
	GetLocalTime(&Time);
	fwprintf_s(Output, L"%u%u/%u %u:%u:%u -> %s.\n", Time.wYear, Time.wMonth, Time.wDay, Time.wHour, Time.wMinute, Time.wSecond, pBuffer); //Windows API

//Convert to ASCII.
	char TimeBuf[ADDR_STRING_MAXSIZE] = {0};
	asctime_s(TimeBuf, &Time);
	fwprintf_s(Output, L"%s -> %s.\n", TimeBuf, pBuffer);
*/

	FILE *Output = nullptr;
	_wfopen_s(&Output, ErrorLogPath.c_str(), L"a,ccs=UTF-8");
	if (Output != nullptr)
	{
	// Error Type
	// 01: System Error
	// 02: Parameter Error
	// 03: IPFilter Error
	// 04: Hosts Error
	// 05: Winsock Error
	// 06: WinPcap Error
	// 07: DNSCurve Error
		switch (Type)
		{
		//System Error
			case SYSTEM_ERROR:
			{
				if (Code == NULL)
				{
					fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls.\n", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
				}
				else {
				//About System Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx.
					if (Code == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
						fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls, ERROR_FAILED_SERVICE_CONTROLLER_CONNECT(The service process could not connect to the service controller).\n", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
					else 
						fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls, error code is %d.\n", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message, (int)Code);
				}
			}break;
		//Parameter Error
			case PARAMETER_ERROR:
			{
				fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Parameter Error: %ls", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
				if (FileName != nullptr && Line != NULL)
				{
				//Delete double backslash.
					std::wstring sFileName(FileName);
					while (sFileName.find(L"\\\\") != std::wstring::npos)
						sFileName.erase((size_t)sFileName.find(L"\\\\"), 1U);

				//Write to file
					fwprintf_s(Output, L" in line %d of %ls", (int)Line, sFileName.c_str());
				}

			//About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx.
				if (Code != NULL)
					fwprintf_s(Output, L", error code is %d", (int)Code);

				fwprintf_s(Output, L".\n");
			}break;
		//IPFilter Error
			case IPFILTER_ERROR:
			{
				fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> IPFilter Error: %ls", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
				if (FileName != nullptr && Line != NULL)
				{
				//Delete double backslash.
					std::wstring sFileName(FileName);
					while (sFileName.find(L"\\\\") != std::wstring::npos)
						sFileName.erase((size_t)sFileName.find(L"\\\\"), 1U);

				//Write to file
					fwprintf_s(Output, L" in line %d of %ls", (int)Line, sFileName.c_str());
				}

			//About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx.
				if (Code != NULL)
					fwprintf_s(Output, L", error code is %d", (int)Code);

				fwprintf_s(Output, L".\n");
			}break;
		//Hosts Error
			case HOSTS_ERROR:
			{
				fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Hosts Error: %ls", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
				if (FileName != nullptr && Line != NULL)
				{
				//Delete double backslash.
					std::wstring sFileName(FileName);
					while (sFileName.find(L"\\\\") != std::wstring::npos)
						sFileName.erase((size_t)sFileName.find(L"\\\\"), 1U);

				//Write to file
					fwprintf_s(Output, L" in line %d of %ls", (int)Line, sFileName.c_str());
				}

			//About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx.
				if (Code != NULL)
					fwprintf_s(Output, L", error code is %d", (int)Code);

				fwprintf_s(Output, L".\n");
			}break;
		//Winsock Error
		//About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx.
			case WINSOCK_ERROR:
			{
				if (Code == NULL)
					fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Winsock Error: %ls.\n", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
				else 
					fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Winsock Error: %ls, error code is %d.\n", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message, (int)Code);
			}break;
		//WinPcap Error
			case WINPCAP_ERROR:
			{
				fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> WinPcap Error: %ls.\n", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
			}break;
		//DNSCurve Error
			case DNSCURVE_ERROR:
			{
				fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> DNSCurve Error: %ls.\n", Time.tm_year + 1900, Time.tm_mon + 1, Time.tm_mday, Time.tm_hour, Time.tm_min, Time.tm_sec, Message);
			}break;
			default:
			{
				fclose(Output);
				return EXIT_FAILURE;
			}
		}

		fclose(Output);
		return EXIT_SUCCESS;
	}

	return EXIT_FAILURE;
}
Пример #22
0
void addCoordsToKml( FILE* outKml, Item* pitem )
{
    fwprintf_s( outKml, TEXT( "      %s\n" ), pitem->coords );
}
Пример #23
0
void outputKml( List* plist )
{
    errno_t err;
    FILE* outKml = NULL;
    TCHAR fName[ MAX_PATH ] = { 0 };

    // Set up kml file's name
    wcscpy_s( fName, _countof( fName ), plist->measureName );
    wcscat_s( fName, _countof( fName ), TEXT( ".kml" ) );

    // Set up 'lati' output file
    err = _wfopen_s( &outKml, fName, TEXT( "w" ) );

    if ( err != 0 )
    {                       
        fwprintf_s( stderr, TEXT( "Can't create output file.\n" ) );
        return;
    }

    // Output header
    fwprintf_s( outKml,
        TEXT( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ) );
    fwprintf_s( outKml,
        TEXT( "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n\n" ) );
    fwprintf_s( outKml, TEXT( "<Document>\n\n" ) );

    // Output styles
    fwprintf_s( outKml, TEXT( "<Style id=\"mypushpin\">\n" ) );
    fwprintf_s( outKml, TEXT( "  <LabelStyle>\n" ) );
    fwprintf_s( outKml, TEXT( "    <scale>0.5</scale>\n" ) );
    fwprintf_s( outKml, TEXT( "  </LabelStyle>\n" ) );
    fwprintf_s( outKml, TEXT( "  <IconStyle>\n" ) );
    fwprintf_s( outKml, TEXT( "    <scale>0.5</scale>\n" ) );
    fwprintf_s( outKml, TEXT( "    <Icon>\n" ) );
    fwprintf_s( outKml, TEXT( "      <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>\n" ) );
    fwprintf_s( outKml, TEXT( "    </Icon>\n" ) );
    fwprintf_s( outKml, TEXT( "  </IconStyle>\n" ) );
    fwprintf_s( outKml, TEXT( "</Style>\n\n" ) );

    fwprintf_s( outKml, TEXT( "<Style id=\"myline\">\n" ) );
    fwprintf_s( outKml, TEXT( "  <LineStyle>\n" ) );
    fwprintf_s( outKml, TEXT( "    <color>ff7fff55</color>\n" ) );
    fwprintf_s( outKml, TEXT( "    <colorMode>normal</colorMode>\n" ) );
    fwprintf_s( outKml, TEXT( "    <width>3</width>\n" ) );
    fwprintf_s( outKml, TEXT( "  </LineStyle>\n" ) );
    fwprintf_s( outKml, TEXT( "</Style>\n\n" ) );

    // Output measurement points (placemarks) to kml file
    TraverseToFile( plist, outKml, addPtToKml );

    // Output polygon joining measurement points
    fwprintf_s( outKml, TEXT( "<Placemark>\n" ) );
    fwprintf_s( outKml, TEXT( "  <name>%s</name>\n" ), plist->measureName );
    fwprintf_s( outKml, TEXT( "  <styleUrl>#myline</styleUrl>\n" ) );
    fwprintf_s( outKml, TEXT( "  <LineString>\n" ) );
    fwprintf_s( outKml, TEXT( "    <coordinates>\n" ) );

    // Add coods of all pts to kml
    TraverseToFile( plist, outKml, addCoordsToKml );

    // If needed, then close the polygon
    // Output coords of first point again
    if ( plist->iCount > 2 )
        fwprintf_s( outKml, TEXT( "      %s\n" ), plist->head->item.coords );

    // Terminate polygon output
    fwprintf_s( outKml, TEXT( "    </coordinates>\n" ) );
    fwprintf_s( outKml, TEXT( "  </LineString>\n" ) );
    fwprintf_s( outKml, TEXT( "</Placemark>\n\n" ) );

    // Output footer
    fwprintf_s( outKml, TEXT( "</Document>\n\n" ) );
    fwprintf_s( outKml, TEXT( "</kml>" ) );

    // Close kml file
    if ( fclose( outKml ) != 0 )
        fwprintf_s( stderr, TEXT( "Error closing kml file\n" ) );
}
Пример #24
0
int Test_print_wide( void )
/*************************/
{
    wchar_t     buf[128];
    int         n;
    int         violations = NumViolations;


    VERIFY( wprintf_s( NULL ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( wprintf_s( L"%n", &n ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( wprintf_s( L"%s", NULL ) < 0 );
    VERIFY( ++violations == NumViolations );


    VERIFY( fwprintf_s( NULL, L"hello" ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( fwprintf_s( stdout, NULL, 3 ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( fwprintf_s( stdout, L"%hhn", &n ) < 0 );
    VERIFY( ++violations == NumViolations );


    VERIFY( my_wprintf_s( NULL, 3, 6 ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( my_fwprintf_s( NULL, L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( my_fwprintf_s( stdout, NULL ) < 0 );
    VERIFY( ++violations == NumViolations );


    VERIFY( swprintf_s( buf, 2, L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    VERIFY( swprintf_s( buf, sizeof( buf ), L"%%n%d", 1 ) == 3 );
    VERIFY( !wcscmp( buf, L"%n1" ) );

    *buf = 'z';
    VERIFY( swprintf_s( buf, sizeof( buf ), NULL ) == 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    *buf = 'z'; /* preinit output buffer ... */
    VERIFY( swprintf_s( NULL, sizeof( buf ), L"hi" ) == 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( swprintf_s( buf, 0, L"hi" ) == 0 );
    VERIFY( ++violations == NumViolations );

#if RSIZE_MAX != SIZE_MAX
    VERIFY( swprintf_s( buf, ~0, L"hi" ) == 0 );
    VERIFY( ++violations == NumViolations );
#endif


    VERIFY( my_swprintf_s( NULL, sizeof( buf ), L"hi" ) == 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( my_swprintf_s( buf, 0, L"hi" ) == 0 );
    VERIFY( ++violations == NumViolations );

#if RSIZE_MAX != SIZE_MAX
    VERIFY( my_swprintf_s( buf, ~0, L"hi" ) == 0 );
    VERIFY( ++violations == NumViolations );
#endif

    VERIFY( *buf == 'z' );  /* ... and make sure no one touched it */

    VERIFY( my_swprintf_s( buf, 5, NULL, 'z', "oo", 36 ) == 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    VERIFY( my_swprintf_s( buf, 6, L"%c%s%d", 'z', L"oo", 36 ) == 5 );
    VERIFY( !wcscmp( buf, L"zoo36" ) );

    VERIFY( my_swprintf_s( buf, 5, L"%c%s%d", 'z', L"oo", 36 ) < 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    VERIFY( my_swprintf_s( buf, sizeof( buf ), L"hi%#6.3n", &n ) == 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( my_swprintf_s( buf, sizeof( buf ), L"%%n%s", L"Y" ) == 3 );
    VERIFY( !wcscmp( buf, L"%nY" ) );

    VERIFY( my_swprintf_s( buf, sizeof( buf ), L"hi%s", NULL ) == 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );


    VERIFY( my_snwprintf_s( buf, sizeof( buf ), L"hi%#6.3n", &n ) < 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    VERIFY( my_snwprintf_s( buf, 1, L"hi%s", NULL ) < 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    wmemset( buf, 'Q', 10 );
    VERIFY( my_snwprintf_s( buf, 4, L"%c%s%d", 'z', L"oo", 3676 ) == 7 );
    VERIFY( !wmemcmp( buf, L"zoo\0QQQQQQ", 10 ) );

    VERIFY( my_snwprintf_s( buf, sizeof( buf ), L"%c%s%d", 'z', L"oo", 36 ) == 5 );
    VERIFY( !wcscmp( buf, L"zoo36" ) );

    VERIFY( my_snwprintf_s( NULL, sizeof( buf ), L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( my_snwprintf_s( buf, 0, L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );

#if RSIZE_MAX != SIZE_MAX
    VERIFY( my_snwprintf_s( buf, ~0, L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );
#endif


    VERIFY( snwprintf_s( NULL, sizeof( buf ), L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );

    VERIFY( snwprintf_s( buf, 0, L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );

#if RSIZE_MAX != SIZE_MAX
    VERIFY( snwprintf_s( buf, ~0, L"hi" ) < 0 );
    VERIFY( ++violations == NumViolations );
#endif

    VERIFY( *buf == 'z' );

    VERIFY( snwprintf_s( buf, sizeof( buf ), NULL, 3, 5 ) < 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    VERIFY( snwprintf_s( buf, sizeof( buf ), L"hi%#3.55n", &n ) < 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    VERIFY( snwprintf_s( buf, sizeof( buf ), L"hi%s", NULL ) < 0 );
    VERIFY( ++violations == NumViolations );
    VERIFY( *buf == '\0' );

    return( 1 );
}
Пример #25
0
//----------------------------------------------------------------------------
// Function: SystemInfo
//
// Description:
// Returns the resource information about the machine 
//
// Returns:
// EXIT_SUCCESS: On success
// EXIT_FAILURE: otherwise
int SystemInfo() 
{
  size_t vmemSize, vmemFree, memSize, memFree;
  PERFORMANCE_INFORMATION memInfo;
  SYSTEM_INFO sysInfo;
  FILETIME idleTimeFt, kernelTimeFt, userTimeFt;
  ULARGE_INTEGER idleTime, kernelTime, userTime;
  ULONGLONG cpuTimeMs;
  size_t size;
  LPBYTE pBuffer;
  PROCESSOR_POWER_INFORMATION const *ppi;
  ULONGLONG cpuFrequencyKhz;
  NTSTATUS status;

  ZeroMemory(&memInfo, sizeof(PERFORMANCE_INFORMATION));
  memInfo.cb = sizeof(PERFORMANCE_INFORMATION);
  if(!GetPerformanceInfo(&memInfo, sizeof(PERFORMANCE_INFORMATION)))
  {
    ReportErrorCode(L"GetPerformanceInfo", GetLastError());
    return EXIT_FAILURE;
  }
  vmemSize = memInfo.CommitLimit*memInfo.PageSize;
  vmemFree = vmemSize - memInfo.CommitTotal*memInfo.PageSize;
  memSize = memInfo.PhysicalTotal*memInfo.PageSize;
  memFree = memInfo.PhysicalAvailable*memInfo.PageSize;

  GetSystemInfo(&sysInfo);

  if(!GetSystemTimes(&idleTimeFt, &kernelTimeFt, &userTimeFt))
  {
    ReportErrorCode(L"GetSystemTimes", GetLastError());
    return EXIT_FAILURE;
  }
  idleTime.HighPart = idleTimeFt.dwHighDateTime;
  idleTime.LowPart = idleTimeFt.dwLowDateTime;
  kernelTime.HighPart = kernelTimeFt.dwHighDateTime;
  kernelTime.LowPart = kernelTimeFt.dwLowDateTime;
  userTime.HighPart = userTimeFt.dwHighDateTime;
  userTime.LowPart = userTimeFt.dwLowDateTime;

  cpuTimeMs = (kernelTime.QuadPart - idleTime.QuadPart + userTime.QuadPart)/10000;

  // allocate buffer to get info for each processor
  size = sysInfo.dwNumberOfProcessors * sizeof(PROCESSOR_POWER_INFORMATION);
  pBuffer = (BYTE*) LocalAlloc(LPTR, size);
  if(!pBuffer)
  {
    ReportErrorCode(L"LocalAlloc", GetLastError());
    return EXIT_FAILURE;
  }
  status = CallNtPowerInformation(ProcessorInformation, NULL, 0, pBuffer, (long)size);
  if(0 != status)
  {
    fwprintf_s(stderr, L"Error in CallNtPowerInformation. Err:%d\n", status);
    LocalFree(pBuffer);
    return EXIT_FAILURE;
  }
  ppi = (PROCESSOR_POWER_INFORMATION const *)pBuffer;
  cpuFrequencyKhz = ppi->MaxMhz*1000;
  LocalFree(pBuffer);

  fwprintf_s(stdout, L"%Iu,%Iu,%Iu,%Iu,%u,%I64u,%I64u\n", vmemSize, memSize,
    vmemFree, memFree, sysInfo.dwNumberOfProcessors, cpuFrequencyKhz, cpuTimeMs);

  return EXIT_SUCCESS;
}
Пример #26
0
//Send DNS requesting process
size_t __fastcall SendProcess(const sockaddr_storage Target)
{
//Initialization
	std::shared_ptr<char> Buffer(new char[BufferSize]()), RecvBuffer(new char[BufferSize]());
	SSIZE_T DataLength = 0;
	LARGE_INTEGER CPUFrequency = {0}, BeforeTime = {0}, AfterTime = {0};
	SOCKET Socket = 0;
	int AddrLen = 0;

//IPv6
	if (Protocol == AF_INET6)
	{
	//Socket initialization
		AddrLen = sizeof(sockaddr_in6);
		if (RawSocket && RawData)
			Socket = socket(AF_INET6, SOCK_RAW, ServiceName);
		else 
			Socket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
		if (Socket == INVALID_SOCKET)
		{
			wprintf(L"Socket initialization error, error code is %d.\n", WSAGetLastError());

			WSACleanup();
			return EXIT_FAILURE;
		}
	}
//IPv4
	else {
	//Socket initialization
		AddrLen = sizeof(sockaddr_in);
		if (RawSocket && RawData)
			Socket = socket(AF_INET, SOCK_RAW, ServiceName);
		else 
			Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
		if (Socket == INVALID_SOCKET)
		{
			wprintf(L"Socket initialization error, error code is %d.\n", WSAGetLastError());

			WSACleanup();
			return EXIT_FAILURE;
		}
	}

//Set socket timeout.
	if (setsockopt(Socket, SOL_SOCKET, SO_SNDTIMEO, (PSTR)&SocketTimeout, sizeof(int)) == SOCKET_ERROR || 
		setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (PSTR)&SocketTimeout, sizeof(int)) == SOCKET_ERROR)
	{
		wprintf(L"Set UDP socket timeout error, error code is %d.\n", WSAGetLastError());
		return EXIT_FAILURE;
	}

//Set IP options.
	if (Protocol == AF_INET6) //IPv6
	{
		if (IP_HopLimits != 0 && setsockopt(Socket, IPPROTO_IP, IPV6_UNICAST_HOPS, (PSTR)&IP_HopLimits, sizeof(int)) == SOCKET_ERROR)
		{
			wprintf(L"Set HopLimit/TTL flag error, error code is %d.\n", WSAGetLastError());
			return EXIT_FAILURE;
		}
	}
	else { //IPv4
		if (IP_HopLimits != 0 && setsockopt(Socket, IPPROTO_IP, IP_TTL, (PSTR)&IP_HopLimits, sizeof(int)) == SOCKET_ERROR)
		{
			wprintf(L"Set HopLimit/TTL flag error, error code is %d.\n", WSAGetLastError());
			return EXIT_FAILURE;
		}

	//Set "Don't Fragment" flag.
		int iIPv4_DF = 1;
		if (IPv4_DF && setsockopt(Socket, IPPROTO_IP, IP_DONTFRAGMENT, (PSTR)&iIPv4_DF, sizeof(int)) == SOCKET_ERROR)
		{
			wprintf(L"Set \"Don't Fragment\" flag error, error code is %d.\n", WSAGetLastError());
			return EXIT_FAILURE;
		}
	}

//Make packet.
	if (!RawData)
	{
	//DNS requesting
		memcpy(Buffer.get() + DataLength, &HeaderParameter, sizeof(dns_hdr));
		if (HeaderParameter.ID == 0)
		{
			auto pdns_hdr = (dns_hdr *)(Buffer.get() + DataLength);
			pdns_hdr->ID = htons((uint16_t)GetCurrentProcessId());
		}
		DataLength += sizeof(dns_hdr);
		DataLength += CharToDNSQuery((PSTR)TestDomain.c_str(), Buffer.get() + DataLength);
		memcpy(Buffer.get() + DataLength, &QueryParameter, sizeof(dns_qry));
		DataLength += sizeof(dns_qry);
		if (EDNS0)
		{
			memcpy(Buffer.get() + DataLength, &EDNS0Parameter, sizeof(dns_edns0_label));
			DataLength += sizeof(dns_edns0_label);
		}
	}
	else {
		if (BufferSize >= RawDataLen)
		{
			memcpy(Buffer.get(), RawData.get(), RawDataLen);
			DataLength = RawDataLen;
		}
		else {
			memcpy(Buffer.get(), RawData.get(), BufferSize);
			DataLength = BufferSize;
		}
	}

//Send.
	if (QueryPerformanceFrequency(&CPUFrequency) == 0 || QueryPerformanceCounter(&BeforeTime) == 0)
	{
		wprintf(L"Get current time form High Precision Event Timer/HPET error, error code is %d.\n", (int)GetLastError());
		return EXIT_FAILURE;
	}
	sendto(Socket, Buffer.get(), (int)DataLength, NULL, (PSOCKADDR)&Target, AddrLen);

//Receive.
	DataLength = recvfrom(Socket, RecvBuffer.get(), (int)BufferSize, NULL, (PSOCKADDR)&Target, &AddrLen);
	if (QueryPerformanceCounter(&AfterTime) == 0)
	{
		wprintf(L"Get current time form High Precision Event Timer/HPET error, error code is %d.\n", (int)GetLastError());
		return EXIT_FAILURE;
	}

//Get waiting time.
	long double Result = (long double)((AfterTime.QuadPart - BeforeTime.QuadPart) * (long double)1000 / (long double)CPUFrequency.QuadPart);

//Print to screen.
	if (DataLength > 0)
	{
		wprintf(L"Receive from %ls:%u -> %d bytes, waiting %lf ms.\n", wTargetString.c_str(), ntohs(ServiceName), (int)DataLength, Result);
	
	//Output to file.
		if (OutputFile != nullptr)
			fwprintf_s(OutputFile, L"Receive from %ls:%u -> %d bytes, waiting %lf ms.\n", wTargetString.c_str(), ntohs(ServiceName), (int)DataLength, Result);

		TotalTime += Result;
		RecvNum++;

	//Mark time.
		if (MaxTime == 0)
		{
			MinTime = Result;
			MaxTime = Result;
		}
		else if (Result < MinTime)
		{
			MinTime = Result;
		}
		else if (Result > MaxTime)
		{
			MaxTime = Result;
		}

	//Transmission interval
		if (TransmissionInterval != 0 && TransmissionInterval > Result)
			Sleep((DWORD)(TransmissionInterval - Result));
		else 
			Sleep(TIME_OUT - (DWORD)Result);
	}
	else { //SOCKET_ERROR
		wprintf(L"Receive error: %d(%d), waiting %lf ms.\n", (int)DataLength, WSAGetLastError(), Result);

	//Output to file.
		if (OutputFile != nullptr)
			fwprintf_s(OutputFile, L"Receive error: %d(%d), waiting %lf ms.\n", (int)DataLength, WSAGetLastError(), Result);

	//Transmission interval
		if (TransmissionInterval != 0 && TransmissionInterval > Result)
			Sleep((DWORD)(TransmissionInterval - Result));
		else if (Result <= TIME_OUT)
			Sleep(TIME_OUT);
	}

	return EXIT_SUCCESS;
}
Пример #27
0
//Print statistics to screen(and/or output result to file)
size_t __fastcall PrintProcess(const bool PacketStatistics, const bool TimeStatistics)
{
//Packet Statistics
	if (PacketStatistics)
	{
		wprintf(L"\nPacket statistics for pinging %ls:\n", wTargetString.c_str());
		wprintf(L"   Send: %lu\n", (ULONG)RealSendNum);
		wprintf(L"   Receive: %lu\n", (ULONG)RecvNum);

	//Output to file.
		if (OutputFile != nullptr)
		{
			fwprintf_s(OutputFile, L"\nPacket statistics for pinging %ls:\n", wTargetString.c_str());
			fwprintf_s(OutputFile, L"   Send: %lu\n", (ULONG)RealSendNum);
			fwprintf_s(OutputFile, L"   Receive: %lu\n", (ULONG)RecvNum);
		}

		if ((SSIZE_T)RealSendNum - (SSIZE_T)RecvNum >= 0)
		{
			wprintf(L"   Lost: %lu", (ULONG)(RealSendNum - RecvNum));
			if (RealSendNum > 0)
				wprintf(L" (%lu%%)\n", (ULONG)((RealSendNum - RecvNum) * 100 / RealSendNum));
			else  //Not any packets.
				wprintf(L"\n");

		//Output to file.
			if (OutputFile != nullptr)
			{
				fwprintf_s(OutputFile, L"   Lost: %lu", (ULONG)(RealSendNum - RecvNum));
				if (RealSendNum > 0)
					fwprintf_s(OutputFile, L" (%lu%%)\n", (ULONG)((RealSendNum - RecvNum) * 100 / RealSendNum));
				else  //Not any packets.
					fwprintf_s(OutputFile, L"\n");
			}
		}
		else {
			wprintf(L"   Lost: 0 (0%%)\n");

		//Output to file.
			if (OutputFile != nullptr)
				fwprintf_s(OutputFile, L"   Lost: 0 (0%%)\n");
		}
	}

//Time Statistics
	if (TimeStatistics && 
		RecvNum > 0 && MaxTime > 0 && MinTime > 0)
	{
		wprintf(L"\nTime statistics for pinging %ls:\n", wTargetString.c_str());
		wprintf(L"   Minimum time: %lf ms.\n", MinTime);
		wprintf(L"   Maximum time: %lf ms.\n", MaxTime);
		wprintf(L"   Average time: %lf ms.\n", TotalTime / (long double)RecvNum);

	//Output to file.
		if (OutputFile != nullptr)
		{
			fwprintf_s(OutputFile, L"\nTime statistics for pinging %ls:\n", wTargetString.c_str());
			fwprintf_s(OutputFile, L"   Minimum time: %lf ms.\n", MinTime);
			fwprintf_s(OutputFile, L"   Maximum time: %lf ms.\n", MaxTime);
			fwprintf_s(OutputFile, L"   Average time: %lf ms.\n", TotalTime / (long double)RecvNum);
		}
	}

	wprintf(L"\n");
//Output to file.
	if (OutputFile != nullptr)
		fwprintf_s(OutputFile, L"\n");

	return EXIT_SUCCESS;
}
Пример #28
0
size_t __cdecl
Output::PrintBuffer(const char16 * buf, size_t size)
{
    Output::s_Column += size;
    const char16 * endbuf = wcschr(buf, '\n');
    while (endbuf != nullptr)
    {
        Output::s_Column = size - (endbuf - buf) - 1;
        endbuf = wcschr(endbuf + 1, '\n');
    }

    bool useConsoleOrFile = true;
    if (!Output::s_capture)
    {
        if (Output::s_useDebuggerWindow)
        {
            OutputDebugStringW(buf);
            useConsoleOrFile = false;
        }
#ifdef ENABLE_TRACE
        if (Output::s_inMemoryLogger)
        {
            s_inMemoryLogger->Write(buf);
            useConsoleOrFile = false;
        }
#endif
    }

    if (useConsoleOrFile)
    {
        if (s_file == nullptr || Output::s_capture)
        {
            bool addToBuffer = true;
            if (Output::bufferFreeSize < size + 1)
            {
                if (Output::bufferAllocSize > MAX_OUTPUT_BUFFER_SIZE && !Output::s_capture)
                {
                    Output::Flush();
                    if (Output::bufferFreeSize < size + 1)
                    {
                        DirectPrint(buf);
                        addToBuffer = false;
                    }
                }
                else
                {
                    size_t oldBufferSize = bufferAllocSize - bufferFreeSize;
                    size_t newBufferAllocSize = (bufferAllocSize + size + 1) * 4 / 3;
                    char16 * newBuffer = (char16 *)realloc(buffer, (newBufferAllocSize * sizeof(char16)));
                    if (newBuffer == nullptr)
                    {
                        // See if I can just flush it and print directly
                        Output::Flush();

                        // Reset the buffer
                        free(Output::buffer);
                        Output::buffer = nullptr;
                        Output::bufferAllocSize = 0;
                        Output::bufferFreeSize = 0;

                        // Print it directly
                        DirectPrint(buf);
                        addToBuffer = false;
                    }
                    else
                    {
                        bufferAllocSize = newBufferAllocSize;
                        buffer = newBuffer;
                        bufferFreeSize = bufferAllocSize - oldBufferSize;
                    }
                }
            }
            if (addToBuffer)
            {
                Assert(Output::bufferFreeSize >= size + 1);
                memcpy_s(Output::buffer + Output::bufferAllocSize - Output::bufferFreeSize, Output::bufferFreeSize * sizeof(char16),
                    buf, (size + 1) * sizeof(char16));
                bufferFreeSize -= size;
            }
        }
        else
        {
            fwprintf_s(Output::s_file, _u("%s"), buf);
        }

        if(s_outputFile != nullptr && !Output::s_capture)
        {
            fwprintf_s(s_outputFile, _u("%s"), buf);
        }
    }

    Output::Flush();

    return size;
}
Пример #29
0
//MD2 hash function
bool __fastcall MD2_Hash(
	FILE *Input)
{
//Parameters check
	if (HashFamilyID != HASH_ID_MD2 || Input == nullptr)
	{
		fwprintf_s(stderr, L"Parameters error.\n");
		return false;
	}

//Initialization
	std::shared_ptr<char> Buffer(new char[FILE_BUFFER_SIZE]()), StringBuffer(new char[FILE_BUFFER_SIZE]());
	memset(Buffer.get(), 0, FILE_BUFFER_SIZE);
	memset(StringBuffer.get(), 0, FILE_BUFFER_SIZE);
	MD2_CTX HashInstance;
	memset(&HashInstance, 0, sizeof(MD2_CTX));
	size_t ReadLength = 0;

//MD2 initialization
	MD2_Init(&HashInstance);

//Hash process
	while (!feof(Input))
	{
		memset(Buffer.get(), 0, FILE_BUFFER_SIZE);
		_set_errno(0);
		ReadLength = fread_s(Buffer.get(), FILE_BUFFER_SIZE, sizeof(char), FILE_BUFFER_SIZE, Input);
		if (ReadLength == 0)
		{
			fwprintf_s(stderr, L"Hash process error");
			if (errno > 0)
				fwprintf_s(stderr, L", error code is %d.\n", errno);
			else 
				fwprintf_s(stderr, L".\n");

			return false;
		}
		else {
			MD2_Update(&HashInstance, (uint8_t *)Buffer.get(), (uint32_t)ReadLength);
		}
	}

//Binary to hex
	memset(Buffer.get(), 0, FILE_BUFFER_SIZE);
	MD2_Final(&HashInstance, (uint8_t *)Buffer.get());
	if (sodium_bin2hex(StringBuffer.get(), FILE_BUFFER_SIZE, (const unsigned char *)Buffer.get(), MD2_DIGEST_SIZE) == nullptr)
	{
		fwprintf_s(stderr, L"Convert binary to hex error.\n");
		return false;
	}
	else {
	//Print to screen.
		std::string HashResult = StringBuffer.get();
		CaseConvert(true, HashResult);
		for (size_t Index = 0;Index < HashResult.length();++Index)
			fwprintf_s(stderr, L"%c", HashResult.c_str()[Index]);
		fwprintf_s(stderr, L"\n");
	}

	return true;
}
Пример #30
0
int wmain(
	int argc, 
	wchar_t* argv[])
{
#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.
	if (!ReadParameter(true))
		return EXIT_FAILURE;

//DNSCurve initialization
#if defined(ENABLE_LIBSODIUM)
	if (Parameter.DNSCurve)
	{
		DNSCurveParameterModificating.SetToMonitorItem();

	//Encryption mode initialization
		if (DNSCurveParameter.IsEncryption)
			DNSCurveInit();
	}
#endif

//Mark Local DNS address to PTR Records, read Parameter(Monitor mode), IPFilter and Hosts.
	ParameterModificating.SetToMonitorItem();
	std::thread NetworkInformationMonitorThread(std::bind(NetworkInformationMonitor));
	NetworkInformationMonitorThread.detach();
	std::thread ReadParameterThread(std::bind(ReadParameter, false));
	ReadParameterThread.detach();
	std::thread ReadHostsThread(std::bind(ReadHosts));
	ReadHostsThread.detach();
	if (Parameter.OperationMode == LISTEN_MODE_CUSTOM || Parameter.DataCheck_Blacklist || Parameter.LocalRouting)
	{
		std::thread ReadIPFilterThread(std::bind(ReadIPFilter));
		ReadIPFilterThread.detach();
	}

#if defined(PLATFORM_WIN)
//Service initialization and start service.
	SERVICE_TABLE_ENTRYW ServiceTable[]{{SYSTEM_SERVICE_NAME, (LPSERVICE_MAIN_FUNCTIONW)ServiceMain}, {nullptr, nullptr}};
	if (!StartServiceCtrlDispatcherW(ServiceTable))
	{
		GlobalRunningStatus.Console = true;
		auto ErrorCode = GetLastError();
		
	//Print to screen.
		std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
		fwprintf_s(stderr, L"System Error: Service start error, error code is %lu.\n", ErrorCode);
		fwprintf_s(stderr, L"System Error: Program will continue to run in console mode.\n");
		fwprintf_s(stderr, L"Please ignore these error messages if you want to run in console mode.\n\n");
		ScreenMutex.unlock();

	//Handle the system signal and start all monitors.
		SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
		MonitorInit();
	}
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	MonitorInit();
#endif

	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))
	char FileName[PATH_MAX + 1U] = {0};
	if (getcwd(FileName, PATH_MAX) == nullptr)
	{
		std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
		fwprintf(stderr, L"Path initialization error.\n");

		return false;
	}
	if (!FileNameInit(FileName))
		return false;
#endif

//Screen output buffer setting
	if (setvbuf(stderr, NULL, _IONBF, 0) != 0)
	{
		auto ErrorCode = errno;
		std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
		fwprintf_s(stderr, L"Screen output buffer setting error, error code is %d.\n", ErrorCode);
		ScreenLock.unlock();
		PrintError(LOG_LEVEL_2, LOG_ERROR_NETWORK, L"Screen output buffer setting error", ErrorCode, nullptr, 0);

		return false;
	}

//Winsock initialization
#if defined(PLATFORM_WIN)
	WSAData WSAInitialization = {0};
	if (WSAStartup(MAKEWORD(WINSOCK_VERSION_HIGH, WINSOCK_VERSION_LOW), &WSAInitialization) != 0 || 
		LOBYTE(WSAInitialization.wVersion) != WINSOCK_VERSION_LOW || HIBYTE(WSAInitialization.wVersion) != WINSOCK_VERSION_HIGH)
	{
		auto ErrorCode = WSAGetLastError();
		std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
		fwprintf_s(stderr, L"Winsock initialization error, error code is %d.\n", ErrorCode);
		ScreenLock.unlock();
		PrintError(LOG_LEVEL_1, LOG_ERROR_NETWORK, L"Winsock initialization error", ErrorCode, nullptr, 0);

		return false;
	}
	else {
		GlobalRunningStatus.Initialization_WinSock = true;
	}

//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

			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))
			{
				auto ErrorCode = WSAGetLastError();
				std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
				fwprintf_s(stderr, L"Windows Firewall Test error, error code is %d.\n", ErrorCode);
				ScreenMutex.unlock();
				PrintError(LOG_LEVEL_2, LOG_ERROR_NETWORK, L"Windows Firewall Test error", ErrorCode, nullptr, 0);
			}

			return false;
		}
	#endif
	//Set system daemon.
	#if defined(PLATFORM_LINUX)
		else if (Commands == COMMAND_DISABLE_DAEMON)
		{
			GlobalRunningStatus.Daemon = false;
		}
	#endif
	//Print current version.
		else if (Commands == COMMAND_LONG_PRINT_VERSION || Commands == COMMAND_SHORT_PRINT_VERSION)
		{
			std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
			fwprintf_s(stderr, L"Pcap_DNSProxy ");
			fwprintf_s(stderr, FULL_VERSION);
			fwprintf_s(stderr, L"\n");

			return false;
		}
	//Print library version.
		else if (Commands == COMMAND_LIB_VERSION)
		{
			std::unique_lock<std::mutex> ScreenMutex(ScreenLock);

		#if (defined(ENABLE_LIBSODIUM) || defined(ENABLE_PCAP))
			std::wstring LibVersion;

			//LibSodium version
			#if defined(ENABLE_LIBSODIUM)
				if (MBSToWCSString(SODIUM_VERSION_STRING, strlen(SODIUM_VERSION_STRING), LibVersion))
					fwprintf_s(stderr, L"LibSodium version %ls\n", LibVersion.c_str());
			#endif

			//WinPcap or LibPcap version
			#if defined(ENABLE_PCAP)
				if (MBSToWCSString(pcap_lib_version(), strlen(pcap_lib_version()), LibVersion))
					fwprintf_s(stderr, L"%ls\n", LibVersion.c_str());
			#endif
		#else
			fwprintf(stderr, L"No any available libraries.\n");
		#endif

			return false;
		}
	//Print help messages.
		else if (Commands == COMMAND_LONG_HELP || Commands == COMMAND_SHORT_HELP)
		{
			std::unique_lock<std::mutex> ScreenMutex(ScreenLock);

			fwprintf_s(stderr, L"Pcap_DNSProxy ");
			fwprintf_s(stderr, FULL_VERSION);
		#if defined(PLATFORM_WIN)
			fwprintf_s(stderr, L"(Windows)\n");
		#elif defined(PLATFORM_OPENWRT)
			fwprintf(stderr, L"(OpenWrt)\n");
		#elif defined(PLATFORM_LINUX)
			fwprintf(stderr, L"(Linux)\n");
		#elif defined(PLATFORM_MACX)
			fwprintf(stderr, L"(Mac)\n");
		#endif
			fwprintf_s(stderr, COPYRIGHT_MESSAGE);
			fwprintf_s(stderr, L"\nUsage: Please visit ReadMe... files in Documents folder.\n");
			fwprintf_s(stderr, L"   -v/--version:          Print current version on screen.\n");
			fwprintf_s(stderr, L"   --lib-version:         Print current version of libraries on screen.\n");
			fwprintf_s(stderr, L"   -h/--help:             Print help messages on screen.\n");
			fwprintf_s(stderr, L"   --flush-dns:           Flush all DNS cache in program and system immediately.\n");
		#if defined(PLATFORM_WIN)
			fwprintf_s(stderr, L"   --first-setup:         Test local firewall.\n");
		#endif
			fwprintf_s(stderr, L"   -c/--config-file Path: Set path of configuration file.\n");
		#if defined(PLATFORM_LINUX)
			fwprintf(stderr, L"   --disable-daemon:      Disable daemon mode.\n");
		#endif

			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)
			{
				std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
				fwprintf(stderr, L"Commands error.\n");
				ScreenMutex.unlock();
				PrintError(LOG_LEVEL_1, LOG_ERROR_SYSTEM, L"Commands error", 0, nullptr, 0);

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

			//Path check.
				if (Commands.length() > MAX_PATH)
				{
					std::unique_lock<std::mutex> ScreenMutex(ScreenLock);
					fwprintf_s(stderr, L"Commands error.\n");
					ScreenLock.unlock();
					PrintError(LOG_LEVEL_1, LOG_ERROR_SYSTEM, L"Commands error", 0, nullptr, 0);

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

//Set system daemon.
#if defined(PLATFORM_LINUX)
	if (GlobalRunningStatus.Daemon && daemon(0, 0) == RETURN_ERROR)
	{
		PrintError(LOG_LEVEL_2, 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)
	GlobalRunningStatus.Path_Global->clear();
	GlobalRunningStatus.Path_Global->push_back(OriginalPath);
	GlobalRunningStatus.Path_Global->front().erase(GlobalRunningStatus.Path_Global->front().rfind(L"\\") + 1U);
	for (size_t Index = 0;Index < GlobalRunningStatus.Path_Global->front().length();++Index)
	{
		if ((GlobalRunningStatus.Path_Global->front()).at(Index) == L'\\')
		{
			GlobalRunningStatus.Path_Global->front().insert(Index, L"\\");
			++Index;
		}
	}
#elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX))
	GlobalRunningStatus.sPath_Global->clear();
	GlobalRunningStatus.sPath_Global->push_back(OriginalPath);
	GlobalRunningStatus.sPath_Global->front().append("/");
	std::wstring StringTemp;
	if (!MBSToWCSString(OriginalPath, PATH_MAX + 1U, StringTemp))
		return false;
	StringTemp.append(L"/");
	GlobalRunningStatus.Path_Global->clear();
	GlobalRunningStatus.Path_Global->push_back(StringTemp);
	StringTemp.clear();
#endif

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

	return true;
}