//------------------------------------------------------------------------------ // Tiny DirectDraw Proxy DLL v1.0 [28.05.2010] // Copyright 2010 Evgeny Vrublevsky //------------------------------------------------------------------------------ #define APP_NAME "Tiny DirectDraw Proxy" #define APP_VERSION "1.0 [28.05.2010]" #define WIN32_LEAN_AND_MEAN #include #include 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; }