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;
}
Exemple #2
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;
}