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
0 commit comments