Skip to content

Commit daba7ae

Browse files
committed
Log and advert crash in CCore::OnPostCreateDevice
1 parent ebfed7f commit daba7ae

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
@@ -936,6 +936,30 @@ HRESULT CCore::OnPostCreateDevice(HRESULT hResult, IDirect3D9* pDirect3D, UINT A
936936
if (!UsingAltD3DSetup())
937937
return D3D_OK;
938938

939+
if (!ppReturnedDeviceInterface)
940+
{
941+
AddReportLog(8744, SString("CCore::OnPostCreateDevice - missing ppReturnedDeviceInterface pointer"));
942+
return hResult;
943+
}
944+
945+
if (!SharedUtil::IsReadablePointer(ppReturnedDeviceInterface, sizeof(*ppReturnedDeviceInterface)))
946+
{
947+
AddReportLog(8745, SString("CCore::OnPostCreateDevice - invalid ppReturnedDeviceInterface pointer %p", ppReturnedDeviceInterface));
948+
return hResult;
949+
}
950+
951+
if (!*ppReturnedDeviceInterface)
952+
{
953+
AddReportLog(8746, SString("CCore::OnPostCreateDevice - ppReturnedDeviceInterface dereferenced to nullptr"));
954+
return hResult;
955+
}
956+
957+
if (!SharedUtil::IsReadablePointer(*ppReturnedDeviceInterface, sizeof(void*)))
958+
{
959+
AddReportLog(8747, SString("CCore::OnPostCreateDevice - invalid IDirect3DDevice9 pointer %p (via %p)", *ppReturnedDeviceInterface, ppReturnedDeviceInterface));
960+
return hResult;
961+
}
962+
939963
//
940964
// - Allow create device with no changes
941965
// - 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

@@ -112,12 +119,36 @@ void _declspec(naked) HOOK_PreCreateDevice()
112119
////////////////////////////////////////////////////////////////
113120
HRESULT _cdecl OnPostCreateDevice(HRESULT hResult)
114121
{
115-
if (g_pCore)
122+
if (!g_pCore)
123+
{
124+
ms_hasDeviceArgs = false;
125+
return hResult;
126+
}
127+
128+
if (!ms_hasDeviceArgs)
129+
{
130+
AddReportLog(8741, SString("OnPostCreateDevice: device arguments were not captured; skipping alt startup logic"));
131+
return hResult;
132+
}
133+
134+
if (!SharedUtil::IsReadablePointer(ms_ppReturnedDeviceInterface, sizeof(*ms_ppReturnedDeviceInterface)))
135+
{
136+
AddReportLog(8742, SString("OnPostCreateDevice: invalid device pointer reference %p", ms_ppReturnedDeviceInterface));
137+
ms_hasDeviceArgs = false;
138+
return hResult;
139+
}
140+
141+
if (!SharedUtil::IsReadablePointer(ms_pPresentationParameters, sizeof(*ms_pPresentationParameters)))
116142
{
117-
return g_pCore->OnPostCreateDevice(hResult, ms_pDirect3D, ms_Adapter, ms_DeviceType, ms_hFocusWindow, ms_BehaviorFlags, ms_pPresentationParameters,
118-
ms_ppReturnedDeviceInterface);
143+
AddReportLog(8743, SString("OnPostCreateDevice: invalid presentation parameters pointer %p", ms_pPresentationParameters));
144+
ms_hasDeviceArgs = false;
145+
return hResult;
119146
}
120-
return hResult;
147+
148+
HRESULT result = g_pCore->OnPostCreateDevice(hResult, ms_pDirect3D, ms_Adapter, ms_DeviceType, ms_hFocusWindow, ms_BehaviorFlags, ms_pPresentationParameters,
149+
ms_ppReturnedDeviceInterface);
150+
ms_hasDeviceArgs = false;
151+
return result;
121152
}
122153

123154
// Hook info

0 commit comments

Comments
 (0)