2 * PROJECT: Dr. Watson crash reporter
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Output system info
5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
10 #include <reactos/buildno.h>
12 static const char* Exception2Str(DWORD code
)
16 case EXCEPTION_ACCESS_VIOLATION
: return "EXCEPTION_ACCESS_VIOLATION";
17 case EXCEPTION_DATATYPE_MISALIGNMENT
: return "EXCEPTION_DATATYPE_MISALIGNMENT";
18 case EXCEPTION_BREAKPOINT
: return "EXCEPTION_BREAKPOINT";
19 case EXCEPTION_SINGLE_STEP
: return "EXCEPTION_SINGLE_STEP";
20 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED
: return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED";
21 case EXCEPTION_FLT_DENORMAL_OPERAND
: return "EXCEPTION_FLT_DENORMAL_OPERAND";
22 case EXCEPTION_FLT_DIVIDE_BY_ZERO
: return "EXCEPTION_FLT_DIVIDE_BY_ZERO";
23 case EXCEPTION_FLT_INEXACT_RESULT
: return "EXCEPTION_FLT_INEXACT_RESULT";
24 case EXCEPTION_FLT_INVALID_OPERATION
: return "EXCEPTION_FLT_INVALID_OPERATION";
25 case EXCEPTION_FLT_OVERFLOW
: return "EXCEPTION_FLT_OVERFLOW";
26 case EXCEPTION_FLT_STACK_CHECK
: return "EXCEPTION_FLT_STACK_CHECK";
27 case EXCEPTION_FLT_UNDERFLOW
: return "EXCEPTION_FLT_UNDERFLOW";
28 case EXCEPTION_INT_DIVIDE_BY_ZERO
: return "EXCEPTION_INT_DIVIDE_BY_ZERO";
29 case EXCEPTION_INT_OVERFLOW
: return "EXCEPTION_INT_OVERFLOW";
30 case EXCEPTION_PRIV_INSTRUCTION
: return "EXCEPTION_PRIV_INSTRUCTION";
31 case EXCEPTION_IN_PAGE_ERROR
: return "EXCEPTION_IN_PAGE_ERROR";
32 case EXCEPTION_ILLEGAL_INSTRUCTION
: return "EXCEPTION_ILLEGAL_INSTRUCTION";
33 case EXCEPTION_NONCONTINUABLE_EXCEPTION
: return "EXCEPTION_NONCONTINUABLE_EXCEPTION";
34 case EXCEPTION_STACK_OVERFLOW
: return "EXCEPTION_STACK_OVERFLOW";
35 case EXCEPTION_INVALID_DISPOSITION
: return "EXCEPTION_INVALID_DISPOSITION";
36 case EXCEPTION_GUARD_PAGE
: return "EXCEPTION_GUARD_PAGE";
37 case EXCEPTION_INVALID_HANDLE
: return "EXCEPTION_INVALID_HANDLE";
43 static void ReadKey(HKEY hKey
, const char* ValueName
, char* Buffer
, DWORD size
)
46 LSTATUS ret
= RegQueryValueExA(hKey
, ValueName
, NULL
, &dwType
, (LPBYTE
)Buffer
, &size
);
47 if (ret
!= ERROR_SUCCESS
|| dwType
!= REG_SZ
)
51 void PrintSystemInfo(FILE* output
, DumpData
& data
)
54 GetLocalTime(&LocalTime
);
55 xfprintf(output
, NEWLINE
"ReactOS " KERNEL_VERSION_STR
" DrWtsn32" NEWLINE NEWLINE
);
56 xfprintf(output
, "Application exception occurred:" NEWLINE
);
57 xfprintf(output
, " App: %s (pid=%d, tid=0x%x)" NEWLINE
, data
.ProcessName
.c_str(), data
.ProcessID
, data
.ThreadID
);
58 xfprintf(output
, " When: %d/%d/%d @ %02d:%02d:%02d.%d" NEWLINE
,
59 LocalTime
.wDay
, LocalTime
.wMonth
, LocalTime
.wYear
,
60 LocalTime
.wHour
, LocalTime
.wMinute
, LocalTime
.wSecond
, LocalTime
.wMilliseconds
);
61 DWORD ExceptionCode
= data
.ExceptionInfo
.ExceptionRecord
.ExceptionCode
;
62 xfprintf(output
, " Exception number: 0x%8x (%s)" NEWLINE
, ExceptionCode
, Exception2Str(ExceptionCode
));
64 char Buffer
[MAX_PATH
];
65 DWORD count
= sizeof(Buffer
);
66 xfprintf(output
, NEWLINE
"*----> System Information <----*" NEWLINE NEWLINE
);
67 if (GetComputerNameA(Buffer
, &count
))
68 xfprintf(output
, " Computer Name: %s" NEWLINE
, Buffer
);
69 count
= sizeof(Buffer
);
70 if (GetUserNameA(Buffer
, &count
))
71 xfprintf(output
, " User Name: %s" NEWLINE
, Buffer
);
76 xfprintf(output
, " Number of Processors: %d" NEWLINE
, info
.dwNumberOfProcessors
);
79 LONG ret
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
81 if (ret
== ERROR_SUCCESS
)
84 count
= sizeof(Buffer
);
85 ret
= RegQueryValueExA(hKey
, "Identifier", NULL
, &dwType
, (LPBYTE
)Buffer
, &count
);
86 if (ret
== ERROR_SUCCESS
&& dwType
== REG_SZ
)
89 xfprintf(output
, " Processor Type: %s" NEWLINE
, Buffer
);
94 ret
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ
, &hKey
);
95 if (ret
== ERROR_SUCCESS
)
98 ReadKey(hKey
, "ProductName", Buffer
, sizeof(Buffer
));
99 ReadKey(hKey
, "CurrentVersion", Version
, sizeof(Version
));
100 xfprintf(output
, " %s Version: %s" NEWLINE
, Buffer
, Version
);
101 ReadKey(hKey
, "BuildLab", Buffer
, sizeof(Buffer
));
102 xfprintf(output
, " BuildLab: %s" NEWLINE
, Buffer
);
103 ReadKey(hKey
, "CSDVersion", Buffer
, sizeof(Buffer
));
105 xfprintf(output
, " Service Pack: %s" NEWLINE
, Buffer
);
106 ReadKey(hKey
, "CurrentType", Buffer
, sizeof(Buffer
));
107 xfprintf(output
, " Current Type: %s" NEWLINE
, Buffer
);
108 ReadKey(hKey
, "RegisteredOrganization", Buffer
, sizeof(Buffer
));
109 xfprintf(output
, " Registered Organization: %s" NEWLINE
, Buffer
);
110 ReadKey(hKey
, "RegisteredOwner", Buffer
, sizeof(Buffer
));
111 xfprintf(output
, " Registered Owner: %s" NEWLINE
, Buffer
);