1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Moved DLL related parts to Dll namespace and subdirectory

This commit is contained in:
narzoul 2016-09-03 16:57:10 +02:00
parent 7fc059a02f
commit b8832a92be
19 changed files with 88 additions and 87 deletions

View File

@ -7,7 +7,7 @@
#include "Common/Hook.h"
#include "Common/Log.h"
#include "Common/VtableVisitor.h"
#include "DDrawProcs.h"
#include "DDraw/ScopedThreadLock.h"
template <typename Interface>
using Vtable = typename std::remove_pointer<decltype(Interface::lpVtbl)>::type;
@ -109,7 +109,7 @@ private:
template <typename MemberDataPtr, MemberDataPtr ptr, typename Result, typename... Params>
static Result STDMETHODCALLTYPE threadSafeFunc(Params... params)
{
Compat::origProcs.AcquireDDThreadLock();
DDraw::ScopedThreadLock lock;
#ifdef _DEBUG
Compat::LogEnter(s_funcNames[getKey<MemberDataPtr, ptr>()].c_str(), params...);
#endif
@ -119,14 +119,13 @@ private:
#ifdef _DEBUG
Compat::LogLeave(s_funcNames[getKey<MemberDataPtr, ptr>()].c_str(), params...) << result;
#endif
Compat::origProcs.ReleaseDDThreadLock();
return result;
}
template <typename MemberDataPtr, MemberDataPtr ptr, typename... Params>
static void STDMETHODCALLTYPE threadSafeFunc(Params... params)
{
Compat::origProcs.AcquireDDThreadLock();
DDraw::ScopedThreadLock lock;
#ifdef _DEBUG
Compat::LogEnter(s_funcNames[getKey<MemberDataPtr, ptr>()].c_str(), params...);
#endif
@ -136,7 +135,6 @@ private:
#ifdef _DEBUG
Compat::LogLeave(s_funcNames[getKey<MemberDataPtr, ptr>()].c_str(), params...);
#endif
Compat::origProcs.ReleaseDDThreadLock();
}
const Vtable<Interface>& m_origVtable;

View File

@ -9,7 +9,6 @@
#include "DDraw/IReleaseNotifier.h"
#include "DDraw/RealPrimarySurface.h"
#include "DDraw/Repository.h"
#include "DDrawProcs.h"
#include "Gdi/Gdi.h"
namespace

View File

