Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
// 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);
}
Exemplo n.º 6
0
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 );
}