static int HandleDemandResourceEvent(uintptr_t p) { char resPath[MAXPATH + 17]; ResManDemandEvent *event = reinterpret_cast<ResManDemandEvent*>(p); const char *ext = strchr(event->resRefWithExt, '.'); if (!ext) { return 0; } ++ext; snprintf(resPath, MAXPATH, "%s/%s/%s", resman.GetSourcePath(), ext, event->resRefWithExt); time_t modtime = GetLastModTime(resPath); if (modtime == -1 || event->minimum_mtime > modtime) { return 0; } FILE *pTemp = fopen(resPath, "rb"); if (pTemp == NULL) { resman.Log(3, "o Skip - Unable to open file: %s\n", resPath); return 0; } fseek(pTemp, 0, SEEK_END); unsigned long size = ftell(pTemp); fseek(pTemp, 0, SEEK_SET); char *pScriptBuffer = new char[size]; if (fread(pScriptBuffer, size, 1, pTemp) != 1) { resman.Log(3, "o Skip - Error reading file: %s\n", resPath); delete[] pScriptBuffer; pScriptBuffer = NULL; } fclose(pTemp); if (pScriptBuffer) { event->mtime = modtime; event->pData = (unsigned char*)pScriptBuffer; event->size = size; return 1; } return 0; }
int HookFunctions() { unsigned long old_RetrieveResEntry = FindHookRetrieveResEntry(); if (old_RetrieveResEntry) { resman.Log(0, "o RetrieveResEntry hooked at %x.\n", old_RetrieveResEntry); d_redirect (old_RetrieveResEntry, (unsigned long)RetrieveResEntry, d_ret_code_res, 12); *(unsigned long*)&RetrieveResEntry_orig = (unsigned long)&d_ret_code_res; } else { resman.Log(0, "! RetrieveResEntry locate failed.\n"); return 0; } unsigned long old_DemandRes = FindHookDemandRes(); if (old_DemandRes) { resman.Log(0, "o DemandRes hooked at %x.\n", old_DemandRes); d_redirect (old_DemandRes, (unsigned long)DemandRes, d_ret_code_dem, 12); *(unsigned long*)&DemandRes_orig = (unsigned long)&d_ret_code_dem; } else { resman.Log(0, "! DemandRes locate failed.\n"); return 0; } unsigned long old_Exists = 0x082B393C; if (old_Exists) { resman.Log(0, "o CExoResMan::Exists hooked at %x.\n", old_Exists); d_redirect (old_Exists, (unsigned long)CExoResMan__Exists, d_ret_code_exi, 11); *(unsigned long*)&CExoResMan__Exists_orig = (unsigned long)&d_ret_code_exi; } else { resman.Log(0, "! CExoResMan::Exists locate failed.\n"); return 0; } lastResRef[0] = 0x0; return 1; }