Skip to content

Commit 6619072

Browse files
committed
Add DebugReportWriter override
1 parent 2d71289 commit 6619072

5 files changed

Lines changed: 195 additions & 0 deletions

File tree

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
#ifdef MODAPI_DLL_EXPORT
2+
#include "stdafx.h"
3+
#include "DebugReportWriterOverride.h"
4+
5+
#include <Spore/Internal.h>
6+
7+
// TODO: fill in this class
8+
class ReportWriter
9+
{
10+
};
11+
12+
// TODO: add ReportWriter functions to public headers
13+
typedef LONG NTSTATUS, * PNTSTATUS;
14+
typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
15+
16+
member_detour(WriteSystemInfoDetour, ReportWriter, bool(void))
17+
{
18+
bool detoured(void)
19+
{
20+
char buffer[MAX_PATH];
21+
DWORD bufferSize = sizeof(buffer);
22+
23+
if (GetComputerNameExA(COMPUTER_NAME_FORMAT::ComputerNameDnsFullyQualified, buffer, &bufferSize))
24+
{
25+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Computer name", buffer));
26+
}
27+
28+
bufferSize = MAX_PATH;
29+
if (GetUserNameA(buffer, &bufferSize))
30+
{
31+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "User name", buffer));
32+
}
33+
34+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "EA_PLATFORM", "Windows on X86"));
35+
36+
// GetVersionExA() is deprecated and only reports upto Windows 8
37+
// unless a higher Windows version is specified in the executable
38+
// manifest, so use RtlGetVersion() from ntdll.dll instead
39+
HMODULE ntdllHandle = GetModuleHandleW(L"ntdll.dll");
40+
if (ntdllHandle != nullptr)
41+
{
42+
RtlGetVersionPtr rtlGetVersion = (RtlGetVersionPtr)GetProcAddress(ntdllHandle, "RtlGetVersion");
43+
if (rtlGetVersion != nullptr)
44+
{
45+
RTL_OSVERSIONINFOW versionInfo = { 0 };
46+
versionInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);
47+
48+
if (rtlGetVersion(&versionInfo) == 0)
49+
{
50+
if (versionInfo.dwMajorVersion == 5 &&
51+
versionInfo.dwMinorVersion == 1)
52+
{
53+
sprintf_s(buffer, sizeof(buffer), "Windows XP");
54+
}
55+
else if (versionInfo.dwMajorVersion == 6 &&
56+
versionInfo.dwMinorVersion == 0)
57+
{
58+
sprintf_s(buffer, sizeof(buffer), "Windows Vista");
59+
}
60+
else if (versionInfo.dwMajorVersion == 6 &&
61+
versionInfo.dwMinorVersion == 1)
62+
{
63+
sprintf_s(buffer, sizeof(buffer), "Windows 7");
64+
}
65+
else if (versionInfo.dwMajorVersion == 6 &&
66+
versionInfo.dwMinorVersion == 2)
67+
{
68+
sprintf_s(buffer, sizeof(buffer), "Windows 8");
69+
}
70+
else if (versionInfo.dwMajorVersion == 6 &&
71+
versionInfo.dwMinorVersion == 3)
72+
{
73+
sprintf_s(buffer, sizeof(buffer), "Windows 8.1");
74+
}
75+
else if (versionInfo.dwMajorVersion == 10 &&
76+
versionInfo.dwMinorVersion == 0 &&
77+
versionInfo.dwBuildNumber < 22000)
78+
{
79+
sprintf_s(buffer, sizeof(buffer), "Windows 10");
80+
}
81+
else if (versionInfo.dwMajorVersion >= 10 &&
82+
versionInfo.dwMinorVersion == 0 &&
83+
versionInfo.dwBuildNumber >= 22000)
84+
{
85+
sprintf_s(buffer, sizeof(buffer), "Windows 11");
86+
}
87+
else
88+
{
89+
sprintf_s(buffer, sizeof(buffer), "Unknown");
90+
}
91+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "OS name", buffer));
92+
93+
sprintf_s(buffer, sizeof(buffer), "%u.%u.%u", versionInfo.dwMajorVersion, versionInfo.dwMinorVersion, versionInfo.dwBuildNumber);
94+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "OS version number", buffer));
95+
96+
if (versionInfo.szCSDVersion[0] != L'\0')
97+
{
98+
sprintf_s(buffer, sizeof(buffer), "%ls", versionInfo.szCSDVersion);
99+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "OS service pack", buffer));
100+
}
101+
102+
}
103+
}
104+
}
105+
106+
if (IsDebuggerPresent())
107+
{
108+
sprintf_s(buffer, sizeof(buffer), "yes");
109+
}
110+
else
111+
{
112+
sprintf_s(buffer, sizeof(buffer), "no");
113+
}
114+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Debugger present", buffer));
115+
116+
SYSTEM_INFO systemInfo = { 0 };
117+
GetSystemInfo(&systemInfo);
118+
119+
sprintf_s(buffer, sizeof(buffer), "%u", systemInfo.dwNumberOfProcessors);
120+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "CPU count", buffer));
121+
122+
if (systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
123+
{
124+
sprintf_s(buffer, sizeof(buffer), "x86-64");
125+
}
126+
else if (systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA32_ON_WIN64)
127+
{
128+
sprintf_s(buffer, sizeof(buffer), "x86 on x86-64");
129+
}
130+
else
131+
{
132+
sprintf_s(buffer, sizeof(buffer), "x86");
133+
}
134+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Processor type", buffer));
135+
136+
sprintf_s(buffer, sizeof(buffer), "%u", systemInfo.wProcessorLevel);
137+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Processor level", buffer));
138+
139+
sprintf_s(buffer, sizeof(buffer), "%u", systemInfo.wProcessorRevision);
140+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Processor revision", buffer));
141+
142+
143+
MEMORYSTATUSEX memoryStatus = { 0 };
144+
memoryStatus.dwLength = sizeof(MEMORYSTATUSEX);
145+
if (GlobalMemoryStatusEx(&memoryStatus))
146+
{
147+
sprintf_s(buffer, sizeof(buffer), "%d%%", memoryStatus.dwMemoryLoad);
148+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Memory load", buffer));
149+
150+
sprintf_s(buffer, sizeof(buffer), "%I64d Mb", memoryStatus.ullTotalPhys / 1024 / 1024);
151+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Total physical memory", buffer));
152+
153+
sprintf_s(buffer, sizeof(buffer), "%I64d Mb", memoryStatus.ullAvailPhys / 1024 / 1024);
154+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Available physical memory", buffer));
155+
156+
sprintf_s(buffer, sizeof(buffer), "%I64d Mb", memoryStatus.ullTotalPageFile / 1024 / 1024);
157+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Total page file memory", buffer));
158+
159+
sprintf_s(buffer, sizeof(buffer), "%I64d Mb", memoryStatus.ullAvailPageFile / 1024 / 1024);
160+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Available page file memory", buffer));
161+
162+
sprintf_s(buffer, sizeof(buffer), "%I64d Mb", memoryStatus.ullTotalVirtual / 1024 / 1024);
163+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Total virtual memory", buffer));
164+
165+
sprintf_s(buffer, sizeof(buffer), "%I64d Mb", memoryStatus.ullAvailVirtual / 1024 / 1024);
166+
CALL(Address(ModAPI::ChooseAddress(0x0091f070, 0x0091edb0)), int, Args(ReportWriter*, char*, char*), Args(this, "Free virtual memory", buffer));
167+
}
168+
169+
return true;
170+
}
171+
};
172+
173+
long DebugReportWriterOverride::AttachDetour()
174+
{
175+
long result = 0;
176+
result |= WriteSystemInfoDetour::attach(Address(ModAPI::ChooseAddress(0x0091f480, 0x0091f1c0)));
177+
return result;
178+
}
179+
#endif
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#pragma once
2+
3+
namespace DebugReportWriterOverride
4+
{
5+
long AttachDetour();
6+
}

