Skip to content

Commit 20a3a1f

Browse files
committed
Log and advert crash in CCore::OnPostCreateDevice
1 parent 65de0f2 commit 20a3a1f

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

Client/core/DXHook/CProxyDirect3D9.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,30 @@ HRESULT CCore::OnPostCreateDevice(HRESULT hResult, IDirect3D9* pDirect3D, UINT A
929929
if (!UsingAltD3DSetup())
930930
return D3D_OK;
931931

932+
if (!ppReturnedDeviceInterface)
933+
{
934+
AddReportLog(8744, SString("CCore::OnPostCreateDevice - missing ppReturnedDeviceInterface pointer"));
935+
return hResult;
936+
}
937+
938+
if (!SharedUtil::IsReadablePointer(ppReturnedDeviceInterface, sizeof(*ppReturnedDeviceInterface)))
939+
{
940+
AddReportLog(8745, SString("CCore::OnPostCreateDevice - invalid ppReturnedDeviceInterface pointer %p", ppReturnedDeviceInterface));
941+
return hResult;
942+
}
943+
944+
if (!*ppReturnedDeviceInterface)
945+
{
946+
AddReportLog(8746, SString("CCore::OnPostCreateDevice - ppReturnedDeviceInterface dereferenced to nullptr"));
947+
return hResult;
948+
}
949+
950+
if (!SharedUtil::IsReadablePointer(*ppReturnedDeviceInterface, sizeof(void*)))
951+
{
952+
AddReportLog(8747, SString("CCore::OnPostCreateDevice - invalid IDirect3DDevice9 pointer %p (via %p)", *ppReturnedDeviceInterface, ppReturnedDeviceInterface));
953+
return hResult;
954+
}
955+
932956
//
933957
// - Allow create device with no changes
934958
// - Check caps and report diff with GTA caps

Client/multiplayer_sa/CMultiplayerSA_Direct3D.cpp

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace
2020
DWORD ms_BehaviorFlags = 0;
2121
D3DPRESENT_PARAMETERS* ms_pPresentationParameters = NULL;
2222
IDirect3DDevice9** ms_ppReturnedDeviceInterface = NULL;
23+
bool ms_hasDeviceArgs = false;
2324
} // namespace
2425

2526
DWORD RESTORE_Addr_PreCreateDevice;
@@ -45,7 +46,7 @@ void _cdecl OnPreCreateDevice(IDirect3D9* pDirect3D, UINT Adapter, D3DDEVTYPE De
4546
}
4647

4748
// Validate critical parameters before dereferencing
48-
if (BehaviorFlags && pPresentationParameters)
49+
if (BehaviorFlags && pPresentationParameters && ppReturnedDeviceInterface)
4950
{
5051
ms_pDirect3D = pDirect3D;
5152
ms_Adapter = Adapter;
@@ -54,6 +55,12 @@ void _cdecl OnPreCreateDevice(IDirect3D9* pDirect3D, UINT Adapter, D3DDEVTYPE De
5455
ms_BehaviorFlags = *BehaviorFlags;
5556
ms_pPresentationParameters = pPresentationParameters;
5657
ms_ppReturnedDeviceInterface = ppReturnedDeviceInterface;
58+
ms_hasDeviceArgs = true;
59+
}
60+
else
61+
{
62+
ms_hasDeviceArgs = false;
63+
AddReportLog(8740, SString("OnPreCreateDevice: missing device arguments for alt startup path"));
5764
}
5865
}
5966

@@ -114,12 +121,36 @@ static void __declspec(naked) HOOK_PreCreateDevice()
114121
////////////////////////////////////////////////////////////////
115122
HRESULT _cdecl OnPostCreateDevice(HRESULT hResult)
116123
{
117-
if (g_pCore)
124+
if (!g_pCore)
125+
{
126+
ms_hasDeviceArgs = false;
127+
return hResult;
128+
}
129+
130+
if (!ms_hasDeviceArgs)
131+
{
132+
AddReportLog(8741, SString("OnPostCreateDevice: device arguments were not captured; skipping alt startup logic"));
133+
return hResult;
134+
}
135+
136+
if (!SharedUtil::IsReadablePointer(ms_ppReturnedDeviceInterface, sizeof(*ms_ppReturnedDeviceInterface)))
137+
{
138+
AddReportLog(8742, SString("OnPostCreateDevice: invalid device pointer reference %p", ms_ppReturnedDeviceInterface));
139+
ms_hasDeviceArgs = false;
140+
return hResult;
141+
}
142+
143+
if (!SharedUtil::IsReadablePointer(ms_pPresentationParameters, sizeof(*ms_pPresentationParameters)))
118144
{
119-
return g_pCore->OnPostCreateDevice(hResult, ms_pDirect3D, ms_Adapter, ms_DeviceType, ms_hFocusWindow, ms_BehaviorFlags, ms_pPresentationParameters,
120-
ms_ppReturnedDeviceInterface);
145+
AddReportLog(8743, SString("OnPostCreateDevice: invalid presentation parameters pointer %p", ms_pPresentationParameters));
146+
ms_hasDeviceArgs = false;
147+
return hResult;
121148
}
122-
return hResult;
149+
150+
HRESULT result = g_pCore->OnPostCreateDevice(hResult, ms_pDirect3D, ms_Adapter, ms_DeviceType, ms_hFocusWindow, ms_BehaviorFlags, ms_pPresentationParameters,
151+
ms_ppReturnedDeviceInterface);
152+
ms_hasDeviceArgs = false;
153+
return result;
123154
}
124155

125156
// Hook info

0 commit comments

Comments
 (0)