@ -2,7 +2,7 @@
#include "Common/Hook.h"
#include "DDraw/DisplayMode.h"
#include "DDraw/Repository.h"
#include "DDrawProcs.h"
#include "Dll/Procs.h"
namespace
{
@ -142,7 +142,7 @@ namespace
{
if (g_compatibleDc)
{
Compat::origProcs.AcquireDDThreadLock();
Dll::g_origProcs.AcquireDDThreadLock();
g_compatibleSurface->ReleaseDC(g_compatibleSurface, g_compatibleDc);
g_compatibleDc = nullptr;
g_compatibleSurface.release();
@ -165,7 +165,7 @@ namespace
if (g_compatibleSurface &&
SUCCEEDED(g_compatibleSurface->GetDC(g_compatibleSurface, &g_compatibleDc)))
{
Compat::origProcs.ReleaseDDThreadLock();
Dll::g_origProcs.ReleaseDDThreadLock();
}
}
}

View File

@ -12,6 +12,7 @@
#include "DDraw/Hooks.h"
#include "DDraw/RealPrimarySurface.h"
#include "DDraw/Repository.h"
#include "Dll/Procs.h"
namespace
{
@ -83,7 +84,7 @@ namespace DDraw
void installHooks()
{
CompatPtr<IDirectDraw> dd;
CALL_ORIG_DDRAW(DirectDrawCreate, nullptr, &dd.getRef(), nullptr);
CALL_ORIG_PROC(DirectDrawCreate, nullptr, &dd.getRef(), nullptr);
if (!dd)
{
Compat::Log() << "Failed to create a DirectDraw object for hooking";

View File

@ -11,7 +11,6 @@
#include "DDraw/RealPrimarySurface.h"
#include "DDraw/ScopedThreadLock.h"
#include "DDraw/Types.h"
#include "DDrawProcs.h"
#include "Gdi/Gdi.h"
namespace

View File

@ -4,7 +4,7 @@
#include "Common/CompatPtr.h"
#include "Common/Log.h"
#include "DDraw/Repository.h"
#include "DDrawProcs.h"
#include "Dll/Procs.h"
namespace
{
@ -26,7 +26,7 @@ namespace
CompatPtr<IDirectDraw7> createDirectDraw()
{
CompatPtr<IDirectDraw7> dd;
HRESULT result = CALL_ORIG_DDRAW(DirectDrawCreateEx, nullptr,
HRESULT result = CALL_ORIG_PROC(DirectDrawCreateEx, nullptr,
reinterpret_cast<void**>(&dd.getRef()), IID_IDirectDraw7, nullptr);
if (FAILED(result))
{

View File

@ -1,6 +1,6 @@
#pragma once
#include "DDrawProcs.h"
#include "Dll/Procs.h"
namespace DDraw
{
@ -9,12 +9,12 @@ namespace DDraw
public:
ScopedThreadLock()
{
Compat::origProcs.AcquireDDThreadLock();
Dll::g_origProcs.AcquireDDThreadLock();
}
~ScopedThreadLock()
{
Compat::origProcs.ReleaseDDThreadLock();
Dll::g_origProcs.ReleaseDDThreadLock();
}
};
}

View File

@ -96,7 +96,7 @@
<ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>
</ClCompile>
<Link>
<ModuleDefinitionFile>DDrawCompat.def</ModuleDefinitionFile>
<ModuleDefinitionFile>Dll/DDrawCompat.def</ModuleDefinitionFile>
<AdditionalDependencies>dxguid.lib;detours.lib;msimg32.lib;oleacc.lib;uxtheme.lib;dwmapi.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
@ -125,7 +125,7 @@
<ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>
</ClCompile>
<Link>
<ModuleDefinitionFile>DDrawCompat.def</ModuleDefinitionFile>
<ModuleDefinitionFile>Dll/DDrawCompat.def</ModuleDefinitionFile>
<AdditionalDependencies>dxguid.lib;detours.lib;msimg32.lib;oleacc.lib;uxtheme.lib;dwmapi.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>No</GenerateDebugInformation>
</Link>
@ -169,7 +169,6 @@
<ClInclude Include="D3dDdi\Visitors\AdapterFuncsVisitor.h" />
<ClInclude Include="D3dDdi\Visitors\DeviceCallbacksVisitor.h" />
<ClInclude Include="D3dDdi\Visitors\DeviceFuncsVisitor.h" />
<ClInclude Include="DDrawProcs.h" />
<ClInclude Include="DDraw\ActivateAppHandler.h" />
<ClInclude Include="DDraw\DirectDraw.h" />
<ClInclude Include="DDraw\DirectDrawPalette.h" />
@ -193,6 +192,7 @@
<ClInclude Include="Direct3d\Types.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dDeviceVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dVtblVisitor.h" />
<ClInclude Include="Dll\Procs.h" />
<ClInclude Include="Gdi\Gdi.h" />
<ClInclude Include="Gdi\Caret.h" />
<ClInclude Include="Gdi\Dc.h" />
@ -231,8 +231,9 @@
<ClCompile Include="Direct3d\Direct3d.cpp" />
<ClCompile Include="Direct3d\Direct3dDevice.cpp" />
<ClCompile Include="Direct3d\Hooks.cpp" />
<ClCompile Include="DllMain.cpp" />
<ClCompile Include="DDrawProcs.cpp" />
<ClCompile Include="Dll\Procs.cpp" />
<ClCompile Include="Dll\DllMain.cpp" />
<ClCompile Include="Dll\UnmodifiedProcs.cpp" />
<ClCompile Include="Gdi\Gdi.cpp" />
<ClCompile Include="Gdi\Caret.cpp" />
<ClCompile Include="Gdi\Dc.cpp" />
@ -243,13 +244,12 @@
<ClCompile Include="Gdi\ScrollFunctions.cpp" />
<ClCompile Include="Gdi\TitleBar.cpp" />
<ClCompile Include="Gdi\WinProc.cpp" />
<ClCompile Include="UnmodifiedDDrawProcs.cpp" />
<ClCompile Include="Win32\FontSmoothing.cpp" />
<ClCompile Include="Win32\MsgHooks.cpp" />
<ClCompile Include="Win32\Registry.cpp" />
</ItemGroup>
<ItemGroup>
<None Include="DDrawCompat.def" />
<None Include="Dll\DDrawCompat.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@ -61,11 +61,14 @@
<Filter Include="Header Files\Config">
<UniqueIdentifier>{5c6203cd-b703-4af0-a283-fa9eb72c2d07}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\Dll">
<UniqueIdentifier>{8a50d66d-8372-4dde-bbd1-302a52d7a385}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\Dll">
<UniqueIdentifier>{41544d1c-712a-4bef-8913-a40155a33ba0}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="DDrawProcs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Gdi\Gdi.h">
<Filter>Header Files\Gdi</Filter>
</ClInclude>
@ -234,17 +237,11 @@
<ClInclude Include="Config\Config.h">
<Filter>Header Files\Config</Filter>
</ClInclude>
<ClInclude Include="Dll\Procs.h">
<Filter>Header Files\Dll</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="DllMain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="UnmodifiedDDrawProcs.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DDrawProcs.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Gdi\Gdi.cpp">
<Filter>Source Files\Gdi</Filter>
</ClCompile>
@ -353,10 +350,19 @@
<ClCompile Include="Win32\Registry.cpp">
<Filter>Source Files\Win32</Filter>
</ClCompile>
<ClCompile Include="Dll\DllMain.cpp">
<Filter>Source Files\Dll</Filter>
</ClCompile>
<ClCompile Include="Dll\Procs.cpp">
<Filter>Source Files\Dll</Filter>
</ClCompile>
<ClCompile Include="Dll\UnmodifiedProcs.cpp">
<Filter>Source Files\Dll</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="DDrawCompat.def">
<Filter>Source Files</Filter>
<None Include="Dll\DDrawCompat.def">
<Filter>Source Files\Dll</Filter>
</None>
</ItemGroup>
</Project>

View File

@ -1,6 +0,0 @@
#include "DDrawProcs.h"
namespace Compat
{
DDrawProcs origProcs = {};
}

View File

@ -9,6 +9,7 @@
#include "Direct3d/Direct3d.h"
#include "Direct3d/Direct3dDevice.h"
#include "Direct3d/Hooks.h"
#include "Dll/Procs.h"
namespace
{
@ -123,7 +124,7 @@ namespace Direct3d
{
auto dd7(DDraw::Repository::getDirectDraw());
CompatPtr<IDirectDraw> dd;
CALL_ORIG_DDRAW(DirectDrawCreate, nullptr, &dd.getRef(), nullptr);
CALL_ORIG_PROC(DirectDrawCreate, nullptr, &dd.getRef(), nullptr);
if (!dd || !dd7 || FAILED(dd->SetCooperativeLevel(dd, nullptr, DDSCL_NORMAL)))
{
Compat::Log() << "Failed to hook Direct3d interfaces";

View File

@ -9,8 +9,8 @@
#include "D3dDdi/Hooks.h"
#include "DDraw/DisplayMode.h"
#include "DDraw/Hooks.h"
#include "DDrawProcs.h"
#include "Direct3d/Hooks.h"
#include "Dll/Procs.h"
#include "Gdi/Gdi.h"
#include "Win32/FontSmoothing.h"
#include "Win32/MsgHooks.h"
@ -18,6 +18,8 @@
struct IDirectInput;
HRESULT WINAPI SetAppCompatData(DWORD, DWORD);
namespace
{
HMODULE g_origDDrawModule = nullptr;
@ -79,8 +81,8 @@ namespace
}
}
#define LOAD_ORIGINAL_DDRAW_PROC(procName) \
Compat::origProcs.procName = GetProcAddress(g_origDDrawModule, #procName);
#define LOAD_ORIGINAL_PROC(procName) \
Dll::g_origProcs.procName = GetProcAddress(g_origDDrawModule, #procName);
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID /*lpvReserved*/)
{
@ -112,8 +114,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID /*lpvReserved*/)
return FALSE;
}
VISIT_ALL_DDRAW_PROCS(LOAD_ORIGINAL_DDRAW_PROC);
Compat::origProcs.DirectInputCreateA = GetProcAddress(g_origDInputModule, "DirectInputCreateA");
VISIT_ALL_PROCS(LOAD_ORIGINAL_PROC);
Dll::g_origProcs.DirectInputCreateA = GetProcAddress(g_origDInputModule, "DirectInputCreateA");
const BOOL disablePriorityBoost = TRUE;
SetProcessPriorityBoost(GetCurrentProcess(), disablePriorityBoost);
@ -125,13 +127,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID /*lpvReserved*/)
Win32::MsgHooks::installHooks();
Time::init();
if (Compat::origProcs.SetAppCompatData)
{
typedef HRESULT WINAPI SetAppCompatDataFunc(DWORD, DWORD);
auto setAppCompatData = reinterpret_cast<SetAppCompatDataFunc*>(Compat::origProcs.SetAppCompatData);
const DWORD disableMaxWindowedMode = 12;
setAppCompatData(disableMaxWindowedMode, 0);
}
const DWORD disableMaxWindowedMode = 12;
CALL_ORIG_PROC(SetAppCompatData, disableMaxWindowedMode, 0);
Compat::Log() << "DDrawCompat loaded successfully";
}
@ -159,7 +156,7 @@ extern "C" HRESULT WINAPI DirectDrawCreate(
Compat::LogEnter(__func__, lpGUID, lplpDD, pUnkOuter);
installHooks();
suppressEmulatedDirectDraw(lpGUID);
HRESULT result = CALL_ORIG_DDRAW(DirectDrawCreate, lpGUID, lplpDD, pUnkOuter);
HRESULT result = CALL_ORIG_PROC(DirectDrawCreate, lpGUID, lplpDD, pUnkOuter);
Compat::LogLeave(__func__, lpGUID, lplpDD, pUnkOuter) << result;
return result;
}
@ -173,7 +170,7 @@ extern "C" HRESULT WINAPI DirectDrawCreateEx(
Compat::LogEnter(__func__, lpGUID, lplpDD, iid, pUnkOuter);
installHooks();
suppressEmulatedDirectDraw(lpGUID);
HRESULT result = CALL_ORIG_DDRAW(DirectDrawCreateEx, lpGUID, lplpDD, iid, pUnkOuter);
HRESULT result = CALL_ORIG_PROC(DirectDrawCreateEx, lpGUID, lplpDD, iid, pUnkOuter);
Compat::LogLeave(__func__, lpGUID, lplpDD, iid, pUnkOuter) << result;
return result;
}
@ -185,7 +182,7 @@ extern "C" HRESULT WINAPI DirectInputCreateA(
LPUNKNOWN punkOuter)
{
Compat::LogEnter(__func__, hinst, dwVersion, lplpDirectInput, punkOuter);
HRESULT result = CALL_ORIG_DDRAW(DirectInputCreateA, hinst, dwVersion, lplpDirectInput, punkOuter);
HRESULT result = CALL_ORIG_PROC(DirectInputCreateA, hinst, dwVersion, lplpDirectInput, punkOuter);
Compat::LogLeave(__func__, hinst, dwVersion, lplpDirectInput, punkOuter) << result;
return result;
}

View File

@ -0,0 +1,6 @@
#include "Dll/Procs.h"
namespace Dll
{
Procs g_origProcs = {};
}

View File

@ -4,7 +4,7 @@
#include <Windows.h>
#define VISIT_UNMODIFIED_DDRAW_PROCS(visit) \
#define VISIT_UNMODIFIED_PROCS(visit) \
visit(AcquireDDThreadLock) \
visit(CompleteCreateSysmemSurface) \
visit(D3DParseUnknownCommand) \
@ -26,30 +26,30 @@
visit(ReleaseDDThreadLock) \
visit(SetAppCompatData)
#define VISIT_MODIFIED_DDRAW_PROCS(visit) \
#define VISIT_MODIFIED_PROCS(visit) \
visit(DirectDrawCreate) \
visit(DirectDrawCreateEx)
#define VISIT_ALL_DDRAW_PROCS(visit) \
VISIT_UNMODIFIED_DDRAW_PROCS(visit) \
VISIT_MODIFIED_DDRAW_PROCS(visit)
#define VISIT_ALL_PROCS(visit) \
VISIT_UNMODIFIED_PROCS(visit) \
VISIT_MODIFIED_PROCS(visit)
#define ADD_FARPROC_MEMBER(memberName) FARPROC memberName;
namespace Compat
namespace Dll
{
struct DDrawProcs
struct Procs
{
VISIT_ALL_DDRAW_PROCS(ADD_FARPROC_MEMBER);
VISIT_ALL_PROCS(ADD_FARPROC_MEMBER);
FARPROC DirectInputCreateA;
};
extern DDrawProcs origProcs;
extern Procs g_origProcs;
}
#undef ADD_FARPROC_MEMBER
#define CALL_ORIG_DDRAW(procName, ...) \
(Compat::origProcs.procName ? \
reinterpret_cast<decltype(procName)*>(Compat::origProcs.procName)(__VA_ARGS__) : \
#define CALL_ORIG_PROC(procName, ...) \
(Dll::g_origProcs.procName ? \
reinterpret_cast<decltype(procName)*>(Dll::g_origProcs.procName)(__VA_ARGS__) : \
E_FAIL)

View File

@ -0,0 +1,9 @@
#include "Dll/Procs.h"
#define CREATE_PROC_STUB(procName) \
extern "C" __declspec(naked) void __stdcall procName() \
{ \
__asm jmp Dll::g_origProcs.procName \
}
VISIT_UNMODIFIED_PROCS(CREATE_PROC_STUB)

View File

@ -6,7 +6,7 @@
#include "Config/Config.h"
#include "DDraw/CompatPrimarySurface.h"
#include "DDraw/Repository.h"
#include "DDrawProcs.h"
#include "Dll/Procs.h"
#include "Gdi/DcCache.h"
namespace
@ -45,7 +45,7 @@ namespace
}
// Release DD critical section acquired by IDirectDrawSurface7::GetDC to avoid deadlocks
Compat::origProcs.ReleaseDDThreadLock();
Dll::g_origProcs.ReleaseDDThreadLock();
cachedDc.surface = surface.detach();
cachedDc.dc = dc;
@ -105,7 +105,7 @@ namespace
void releaseCachedDc(CachedDc cachedDc)
{
// Reacquire DD critical section that was temporarily released after IDirectDrawSurface7::GetDC
Compat::origProcs.AcquireDDThreadLock();
Dll::g_origProcs.AcquireDDThreadLock();
HRESULT result = cachedDc.surface->ReleaseDC(cachedDc.surface, cachedDc.dc);
if (FAILED(result))

View File

@ -4,7 +4,7 @@
#include "DDraw/CompatPrimarySurface.h"
#include "DDraw/PaletteConverter.h"
#include "DDraw/RealPrimarySurface.h"
#include "DDrawProcs.h"
#include "Dll/Procs.h"
#include "Gdi/Caret.h"
#include "Gdi/DcCache.h"
#include "Gdi/DcFunctions.h"
@ -93,7 +93,7 @@ namespace
}
g_ddLockFlags = 0;
Compat::origProcs.ReleaseDDThreadLock();
Dll::g_origProcs.ReleaseDDThreadLock();
}
}
@ -113,11 +113,11 @@ namespace Gdi
if (0 == g_renderingRefCount)
{
LeaveCriticalSection(&g_gdiCriticalSection);
Compat::origProcs.AcquireDDThreadLock();
Dll::g_origProcs.AcquireDDThreadLock();
EnterCriticalSection(&g_gdiCriticalSection);
if (!lockPrimarySurface(lockFlags))
{
Compat::origProcs.ReleaseDDThreadLock();
Dll::g_origProcs.ReleaseDDThreadLock();
return false;
}
}

View File

@ -1,9 +0,0 @@
#include "DDrawProcs.h"
#define CREATE_DDRAW_PROC_STUB(procName) \
extern "C" __declspec(naked) void __stdcall procName() \
{ \
__asm jmp Compat::origProcs.procName \
}
VISIT_UNMODIFIED_DDRAW_PROCS(CREATE_DDRAW_PROC_STUB)