void New_R_DrawSkyBoxEx (void) { bool replaced; if(g_R_DrawSkyBoxEx_NewTextures) { replaced = true; MdtMemBlockInfos mbis; MdtMemAccessBegin((LPVOID)HL_ADDR_GET(skytextures), 6*sizeof(GLuint), &mbis); memcpy(g_oldSkyTextures, (LPVOID)HL_ADDR_GET(skytextures), 6*sizeof(GLuint)); memcpy((LPVOID)HL_ADDR_GET(skytextures), g_R_DrawSkyBoxEx_NewTextures, 6*sizeof(GLuint)); MdtMemAccessEnd(&mbis); } else replaced = false; g_Old_R_DrawSkyBoxEx(); if(replaced) { MdtMemBlockInfos mbis; MdtMemAccessBegin((LPVOID)HL_ADDR_GET(skytextures), 6*sizeof(GLuint), &mbis); memcpy((LPVOID)HL_ADDR_GET(skytextures), g_oldSkyTextures, 6*sizeof(GLuint)); MdtMemAccessEnd(&mbis); } }
void *DetourVoidClassFunc(BYTE *src, const BYTE *dst, const int len) { BYTE *jmp = (BYTE*)MdtAllocExecuteableMemory(len+JMP32_SZ+POPREG_SZ); MdtMemBlockInfos mbis; MdtMemAccessBegin(src, len, &mbis); memcpy(jmp+1, src, len); // calculate callback function call jmp[0] = POP_ECX; // pop ecx jmp[len+1] = JMP; // jmp *(DWORD*)(jmp+len+2) = (DWORD)((src+len) - (jmp+len+1)) - JMP32_SZ; // detour source function call src[0] = 0x87; // XCHG ecx, [esp] src[1] = 0x0c; // . src[2] = 0x24; // . src[3] = PUSH_ECX; // push ecx src[4] = JMP; // jmp *(DWORD*)(src+5) = (DWORD)(dst - (src+4)) - JMP32_SZ; memset(src+9, NOP, len - 9); MdtMemAccessEnd(&mbis); return jmp; }
void *DetourClassFunc(BYTE *src, const BYTE *dst, const int len) { BYTE *jmp = (BYTE*)MdtAllocExecuteableMemory(len+JMP32_SZ+POPREG_SZ+POPREG_SZ+POPREG_SZ); MdtMemBlockInfos mbis; MdtMemAccessBegin(src, len, &mbis); memcpy(jmp+3, src, len); // calculate callback function call jmp[0] = POP_EAX; // pop eax jmp[1] = POP_ECX; // pop ecx jmp[2] = PUSH_EAX; // push eax jmp[len+3] = JMP; // jmp *(DWORD*)(jmp+len+4) = (DWORD)((src+len) - (jmp+len+3)) - JMP32_SZ; // detour source function call src[0] = POP_EAX; // pop eax; src[1] = PUSH_ECX; // push ecx src[2] = PUSH_EAX; // push eax src[3] = JMP; // jmp *(DWORD*)(src+4) = (DWORD)(dst - (src+3)) - JMP32_SZ; memset(src+8, NOP, len - 8); MdtMemAccessEnd(&mbis); return jmp; }
void Asm32ReplaceWithJmp(void * replaceAt, size_t countBytes, void * jmpTo) { MdtMemBlockInfos mbis; MdtMemAccessBegin(replaceAt, countBytes, &mbis); memset(replaceAt, NOP, countBytes); ((BYTE *)replaceAt)[0] = JMP; *(DWORD*)((BYTE *)replaceAt+1) = (DWORD)((BYTE *)jmpTo - (BYTE *)replaceAt) - JMP32_SZ; MdtMemAccessEnd(&mbis); }
// Detour void *DetourApply(BYTE *orig, BYTE *hook, int len) { MdtMemBlockInfos mbis; BYTE *jmp = (BYTE*)MdtAllocExecuteableMemory(len+JMP32_SZ); MdtMemAccessBegin(orig, len, &mbis); memcpy(jmp, orig, len); jmp += len; // increment to the end of the copied bytes jmp[0] = JMP; *(DWORD*)(jmp+1) = (DWORD)(orig+len - jmp) - JMP32_SZ; memset(orig, NOP, len); orig[0] = JMP; *(DWORD*)(orig+1) = (DWORD)(hook - orig) - JMP32_SZ; MdtMemAccessEnd(&mbis); return (jmp-len); }
void __stdcall CrosshairFix_Hooking_Func( DWORD *this_ptr, float fUnkTime, DWORD dwUnkWeaponCode ) { static float oldClientTime = 0; static double deltaT = 0; bool freezeCh = g_Cstrike_CrossHair_Block; bool fix = !freezeCh && 0.0 < g_cstrike_ch_frameT; if(fix) { double frameTime = pEngfuncs->pfnGetCvarFloat("host_framerate"); if(0 >= frameTime) frameTime = *g_phost_frametime; deltaT += frameTime; bool coolDown = g_cstrike_ch_frameT <= deltaT; if(coolDown) { // apply cooldown: bool doLoop; GLboolean oldMasks[5]; do { deltaT -= g_cstrike_ch_frameT; doLoop = g_cstrike_ch_frameT <= deltaT; if(doLoop) { glGetBooleanv(GL_COLOR_WRITEMASK, oldMasks); glGetBooleanv(GL_DEPTH_WRITEMASK, &(oldMasks[4])); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_FALSE); } g_pfnCrosshairFix_Hooked_Func( this_ptr, fUnkTime, dwUnkWeaponCode ); if(doLoop) { glColorMask(oldMasks[0], oldMasks[1], oldMasks[2], oldMasks[3]); glDepthMask(oldMasks[4]); } } while(doLoop); return; // done. } else // keep it frozen: freezeCh = true; } if(freezeCh) { // do not apply any cool down, just make it drawn: MdtMemBlockInfos mbisMul, mbisAdd; double fOldMulFac, fOldAddFac; MdtMemAccessBegin(g_f_ch_mul_fac, sizeof(double), &mbisMul); MdtMemAccessBegin(g_f_ch_add_fac, sizeof(double), &mbisAdd); fOldMulFac = *g_f_ch_mul_fac; fOldAddFac = *g_f_ch_add_fac; *g_f_ch_mul_fac = 0.0f; *g_f_ch_add_fac = 0.0f; g_pfnCrosshairFix_Hooked_Func( this_ptr, fUnkTime, dwUnkWeaponCode ); *g_f_ch_mul_fac = fOldMulFac; *g_f_ch_add_fac = fOldAddFac; MdtMemAccessEnd(&mbisAdd); MdtMemAccessEnd(&mbisMul); } else // Normal (unfixed) operation. g_pfnCrosshairFix_Hooked_Func( this_ptr, fUnkTime, dwUnkWeaponCode ); }