Code2
// D3D
LPDIRECT3DPIXELSHADER9 pShaders[MAX_SHADERS] = {0}; // 44 bytes each = 11,176 BYTES total.
LPDIRECT3DPIXELSHADER9 oShade = NULL;
LPDIRECT3DSURFACE9 pRenderSurfA = NULL;
LPDIRECT3DSURFACE9 pRenderSurfB = NULL;
LPDIRECT3DSURFACE9 pOffSurf = NULL;
LPDIRECT3DSURFACE9 pStencilSurf = NULL;
LPDIRECT3DSURFACE9 oDStencilSurface = NULL;
LPDIRECT3DSURFACE9 oSurface = NULL;
LPDIRECT3DTEXTURE9 TEX_OPFOR_A = NULL;
LPDIRECT3DTEXTURE9 TEX_OPFOR_B = NULL;
LPDIRECT3DTEXTURE9 TEX_MARINE_A = NULL;
LPDIRECT3DTEXTURE9 TEX_MARINE_B = NULL;
LPDIRECT3DTEXTURE9 TEX_SPETZ_A = NULL;
LPDIRECT3DTEXTURE9 TEX_SPETZ_B = NULL;
LPDIRECT3DTEXTURE9 TEX_SAS_A = NULL;
LPDIRECT3DTEXTURE9 TEX_SAS_B = NULL;
LPDIRECT3DDEVICE9 pDevice9 = NULL;
LPDIRECT3D9 Direct3D9 = NULL;
D3DPRESENT_PARAMETERS D3D_PP = {0};
LPDIRECT3DPIXELSHADER9 pShader = NULL;
D3DVIEWPORT9 Viewport = {0};
D3DSURFACE_DESC pDesc;
D3DRECT RectA = {0};
D3DRECT RectB = {0};
D3DLOCKED_RECT lRect;
PBYTE pBits = NULL;
INT BITSPERPIXEL = 32;
PBYTE Pixel;
HRESULT hRes = NULL;
PDWORD pVTable;
HWND hWND = NULL;
LPDIRECT3DDEVICE9 pDevice = NULL;
DWORD dwCreateDevice = NULL;
// COMMON
DWORD ScrnW;
DWORD ScrnH;
DWORD AspectRatioX;
DWORD AspectRatioY;
INT iColors = 0;
Entities Ents[512] = {0};
DWORD Box_Size = 10;
PDWORD IsInGame =
(PDWORD)0x0074E35C;
DWORD TargetX = NULL;
DWORD TargetY = NULL;
BYTE OPFOR = 0x0;
BYTE SPETZ = 0x0;
BYTE MARINE = 0x0;
BYTE Sas = 0x0;
INT Posx = 0;
INT Posy = 0;
INT TotalPixels = 0;
//INIT
BOOL InitShaders = FALSE;
//================================================== ============================
__declspec( naked )
VOID WINAPI CREATEDEVICE( VOID )
{
__asm
{
PUSH EBP
MOV EBP,ESP
PUSH [EBP+0x20]
PUSH [EBP+0x1C]
PUSH [EBP+0x18]
PUSH [EBP+0x14]
PUSH [EBP+0x10]
PUSH [EBP+0xC]
PUSH [EBP+0x8]
CALL [dwCreateDevice]
MOV EDX,[EBP+0x20]
MOV EDX,[EDX]
MOV [pDevice],EDX
POP EBP
RETN 0x1C
}
}
//================================================== ============================
VOID WINAPI THREAD( VOID )
{
while( pDevice == NULL )
Sleep( 100 );
RetourFunc( (PBYTE)pVTable[16],
(PBYTE)dwCreateDevice, 5 );
pVTable = (PDWORD)*(PDWORD)pDevice;
*(PDWORD)&pClear = (DWORD)DetourFunc
( (PBYTE)pVTable[43], (PBYTE)CLEAR, 5 );
*(PDWORD)&pEndScene = (DWORD)DetourFunc
( (PBYTE)pVTable[42], (PBYTE)ENDSCENE, 5 );
*(PDWORD)&pReset = (DWORD)DetourFunc
( (PBYTE)pVTable[16], (PBYTE)RESET, 5 );
*(PDWORD)&pDIP = (DWORD)DetourFunc
( (PBYTE)pVTable[82], (PBYTE)DIP, 5 );
}
//================================================== ============================
BOOL WINAPI DllMain( HMODULE hMod, DWORD dwReason, LPVOID lpvReserved )
{
if( dwReason == DLL_PROCESS_ATTACH )
{
DisableThreadLibraryCalls( hMod );
LPDIRECT3D9 LPD3D9 = Direct3DCreate9
( D3D_SDK_VERSION );
if( LPD3D9 != NULL )
{
pVTable = (PDWORD)*(PDWORD)LPD3D9;
LPD3D9->Release();
dwCreateDevice = (DWORD)DetourFunc
( (PBYTE)pVTable[16], (PBYTE)
CREATEDEVICE, 5 );
CreateThread( NULL ,NULL,
(LPTHREAD_START_ROUTINE)THREAD,
NULL, NULL,NULL );
}
}
else if( dwReason == DLL_PROCESS_DETACH )
{
}
return TRUE;
}
//================================================== ============================
HRESULT WINAPI RESET( LPDIRECT3DDEVICE9 pDevice9,
D3DPRESENT_PARAMETERS* PParameters )
{
if( InitShaders == TRUE )
{
// 44 bytes each = 11,176 BYTES total.
for( int i = 0;i < MAX_SHADERS;i++ )
D3D_RELEASE( pShaders[i] );
D3D_RELEASE( TEX_OPFOR_A );
D3D_RELEASE( TEX_OPFOR_B );
D3D_RELEASE( TEX_MARINE_A );
D3D_RELEASE( TEX_MARINE_B );
D3D_RELEASE( TEX_SPETZ_A );
D3D_RELEASE( TEX_SPETZ_B );
D3D_RELEASE( TEX_SAS_A );
D3D_RELEASE( TEX_SAS_B );
D3D_RELEASE( pOffSurf );
D3D_RELEASE( pRenderSurfA );
D3D_RELEASE( pRenderSurfB );
D3D_RELEASE( pStencilSurf );
InitShaders = FALSE;
}
return pReset( pDevice9, PParameters );
}
//================================================== ============================
HRESULT WINAPI ENDSCENE( LPDIRECT3DDEVICE9 pDevice9 )
{
pDevice9->GetViewport( &Viewport );
TargetX = 0;
TargetY = 0;
if( InitShaders == FALSE )
{
for( int i = 0;i < MAX_SHADERS;i++ )
{
// 44 bytes each = 11,176 BYTES total.
GenerateShader( &pShaders[i], pDevice9,
20, 20, 255, i + 1 );
}
GenerateTexture( pDevice9, &TEX_OPFOR_A,
D3DCOLOR_ARGB( 255, 255, 255, 20 ) ); // YELLOW
GenerateTexture( pDevice9, &TEX_OPFOR_B,
D3DCOLOR_ARGB( 255, 255, 20, 20 ) ); // RED
GenerateTexture( pDevice9, &TEX_MARINE_A,
D3DCOLOR_ARGB( 255, 128, 20, 255 ) ); // VIOLET
GenerateTexture( pDevice9, &TEX_MARINE_B,
D3DCOLOR_ARGB( 255, 20, 20, 255 ) ); // BLUE
GenerateTexture( pDevice9, &TEX_SPETZ_A,
D3DCOLOR_ARGB( 255, 20, 255, 20 ) ); // GREEN
GenerateTexture( pDevice9, &TEX_SPETZ_B,
D3DCOLOR_ARGB( 255, 185, 122, 87 ) ); // BROWN
GenerateTexture( pDevice9, &TEX_SAS_A,
D3DCOLOR_ARGB( 255, 255, 20, 255 ) ); // PINK
GenerateTexture( pDevice9, &TEX_SAS_B,
D3DCOLOR_ARGB( 255, 127, 122, 127 ) ); // GREY
AspectRatioX = Viewport.Width/240; // 240 x 180 | 4:3
AspectRatioY = Viewport.Height/180;
ScrnW = Viewport.Width/AspectRatioX;
ScrnH = Viewport.Height/AspectRatioY;
pDevice9->CreateOffscreenPlainSurface( ScrnW, ScrnH,
D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pOffSurf, NULL );
pDevice9->CreateRenderTarget( ScrnW, ScrnH,
D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE,
&pRenderSurfA, NULL );
pDevice9->CreateRenderTarget( ScrnW, ScrnH,
D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE,
&pRenderSurfB, NULL );
pDevice9->CreateDepthStencilSurface( ScrnW, ScrnH,
D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0,
FALSE, &pStencilSurf, NULL );
InitShaders = TRUE;
}
if( *IsInGame && iColors
&& InitShaders == TRUE )
{
pDevice->GetRenderTargetData
( pRenderSurfA, pOffSurf );
if( pOffSurf->LockRect( &lRect, NULL,
D3DLOCK_NOSYSLOCK | D3DLOCK_DONOTWAIT ) == S_OK )
{
SCAN( ScrnW, ScrnH, (PBYTE)
lRect.pBits, lRect.Pitch,
0, pDevice9);
pOffSurf->UnlockRect( );
}
if( iColors > 254 )
{
pDevice->GetRenderTargetData
( pRenderSurfB, pOffSurf );
if( pOffSurf->LockRect( &lRect, NULL,
D3DLOCK_NOSYSLOCK | D3DLOCK_DONOTWAIT ) == S_OK )
{
SCAN( ScrnW, ScrnH, (PBYTE)
lRect.pBits, lRect.Pitch,
255, pDevice9 );
pOffSurf->UnlockRect( );
}
}
for( int j = 0; j < iColors; j++ )
{
DWORD Exp_x = Ents[j].X;
DWORD Exp_y = Ents[j].Y;
D3DRECT HBOX;
if( Exp_x && Exp_y )
{
HBOX.x1 = Exp_x - Box_Size;
HBOX.y1 = Exp_y - Box_Size;
HBOX.x2 = Exp_x + Box_Size;
HBOX.y2 = Exp_y - (Box_Size - 1);
pClear( pDevice9, 1, &HBOX, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 255, 20, 128, 255 ), 0, 0 );
HBOX.x1 = Exp_x - Box_Size;
HBOX.y1 = Exp_y + (Box_Size - 1);
HBOX.x2 = Exp_x + Box_Size;
HBOX.y2 = Exp_y + Box_Size;
pClear( pDevice9, 1, &HBOX, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 255, 20, 128, 255 ), 0, 0 );
HBOX.x1 = Exp_x - Box_Size;
HBOX.y1 = Exp_y - Box_Size;
HBOX.x2 = Exp_x - (Box_Size - 1);
HBOX.y2 = Exp_y + Box_Size;
pClear( pDevice9, 1, &HBOX, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 255, 20, 128, 255 ), 0, 0 );
HBOX.x1 = Exp_x + (Box_Size - 1);
HBOX.y1 = Exp_y - Box_Size;
HBOX.x2 = Exp_x + Box_Size;
HBOX.y2 = Exp_y + Box_Size;
pClear( pDevice9, 1, &HBOX, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 255, 20, 128, 255 ), 0, 0 );
Ents[j].X = 0;
Ents[j].Y = 0;
}
}
if( GetAsyncKeyState( VK_XBUTTON2 ) < 0 )
{
if( TargetX && TargetY )
{
POINT Target;
DWORD ScrX = Viewport.Width/2;
DWORD ScrY = Viewport.Height/2;
if(TargetX > (ScrX)){
Target.x = TargetX - (ScrX);
Target.x /= 4;
Target.x = +Target.x;
}
if(TargetX < (ScrX)){
Target.x = (ScrX) - TargetX;
Target.x /= 4;
Target.x = -Target.x;
}
if(TargetX == (ScrX)){
Target.x = 0;
}
if(TargetY > (ScrY)){
Target.y = TargetY - (ScrY);
Target.y /= 4;
Target.y = +Target.y;
}
if(TargetY < (ScrY)){
Target.y = (ScrY) - TargetY;
Target.y /= 4;
Target.y = -Target.y;
}
if(TargetY == (ScrY)){
Target.y = 0;
}
mouse_event( MOUSEEVENTF_MOVE,
Target.x, Target.y, NULL, NULL );
}
}
iColors = 0;
}
if( GetAsyncKeyState( VK_NUMPAD1 ) &1 )
D3DXSaveSurfaceToFileA( "c:\\Image.jpg",
D3DXIFF_JPG,pOffSurf,NULL,NULL);
DWORD ScrX = Viewport.Width / 2;
DWORD ScrY = Viewport.Height / 2;
RectA.x1 = ScrX - 4;
RectA.y1 = ScrY - 1;
RectA.x2 = ScrX + 3;
RectA.y2 = ScrY;
RectB.x1 = ScrX - 1;
RectB.y1 = ScrY - 4;
RectB.x2 = ScrX;
RectB.y2 = ScrY + 3;
pClear( pDevice9, 1, &RectA, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 255, 255, 20, 20 ), 0, 0 );
pClear( pDevice9, 1, &RectB, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 255, 255, 20, 20 ), 0, 0 );
return pEndScene( pDevice9 );
}
//================================================== ============================
// MoonBase Chaser343
float WINAPI GetDistance( float * LocationA, float * LocationB )
{
float DistanceX = LocationA[0] - LocationB[0];
float DistanceY = LocationA[1] - LocationB[1];
float DistanceZ = LocationA[2] - LocationB[2];
return (float)sqrt( ( DistanceX * DistanceX ) +
( DistanceY * DistanceY ) + ( DistanceZ * DistanceZ ) );
}
//================================================== ============================
VOID WINAPI SCAN( DWORD ScrnW, DWORD ScrnH,
PBYTE pBits, INT Pitch, INT Start,
LPDIRECT3DDEVICE9 pDevice9 )
{
float MainDistance = 999999.0f;
for( int i = Start; i < iColors; i++ )
{
Posx = 0;
Posy = 0;
Ents[i].X = 0;
Ents[i].Y = 0;
TotalPixels = 0;
for( DWORD scy = 1L; scy <= ScrnH; scy++ )
{
for( DWORD scx = 1L; scx <= ScrnW; scx++ )
{
Pixel = ( PBYTE ) pBits;
Pixel += ( ( scy * Pitch )
+ ( scx * ( BITSPERPIXEL / 8 ) ) );
if( *(PDWORD)Pixel != NULL )
{
if( Pixel[3] == (i + 1) )
{
Posx += scx;
Posy += scy;
TotalPixels++;
}
}
}
}
if( Posx && Posy && TotalPixels )
{
Posx /= TotalPixels;
Posy /= TotalPixels;
Ents[i].X = Posx * AspectRatioX;
Ents[i].Y = Posy * AspectRatioY;
FLOAT vIn1[3];
FLOAT vIn2[3];
vIn1[0] = (float)Ents[i].X;
vIn1[1] = (float)Ents[i].Y;
vIn1[2] = 0.0f;
vIn2[0] = (float)Viewport.Width/2;
vIn2[1] = (float)Viewport.Height/2;
vIn2[2] = 0.0f;
float Distance = GetDistance
( vIn1, vIn2 );
if( Distance < MainDistance )
{
MainDistance = Distance;
TargetX = Ents[i].X;
TargetY = Ents[i].Y;
}
}
}
}
//================================================== ============================
HRESULT WINAPI DIP( LPDIRECT3DDEVICE9 pDevice9, D3DPRIMITIVETYPE Type,
INT BaseIndex, UINT MinIndex, UINT NumVertices,
UINT StartIndex, UINT PCount )
{
LPDIRECT3DVERTEXBUFFER9 Stream_Data;
UINT Offset = 0;
UINT Stride = 0;
if( pDevice9->GetStreamSource(0, &Stream_Data,
&Offset, &Stride) == D3D_OK )
Stream_Data->Release();
if( Opfor ) OPFOR = 0x1;
else
OPFOR = 0x0;
if( Spetz ) SPETZ = 0x1;
else
SPETZ = 0x0;
if( Marines ) MARINE = 0x1;
else
MARINE = 0x0;
if( SAS ) Sas = 0x1;
else
Sas = 0x0;
// Get
pDevice9->GetRenderTarget
( 0, &oSurface );
pDevice9->GetDepthStencilSurface
( &oDStencilSurface );
pDevice9->GetPixelShader
( &oShade );
oSurface->GetDesc
( &pDesc );
if( OPFOR || SPETZ || MARINE || Sas )
if( !Smoke )
if( pDesc.Width == Viewport.Width &&
pDesc.Height == Viewport.Height &&
InitShaders == TRUE )
{
// Switch
if( iColors < 255 )
pDevice9->SetRenderTarget
( 0, pRenderSurfA );
else
pDevice9->SetRenderTarget
( 0, pRenderSurfB );
pDevice9->SetDepthStencilSurface
( pStencilSurf );
pDevice9->SetRenderState
( D3DRS_ZENABLE, FALSE );
if( iColors < 255 )
pDevice9->SetPixelShader
( pShaders[iColors] );
else
pDevice9->SetPixelShader
( pShaders[iColors - 255] );
// Draw
pDIP( pDevice9, Type, BaseIndex, MinIndex,
NumVertices, StartIndex, PCount );
pDevice9->SetRenderState
( D3DRS_ZENABLE, TRUE );
// Draw
pDIP( pDevice9, Type, BaseIndex, MinIndex,
NumVertices, StartIndex, PCount );
// Switch
pDevice9->SetRenderTarget
( 0, oSurface );
pDevice9->SetDepthStencilSurface
( oDStencilSurface );
pDevice9->SetPixelShader
( oShade );
if( OPFOR )
pDevice9->SetTexture( 0, TEX_OPFOR_B );
else if( SPETZ )
pDevice9->SetTexture( 0, TEX_SPETZ_B );
else if( MARINE )
pDevice9->SetTexture( 0, TEX_MARINE_B );
else if( Sas )
pDevice9->SetTexture( 0, TEX_SAS_B );
pDevice9->SetRenderState
( D3DRS_ZENABLE, FALSE );
// Draw
pDIP( pDevice9, Type, BaseIndex, MinIndex,
NumVertices, StartIndex, PCount );
if( OPFOR )
pDevice9->SetTexture( 0, TEX_OPFOR_A );
else if( SPETZ )
pDevice9->SetTexture( 0, TEX_SPETZ_A );
else if( MARINE )
pDevice9->SetTexture( 0, TEX_MARINE_A );
else if( Sas )
pDevice9->SetTexture( 0, TEX_SAS_A );
pDevice9->SetRenderState
( D3DRS_ZENABLE, TRUE );
if( iColors < 510 )
iColors++;
}
// Release
D3D_RELEASE( oSurface );
D3D_RELEASE( oDStencilSurface );
D3D_RELEASE( oShade );
// Draw
return pDIP( pDevice9, Type, BaseIndex, MinIndex,
NumVertices, StartIndex, PCount );
}
//================================================== ============================
HRESULT WINAPI CLEAR( LPDIRECT3DDEVICE9 pDevice9, DWORD Count,
CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color,
float Z, DWORD Stencil )
{
pDevice9->GetDepthStencilSurface
( &oDStencilSurface );
pDevice9->GetRenderTarget
( 0, &oSurface );
oSurface->GetDesc
( &pDesc );
if( pDesc.Width == Viewport.Width &&
pDesc.Height == Viewport.Height &&
InitShaders == TRUE )
{
pDevice9->SetRenderTarget
( 0, pRenderSurfA );
pClear( pDevice9, 0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 0, 0, 0, 0 ), 0, 0 );
pDevice9->SetRenderTarget
( 0, pRenderSurfB );
pClear( pDevice9, 0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_ARGB( 0, 0, 0, 0 ), 0, 0 );
pDevice9->SetRenderTarget
( 0, oSurface );
pDevice9->SetDepthStencilSurface
( pStencilSurf );
pClear( pDevice9, Count, pRects, Flags,
Color, Z, Stencil );
pDevice9->SetDepthStencilSurface
( oDStencilSurface );
}
D3D_RELEASE( oSurface );
D3D_RELEASE( oDStencilSurface );
return pClear( pDevice9, Count, pRects, Flags,
Color, Z, Stencil );
}
//================================================== ============================
PVOID WINAPI DetourFunc( PBYTE src, CONST PBYTE dst, CONST INT len )
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}
//================================================== ============================
BOOL WINAPI RetourFunc( PBYTE src, PBYTE restore, CONST INT len )
{
DWORD dwback;
if(!VirtualProtect(src, len, PAGE_READWRITE, &dwback)) { return FALSE; }
if(!memcpy(src, restore, len)) { return FALSE; }
restore[0] = 0xE9;
*(DWORD*)(restore+1) = (DWORD)(src - restore) - 5;
if(!VirtualProtect(src, len, dwback, &dwback)) { return FALSE; }
return TRUE;
}
//================================================== ============================
HRESULT WINAPI GenerateShader( IDirect3DPixelShader9 **Shader_Name,
IDirect3DDevice9 *Device, int red, int green, int blue, int alpha )
{
ID3DXBuffer *MyBuffer = NULL;
char MyShader[ 256 ];
sprintf( MyShader, "ps_3_0\ndef c0, %f, %f, %f, %f\nmov oC0, c0",
(float)red/(float)255, (float)green/(float)255, (float)blue/(float)255,
(float)alpha/(float)255 );
D3DXAssembleShader( MyShader, sizeof( MyShader ),
NULL, NULL, 0, &MyBuffer , NULL );
if( FAILED( Device->CreatePixelShader((const DWORD*)
MyBuffer->GetBufferPointer(), Shader_Name)) )
return E_FAIL;
return S_OK;
}
//================================================== ============================
VOID WINAPI GenerateTexture( LPDIRECT3DDEVICE9 pDevice,
IDirect3DTexture9 **ppD3Dtex, DWORD colour32 )
{
IDirect3DTexture9 * Temp_tex;
if( SUCCEEDED(pDevice->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4,
D3DPOOL_DEFAULT, ppD3Dtex, NULL)) )
{
if( SUCCEEDED(pDevice->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4,
D3DPOOL_SYSTEMMEM, &Temp_tex, NULL)) )
{
WORD colour16 =
((WORD)((colour32>>28)&0xF)<<12)
|(WORD)(((colour32>>20)&0xF)<<8)
|(WORD)(((colour32>>12)&0xF)<<4)
|(WORD)(((colour32>>4)&0xF)<<0);
D3DLOCKED_RECT d3dlr;
if( Temp_tex->LockRect( 0, &d3dlr, 0,
D3DLOCK_DONOTWAIT | D3DLOCK_NOSYSLOCK
| D3DLOCK_DISCARD ) == S_OK )
{
WORD *pDst16 = (WORD*)d3dlr.pBits;
for(int xy=0; xy < 8*8; xy++)
*pDst16++ = colour16;
Temp_tex->UnlockRect( 0 );
}
if( Temp_tex != NULL )
{
pDevice->UpdateTexture( Temp_tex, *ppD3Dtex );
Temp_tex->Release();
}
}
}
}
//================================================== ============================
//
//================================================== ============================