‎Spore ModAPI/SourceCode/DLL/dllmain.cpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "Application.h"
88
#include "TextureOverride.h"
99
#include "SpaceToolIconOverride.h"
10+
#include "DebugReportWriterOverride.h"
1011

1112
uintptr_t baseAddress;
1213
ArgScript::PrintF_ptr ArgScript::PrintF;
@@ -27,6 +28,7 @@ BOOL APIENTRY DllMain(HMODULE hModule,
2728
ModAPI::AttachDetour();
2829
TextureOverride::AttachDetour();
2930
SpaceToolIconOverride::AttachDetour();
31+
DebugReportWriterOverride::AttachDetour();
3032
CommitDetours();
3133
break;
3234

‎Spore ModAPI/Spore ModAPI.vcxproj‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@
294294
<ClInclude Include="EASTL\version.h" />
295295
<ClInclude Include="EASTL\weak_ptr.h" />
296296
<ClInclude Include="SourceCode\DLL\Application.h" />
297+
<ClInclude Include="SourceCode\DLL\DebugReportWriterOverride.h" />
297298
<ClInclude Include="SourceCode\DLL\resource.h" />
298299
<ClInclude Include="SourceCode\DLL\SpaceToolIconOverride.h" />
299300
<ClInclude Include="SourceCode\DLL\stdafx.h" />
@@ -996,6 +997,7 @@
996997
<ClCompile Include="SourceCode\DLL\AddressesUI.cpp" />
997998
<ClCompile Include="SourceCode\DLL\AddressesUTFWin.cpp" />
998999
<ClCompile Include="SourceCode\DLL\Application.cpp" />
1000+
<ClCompile Include="SourceCode\DLL\DebugReportWriterOverride.cpp" />
9991001
<ClCompile Include="SourceCode\DLL\dllmain.cpp" />
10001002
<ClCompile Include="SourceCode\DLL\DllModAPI.cpp" />
10011003
<ClCompile Include="SourceCode\DLL\SpaceToolIconOverride.cpp" />

‎Spore ModAPI/Spore ModAPI.vcxproj.filters‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2319,6 +2319,9 @@
23192319
<ClInclude Include="Spore\Movie\MovieSystem.h">
23202320
<Filter>Header Files</Filter>
23212321
</ClInclude>
2322+
<ClInclude Include="SourceCode\DLL\DebugReportWriterOverride.h">
2323+
<Filter>Header Files</Filter>
2324+
</ClInclude>
23222325
</ItemGroup>
23232326
<ItemGroup>
23242327
<ClCompile Include="SourceCode\Allocator.cpp">
@@ -2825,6 +2828,9 @@
28252828
<ClCompile Include="SourceCode\Movie\MovieSystem.cpp">
28262829
<Filter>Source Files</Filter>
28272830
</ClCompile>
2831+
<ClCompile Include="SourceCode\DLL\DebugReportWriterOverride.cpp">
2832+
<Filter>Source Files</Filter>
2833+
</ClCompile>
28282834
</ItemGroup>
28292835
<ItemGroup>
28302836
<Natvis Include="EASTL.natvis" />

0 commit comments

Comments
 (0)