/*
本源码由TC简单软件科技有限公司开源,功能可以自由修改、发布、
长沙简单软件科技有限公司对于源码不做后期维护,,请大家在使用过程中遵循开源协议
*/

#pragma once

#include "TSMessage.h"
#include "KeyMouse/MyKeyboardNamespace.h"
#include "KeyMouse/MyMouseNamespace.h"

////TS保护盾的其他属性
#define TSPROTECT_HIDE    0x00000001L  //"phide [pid]" : 保护指定进程以及进程内的窗口不被非法访问.默认保护当前进程.(此模式需要加载驱动,目前仅支持32位系统)
#define TSPROTECT_HIDE2    0x00000002L	//"phide2 [pid]" : 同phide. 只是进程不隐藏(可在任务管理器中操作)

typedef void* HMEMORYLOADER;
void MemoryFreeLibrary(HMEMORYLOADER mod);
class DXBind;
class TSRuntime
{
public:
	static MyMouseNamespace    g_Mouse;
	static MyKeyboardNamespace g_KeyBoard;
	static DXBind g_DxObj;  //DX后台操作对象,全局唯一,就是一个com只能绑定一个窗口,多窗口就要多实例化几次了          
	static CMessageData* pData;	      //定义为静态类成员,方便保存共享数据指针
	static HANDLE MapViewThread;      //保存检测共享内存线程,方便卸载时调用TerminateThread结束线程
	static DWORD m_displayMode;
	static DWORD m_dwExStyle;
	static wchar_t RetStr[MAX_PATH * 4];
	static wchar_t  SetPath[MAX_PATH];
	static LPOLESTR KeyPressCharMap[0x100];	  //256个键位
	static BYTE VirtualToASCIIMap[0x100];  //256个键位
	static BYTE keyMap[0x100];
	static BYTE KeyPressMap[0x100];
	static BYTE RawInputKeyPressMap[0x100];
	static BYTE KeyPressMap_Mouse[0x100];
	static bool IsVipLogin;
	static bool IsRegLogin;
	static DWORD g_nChecktime;//记录时间
	static bool IsStartProtect;
	static HANDLE h_checkthread;//验证线程句柄
	static INT64 checkthreadtime;//校验线程时间
	static bool g_IsSYSKEY;//按下系统键例如:ATL
	static pMyDictInfo MyDictCount[20]; //存储当前所有字库,默认最大字库个数为20个
	static int nMaxStrHight[20]; //记录每个字库中,最高的字高.
	static int nMyDictCountsize[20]; //记录每个字库的数量
	static int NowUsingDictIndex;//记录当前正在使用字库的下标
	static COLORREF pLoadstrBuffer[11][MAX_PATH];//存储字库点阵还原图片颜色矩阵COLORREF
	static char bytestr[1024 * 3]; //存储点阵二进制信息最大存储为250*11
	static bool IsVirtualProtectEx;//是否驱动模式远程修改注入进程的页面保护属性
	static HWND hookHwnd;//记录要注入的窗口句柄
	static HMEMORYLOADER myUser32module;
	static HMEMORYLOADER mykernel32module;
	static bool IsInitialmyUser32module;
	static bool IsInitialmykernel32module;
	static wchar_t membstr[MAX_PATH * 400];
	static bool IsShowErrorMsg;
	static bool IsNpProtect;
	static bool IsWin7X64;
	static bool IsWin8X64;
	static DWORD IsProid;
	static DWORD ProtectPid[20];
	static wchar_t Regcode[MAX_PATH];//记录注册码信息
	static wchar_t VipCountCode[MAX_PATH];//记录VIP用户账户信息
	static DWORD ZwProtectVirtualMemoryRet;
	static wchar_t SetDictPwdString[MAX_PATH];
	static wchar_t SetPicPwdString[MAX_PATH];
	static wchar_t MachineCode[MAX_PATH];//
	static bool IsLoginlog;
	static BYTE SetSimModeType;
	static bool g_IsLoadDrive;
	//static CComBSTR newbstr;
public:
	static HWND  GetProcessMainWnd(DWORD  dwProcessId);	 //获取自身窗口句柄
	static void getMode(wchar_t* mouse, wchar_t* key, wchar_t* display, DWORD& dwMouse, DWORD& dwKey, DWORD& dwDisplay);
	static void my_split(TCHAR* sourcestr, TCHAR* oldstr, TCHAR(*temp)[28], int& rlen);
	static void add_log(const char* fmt, ...);
	static int  InitialWindowsVersion();//获取系统版本
	static bool EnablePrivilege(LPCTSTR pszPrivName, bool fEnable);
	static void initial();
	static bool  MyWriteMemory(IN PWriteMemoryInfo WriteInfo);
	static int VipLogin(wchar_t* regcode, int type, bool isvip = true);
	static bool GetComPath(TCHAR* Path);
	static bool StartProtect(long enable, long type, int Pid = 0);
	static void InitKeyPressCharMap();//初始化KeyPressCharMap
	static void InitVirtualToASCIIMap();
	static void InitKeyMap();
	static void InitKeyPressMap();
	static int retrunLparamDown(int key);
	static BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize);
	static BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize);
	static DWORD GetPassR3HookFuntionAddr(char* modename, char* funname);
	static HMODULE GetRemoteModuleHandle(const wchar_t* module, short nPID);//获取指定进程ID的DLL模块句柄
	static HMODULE TSRuntime::GetRemoteModuleBase(const wchar_t* module, short nPID);
	static DWORD GetRemoteModuleBaseAddr(const wchar_t* module, short nPID);//获取指定进程ID的DLL模块地址
	static bool GetRemoteModulePath(const wchar_t* module, short nPID, wchar_t* modulepath);//获取指定进程ID的DLL模块路径
	static FARPROC GetRemoteProcAddress(wchar_t* module, const char* func, short nPID);//获取指定进程ID的DLL模块函数的地址
	static bool MyLoadLibrary();
private:
	TSRuntime(void);
	~TSRuntime(void);
};

////访问控制
//class TsMutex//创建临界区和销毁临界区
//{
//public:
//   TsMutex();
//   ~TsMutex();
//   CRITICAL_SECTION m_mutex;
//   void lock();
//   void unlock();
//
//};
//
//class TsMutexlock//进入和离开临界区
//{
//public:
//	TsMutexlock(TsMutex *ptcmutex);
//	~TsMutexlock();
//	TsMutex *m_ptcmutex;
//};
