l2-unlegits/d3d9_proxy_loader/DllMain.cpp
2012-02-04 11:48:16 +00:00

165 lines
4.1 KiB
C++

#include "pch.h"
#include "d3d9_proxy.h"
// global variables
#pragma data_seg (".d3d9_shared")
HINSTANCE gl_hOriginalDll;
HINSTANCE gl_hThisInstance;
HINSTANCE gl_hL2Detect;
#pragma data_seg ()
FILE *g_fLog = NULL;
BOOL WINAPI DllMain( HINSTANCE hInstDLL, DWORD reason, LPVOID lpvReserved )
{
lpvReserved = NULL;
switch( reason )
{
case DLL_PROCESS_ATTACH:
{
gl_hThisInstance = hInstDLL;
DisableThreadLibraryCalls( hInstDLL );
D3D9Proxy_Initialize();
} break;
case DLL_PROCESS_DETACH:
{
D3D9Proxy_Uninitialize();
} break;
}
return TRUE;
}
void D3D9Proxy_Initialize()
{
// init Logger
ErrorLogger_Init();
ErrorLogger_Enable( true );
#ifdef _DEBUG
ErrorLogger_EnableLoggingToConsole( true );
#endif
g_fLog = fopen( "D3D9Proxy.log", "wt" );
ErrorLogger_SetLogFile( g_fLog );
ErrorLogger_SetAutoPrependErrorType( true );
#ifdef _DEBUG
ErrorLogger_SetWarnMessageLevel( LOG_DEBUGDUMP );
#else
ErrorLogger_SetWarnMessageLevel( LOG_WARNING );
#endif
log_error( LOG_OK, "D3D9Proxy_Initialize() called.\n" );
// Initialisation
gl_hOriginalDll = NULL;
gl_hThisInstance = NULL;
gl_hL2Detect = NULL;
}
void D3D9Proxy_Uninitialize()
{
log_error( LOG_OK, "D3D9Proxy_Uninitialize() called.\n" );
// Release the system's d3d9.dll
if( gl_hOriginalDll )
{
::FreeLibrary( gl_hOriginalDll );
gl_hOriginalDll = NULL;
log_error( LOG_DEBUG, "gl_hOriginalDll (d3d9) unloaded.\n" );
}
// Release L2Detect DLL
if( gl_hL2Detect )
{
::FreeLibrary( gl_hL2Detect );
gl_hL2Detect = NULL;
log_error( LOG_DEBUG, "gl_hL2Detect (L2Detect) unloaded.\n" );
}
// close logger
log_error( LOG_OK, "Closing log. Last message! Bye!\n=======================\n" );
ErrorLogger_FlushLogFile();
ErrorLogger_Enable( false );
#ifdef _DEBUG
ErrorLogger_EnableLoggingToConsole( false );
#endif
if( g_fLog )
{
ErrorLogger_SetLogFile( NULL );
fflush( g_fLog );
fclose( g_fLog );
g_fLog = NULL;
}
}
bool D3D9Proxy_LoadL2Detect()
{
if( gl_hL2Detect != NULL )
return true; // already loaded
gl_hL2Detect = LoadLibraryW( L"L2Detect_d.dll" );
if( gl_hL2Detect == NULL ) // first try failed
{
gl_hL2Detect = LoadLibraryW( L"L2Detect.dll" );
if( gl_hL2Detect == NULL )
{
log_error( LOG_ERROR, "Failed to load radar DLL! Tried to find L2Detect_d / L2Detect dlls.\n" );
return false;
}
else
log_error( LOG_OK, "Loaded L2Detect.dll at 0x%08X\n", gl_hL2Detect );
}
else
log_error( LOG_OK, "Loaded L2Detect_d.dll (debug version) at 0x%08X\n", gl_hL2Detect );
return true;
}
void LoadOriginalDll()
{
wchar_t buffer[MAX_PATH];
buffer[0] = 0;
// Getting path to system dir and to d3d8.dll
::GetSystemDirectory( buffer, MAX_PATH );
// Append dll name
wcscat( buffer, L"\\d3d9.dll" );
// try to load the system's d3d9.dll, if pointer empty
if( !gl_hOriginalDll ) gl_hOriginalDll = ::LoadLibrary( buffer );
// Debug
if( !gl_hOriginalDll )
{
log_error( LOG_ERROR, "LoadOriginalDll(): Original d3d9.dll not loaded!\n");
ErrorLogger_FlushLogFile();
::ExitProcess(0);
}
}
// Exported function (faking d3d9.dll's one-and-only export)
IDirect3D9* WINAPI Direct3DCreate9( UINT SDKVersion )
{
if( !gl_hOriginalDll ) LoadOriginalDll(); // looking for the "right d3d9.dll"
// Hooking IDirect3D Object from Original Library
typedef IDirect3D9 *(WINAPI* D3D9_Type)(UINT SDKVersion);
D3D9_Type D3DCreate9_fn = (D3D9_Type)GetProcAddress( gl_hOriginalDll, "Direct3DCreate9" );
// Debug
if( !D3DCreate9_fn )
{
log_error( LOG_ERROR, "Direct3DCreate9(): Pointer to original Direct3DCreate9 function not received!\n" );
ErrorLogger_FlushLogFile();
::ExitProcess(0); // exit the hard way
}
if( D3D9Proxy_LoadL2Detect() )
ErrorLogger_EnableLoggingToConsole( false );
// Request pointer from Original Dll.
IDirect3D9 *pIDirect3D9_orig = D3DCreate9_fn( SDKVersion );
// Return pointer to hooking Object instead of "real one"
return pIDirect3D9_orig;
}