mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
121 lines
6.2 KiB
C++
121 lines
6.2 KiB
C++
|
//------------------------------------------------------------------------------
|
||
|
// Tiny DirectDraw Proxy DLL v1.0 [28.05.2010]
|
||
|
// Copyright 2010 Evgeny Vrublevsky <veg@tut.by>
|
||
|
//------------------------------------------------------------------------------
|
||
|
#define APP_NAME "Tiny DirectDraw Proxy"
|
||
|
#define APP_VERSION "1.0 [28.05.2010]"
|
||
|
|
||
|
#define WIN32_LEAN_AND_MEAN
|
||
|
#include <windows.h>
|
||
|
#include <ctype.h>
|
||
|
|
||
|
void InitDxWnd(void);
|
||
|
void DxWndEndHook(void);
|
||
|
|
||
|
struct ddraw_dll
|
||
|
{
|
||
|
HMODULE dll;
|
||
|
FARPROC AcquireDDThreadLock;
|
||
|
FARPROC CheckFullscreen;
|
||
|
FARPROC CompleteCreateSysmemSurface;
|
||
|
FARPROC D3DParseUnknownCommand;
|
||
|
FARPROC DDGetAttachedSurfaceLcl;
|
||
|
FARPROC DDInternalLock;
|
||
|
FARPROC DDInternalUnlock;
|
||
|
FARPROC DSoundHelp;
|
||
|
FARPROC DirectDrawCreate;
|
||
|
FARPROC DirectDrawCreateClipper;
|
||
|
FARPROC DirectDrawCreateEx;
|
||
|
FARPROC DirectDrawEnumerateA;
|
||
|
FARPROC DirectDrawEnumerateExA;
|
||
|
FARPROC DirectDrawEnumerateExW;
|
||
|
FARPROC DirectDrawEnumerateW;
|
||
|
FARPROC DllCanUnloadNow;
|
||
|
FARPROC DllGetClassObject;
|
||
|
FARPROC GetDDSurfaceLocal;
|
||
|
FARPROC GetOLEThunkData;
|
||
|
FARPROC GetSurfaceFromDC;
|
||
|
FARPROC RegisterSpecialCase;
|
||
|
FARPROC ReleaseDDThreadLock;
|
||
|
} ddraw;
|
||
|
|
||
|
__declspec(naked) void FakeAcquireDDThreadLock() { _asm { jmp [ddraw.AcquireDDThreadLock] } }
|
||
|
__declspec(naked) void FakeCheckFullscreen() { _asm { jmp [ddraw.CheckFullscreen] } }
|
||
|
__declspec(naked) void FakeCompleteCreateSysmemSurface() { _asm { jmp [ddraw.CompleteCreateSysmemSurface] } }
|
||
|
__declspec(naked) void FakeD3DParseUnknownCommand() { _asm { jmp [ddraw.D3DParseUnknownCommand] } }
|
||
|
__declspec(naked) void FakeDDGetAttachedSurfaceLcl() { _asm { jmp [ddraw.DDGetAttachedSurfaceLcl] } }
|
||
|
__declspec(naked) void FakeDDInternalLock() { _asm { jmp [ddraw.DDInternalLock] } }
|
||
|
__declspec(naked) void FakeDDInternalUnlock() { _asm { jmp [ddraw.DDInternalUnlock] } }
|
||
|
__declspec(naked) void FakeDSoundHelp() { _asm { jmp [ddraw.DSoundHelp] } }
|
||
|
// HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter );
|
||
|
__declspec(naked) void FakeDirectDrawCreate() { _asm { jmp [ddraw.DirectDrawCreate] } }
|
||
|
// HRESULT WINAPI DirectDrawCreateClipper( DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR *lplpDDClipper, IUnknown FAR *pUnkOuter );
|
||
|
__declspec(naked) void FakeDirectDrawCreateClipper() { _asm { jmp [ddraw.DirectDrawCreateClipper] } }
|
||
|
// HRESULT WINAPI DirectDrawCreateEx( GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter );
|
||
|
__declspec(naked) void FakeDirectDrawCreateEx() { _asm { jmp [ddraw.DirectDrawCreateEx] } }
|
||
|
// HRESULT WINAPI DirectDrawEnumerateA( LPDDENUMCALLBACKA lpCallback, LPVOID lpContext );
|
||
|
__declspec(naked) void FakeDirectDrawEnumerateA() { _asm { jmp [ddraw.DirectDrawEnumerateA] } }
|
||
|
// HRESULT WINAPI DirectDrawEnumerateExA( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags );
|
||
|
__declspec(naked) void FakeDirectDrawEnumerateExA() { _asm { jmp [ddraw.DirectDrawEnumerateExA] } }
|
||
|
// HRESULT WINAPI DirectDrawEnumerateExW( LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags );
|
||
|
__declspec(naked) void FakeDirectDrawEnumerateExW() { _asm { jmp [ddraw.DirectDrawEnumerateExW] } }
|
||
|
// HRESULT WINAPI DirectDrawEnumerateW( LPDDENUMCALLBACKW lpCallback, LPVOID lpContext );
|
||
|
__declspec(naked) void FakeDirectDrawEnumerateW() { _asm { jmp [ddraw.DirectDrawEnumerateW] } }
|
||
|
__declspec(naked) void FakeDllCanUnloadNow() { _asm { jmp [ddraw.DllCanUnloadNow] } }
|
||
|
__declspec(naked) void FakeDllGetClassObject() { _asm { jmp [ddraw.DllGetClassObject] } }
|
||
|
__declspec(naked) void FakeGetDDSurfaceLocal() { _asm { jmp [ddraw.GetDDSurfaceLocal] } }
|
||
|
__declspec(naked) void FakeGetOLEThunkData() { _asm { jmp [ddraw.GetOLEThunkData] } }
|
||
|
__declspec(naked) void FakeGetSurfaceFromDC() { _asm { jmp [ddraw.GetSurfaceFromDC] } }
|
||
|
__declspec(naked) void FakeRegisterSpecialCase() { _asm { jmp [ddraw.RegisterSpecialCase] } }
|
||
|
__declspec(naked) void FakeReleaseDDThreadLock() { _asm { jmp [ddraw.ReleaseDDThreadLock] } }
|
||
|
|
||
|
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||
|
{
|
||
|
char path[MAX_PATH];
|
||
|
switch (ul_reason_for_call)
|
||
|
{
|
||
|
case DLL_PROCESS_ATTACH:
|
||
|
{
|
||
|
CopyMemory(path+GetSystemDirectory(path,MAX_PATH-10), "\\ddraw.dll",11);
|
||
|
ddraw.dll = LoadLibrary(path);
|
||
|
if (ddraw.dll == false)
|
||
|
{
|
||
|
MessageBox(0, "Cannot load original ddraw.dll library", APP_NAME, MB_ICONERROR);
|
||
|
ExitProcess(0);
|
||
|
}
|
||
|
ddraw.AcquireDDThreadLock = GetProcAddress(ddraw.dll, "AcquireDDThreadLock");
|
||
|
ddraw.CheckFullscreen = GetProcAddress(ddraw.dll, "CheckFullscreen");
|
||
|
ddraw.CompleteCreateSysmemSurface = GetProcAddress(ddraw.dll, "CompleteCreateSysmemSurface");
|
||
|
ddraw.D3DParseUnknownCommand = GetProcAddress(ddraw.dll, "D3DParseUnknownCommand");
|
||
|
ddraw.DDGetAttachedSurfaceLcl = GetProcAddress(ddraw.dll, "DDGetAttachedSurfaceLcl");
|
||
|
ddraw.DDInternalLock = GetProcAddress(ddraw.dll, "DDInternalLock");
|
||
|
ddraw.DDInternalUnlock = GetProcAddress(ddraw.dll, "DDInternalUnlock");
|
||
|
ddraw.DSoundHelp = GetProcAddress(ddraw.dll, "DSoundHelp");
|
||
|
ddraw.DirectDrawCreate = GetProcAddress(ddraw.dll, "DirectDrawCreate");
|
||
|
ddraw.DirectDrawCreateClipper = GetProcAddress(ddraw.dll, "DirectDrawCreateClipper");
|
||
|
ddraw.DirectDrawCreateEx = GetProcAddress(ddraw.dll, "DirectDrawCreateEx");
|
||
|
ddraw.DirectDrawEnumerateA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateA");
|
||
|
ddraw.DirectDrawEnumerateExA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExA");
|
||
|
ddraw.DirectDrawEnumerateExW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExW");
|
||
|
ddraw.DirectDrawEnumerateW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateW");
|
||
|
ddraw.DllCanUnloadNow = GetProcAddress(ddraw.dll, "DllCanUnloadNow");
|
||
|
ddraw.DllGetClassObject = GetProcAddress(ddraw.dll, "DllGetClassObject");
|
||
|
ddraw.GetDDSurfaceLocal = GetProcAddress(ddraw.dll, "GetDDSurfaceLocal");
|
||
|
ddraw.GetOLEThunkData = GetProcAddress(ddraw.dll, "GetOLEThunkData");
|
||
|
ddraw.GetSurfaceFromDC = GetProcAddress(ddraw.dll, "GetSurfaceFromDC");
|
||
|
ddraw.RegisterSpecialCase = GetProcAddress(ddraw.dll, "RegisterSpecialCase");
|
||
|
ddraw.ReleaseDDThreadLock = GetProcAddress(ddraw.dll, "ReleaseDDThreadLock");
|
||
|
|
||
|
InitDxWnd();
|
||
|
break;
|
||
|
}
|
||
|
case DLL_PROCESS_DETACH:
|
||
|
{
|
||
|
DxWndEndHook();
|
||
|
FreeLibrary(ddraw.dll);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|