VOID InitInstance() { IniFile ini; std::string inipath("x360ce.ini"); if (!ini.Load(inipath)) CheckCommonDirectory(&inipath, "x360ce"); if (!ini.Load(inipath)) return; bool filelog; bool systemlog; ini.Get("Options", "FileLog", &filelog); ini.Get("Options", "SystemLog", &systemlog); if (systemlog) LogSystem(); if (filelog) { SYSTEMTIME systime; GetLocalTime(&systime); std::string processName; ModuleFileName(&processName); std::string logfile = StringFormat("x360ce_%s_%02u-%02u-%02u_%08u.log", processName.c_str(), systime.wYear, systime.wMonth, systime.wDay, GetTickCount()); LogFile(logfile); } // Get will initalize static InputHookManager object and we want to initialize it ASAP InputHookManager::Get(); }
bool InputHook::ReadGameDatabase() { IniFile ini; std::string inipath("x360ce.gdb"); if (!ini.Load(inipath)) CheckCommonDirectory(&inipath, "x360ce"); if (!ini.Load(inipath)) return false; PrintLog("Using game database file:"); PrintLog(ini.GetIniPath().c_str()); std::string processName; ModuleFileName(&processName); if (ini.Get(processName, "HookMask", &m_hookmask)) { ini.Get(processName, "Timeout", &m_timeout); std::string gameName; ini.Get(processName, "Name", &gameName); if (!gameName.empty()) PrintLog("InputHook found \"%s\" in database", gameName.c_str()); return true; } return false; }
void Config::ReadConfig() { SWIP ini; std::string inipath("x360ce.ini"); if (!ini.Load(inipath)) CheckCommonDirectory(&inipath, "x360ce"); if (!ini.Load(inipath)) return; static bool once_flag = false; if (!once_flag) { // Read global options ini.Get("Options", "Disable", &m_globalDisable); if (m_globalDisable) return; ini.Get("Options", "UseInitBeep", &m_initBeep, true); PrintLog("Using config file:"); PrintLog(ini.GetIniPath().c_str()); u32 ver = 0; ini.Get("Options", "Version", &ver); if (ver != VERSION_CONFIG) PrintLog("WARNING: Configuration file version mismatch detected"); once_flag = true; } // Read pad mappings for (u32 i = 0; i < XUSER_MAX_COUNT; ++i) { std::string section; std::string key = StringFormat("PAD%u", i + 1); if (!ini.Get("Mappings", key, §ion)) continue; u32 index = 0; if (!ini.Get(section, "UserIndex", &index)) index = i; // Require Controller copy constructor ControllerManager::Get().GetControllers().push_back(Controller(index)); Controller* pController = &ControllerManager::Get().GetControllers().back(); if (ReadPadConfig(pController, section, &ini)) ReadPadMapping(pController, section, &ini); } }
InputHook::InputHook() : m_hookmask(HOOK_COM), m_fakepidvid(MAKELONG(0x045E, 0x028E)), m_timeout(0), m_timeout_thread(INVALID_HANDLE_VALUE) { IniFile ini; std::string inipath("x360ce.ini"); if (!ini.Load(inipath)) CheckCommonDirectory(&inipath, "x360ce"); if (!ini.Load(inipath)) return; bool read_from_database = ReadGameDatabase(); if (!read_from_database) { if (!ini.Get("InputHook", "HookMask", &m_hookmask, HOOK_COM)) { bool check = false; ini.Get("InputHook", "HookLL", &check); if (check) m_hookmask |= HOOK_LL; ini.Get("InputHook", "HookCOM", &check); if (check) m_hookmask |= HOOK_COM; ini.Get("InputHook", "HookDI", &check); if (check) m_hookmask |= HOOK_DI; ini.Get("InputHook", "HookPIDVID", &check); if (check) m_hookmask |= HOOK_PIDVID; ini.Get("InputHook", "HookSA", &check); if (check) m_hookmask |= HOOK_SA; ini.Get("InputHook", "HookNAME", &check); if (check) m_hookmask |= HOOK_NAME; ini.Get("InputHook", "HookSTOP", &check); if (check) m_hookmask |= HOOK_STOP; ini.Get("InputHook", "HookWT", &check); if (check) m_hookmask |= HOOK_WT; } if (GetState(HOOK_PIDVID)) { u32 vid; u32 pid; ini.Get<u32>("InputHook", "FakeVID", &vid, 0x045E); ini.Get<u32>("InputHook", "FakePID", &pid, 0x028E); if (vid != 0x045E || pid != 0x28E) m_fakepidvid = MAKELONG(vid, pid); } } if (m_hookmask) { PrintLog("InputHook starting..."); // Initalize InputHook Devices for (u32 i = 0; i < XUSER_MAX_COUNT; ++i) { std::string section; std::string key = StringFormat("PAD%u", i + 1); if (!ini.Get("Mappings", key, §ion)) continue; u32 index = 0; if (!ini.Get(section, "UserIndex", &index)) index = i; std::string buffer; GUID productid = GUID_NULL; GUID instanceid = GUID_NULL; if (ini.Get(section, "ProductGUID", &buffer)) StringToGUID(&productid, buffer); if (ini.Get(section, "InstanceGUID", &buffer)) StringToGUID(&instanceid, buffer); if (!IsEqualGUID(productid, GUID_NULL) && !IsEqualGUID(instanceid, GUID_NULL)) { m_devices.push_back(InputHookDevice(index, productid, instanceid)); } } } if (!m_devices.empty()) { if (!read_from_database) ini.Get<u32>("InputHook", "Timeout", &m_timeout, 45); std::string maskname; if (MaskToName(&maskname, m_hookmask)) PrintLog("HookMask 0x%08X: %s", m_hookmask, maskname.c_str()); MH_Initialize(); if (GetState(HOOK_LL)) HookLL(); if (GetState(HOOK_COM)) HookCOM(); if (GetState(HOOK_DI)) HookDI(); if (GetState(HOOK_SA)) HookSA(); if (GetState(HOOK_WT)) HookWT(); MH_EnableHook(MH_ALL_HOOKS); } }