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)
11 #include <reactos/buildno.h>
12 #include <reactos/stubs.h>
14 static const char* Exception2Str(DWORD code
)
18 #define EX_TO_STR(name) case (DWORD)(name): return #name
19 EX_TO_STR(EXCEPTION_ACCESS_VIOLATION
);
20 EX_TO_STR(EXCEPTION_DATATYPE_MISALIGNMENT
);
21 EX_TO_STR(EXCEPTION_BREAKPOINT
);
22 EX_TO_STR(EXCEPTION_SINGLE_STEP
);
23 EX_TO_STR(EXCEPTION_ARRAY_BOUNDS_EXCEEDED
);
24 EX_TO_STR(EXCEPTION_FLT_DENORMAL_OPERAND
);
25 EX_TO_STR(EXCEPTION_FLT_DIVIDE_BY_ZERO
);
26 EX_TO_STR(EXCEPTION_FLT_INEXACT_RESULT
);
27 EX_TO_STR(EXCEPTION_FLT_INVALID_OPERATION
);
28 EX_TO_STR(EXCEPTION_FLT_OVERFLOW
);
29 EX_TO_STR(EXCEPTION_FLT_STACK_CHECK
);
30 EX_TO_STR(EXCEPTION_FLT_UNDERFLOW
);
31 EX_TO_STR(EXCEPTION_INT_DIVIDE_BY_ZERO
);
32 EX_TO_STR(EXCEPTION_INT_OVERFLOW
);
33 EX_TO_STR(EXCEPTION_PRIV_INSTRUCTION
);
34 EX_TO_STR(EXCEPTION_IN_PAGE_ERROR
);
35 EX_TO_STR(EXCEPTION_ILLEGAL_INSTRUCTION
);
36 EX_TO_STR(EXCEPTION_NONCONTINUABLE_EXCEPTION
);
37 EX_TO_STR(EXCEPTION_STACK_OVERFLOW
);
38 EX_TO_STR(EXCEPTION_INVALID_DISPOSITION
);
39 EX_TO_STR(EXCEPTION_GUARD_PAGE
);
40 EX_TO_STR(EXCEPTION_INVALID_HANDLE
);
41 EX_TO_STR(EXCEPTION_WINE_STUB
);
42 EX_TO_STR(STATUS_ASSERTION_FAILURE
);
48 static void ReadKey(HKEY hKey
, const char* ValueName
, char* Buffer
, DWORD size
)
51 LSTATUS ret
= RegQueryValueExA(hKey
, ValueName
, NULL
, &dwType
, (LPBYTE
)Buffer
, &size
);
52 if (ret
!= ERROR_SUCCESS
|| dwType
!= REG_SZ
)
56 void PrintSystemInfo(FILE* output
, DumpData
& data
)
59 GetLocalTime(&LocalTime
);
60 xfprintf(output
, NEWLINE
"ReactOS " KERNEL_VERSION_STR
" DrWtsn32" NEWLINE NEWLINE
);
61 xfprintf(output
, "Application exception occurred:" NEWLINE
);
62 xfprintf(output
, " App: %ls (pid=%d, tid=0x%x)" NEWLINE
, data
.ProcessName
.c_str(), data
.ProcessID
, data
.ThreadID
);
63 xfprintf(output
, " When: %d/%d/%d @ %02d:%02d:%02d.%d" NEWLINE
,
64 LocalTime
.wDay
, LocalTime
.wMonth
, LocalTime
.wYear
,
65 LocalTime
.wHour
, LocalTime
.wMinute
, LocalTime
.wSecond
, LocalTime
.wMilliseconds
);
67 xfprintf(output
, " First chance: %u" NEWLINE
, data
.ExceptionInfo
.dwFirstChance
);
68 EXCEPTION_RECORD
& Record
= data
.ExceptionInfo
.ExceptionRecord
;
69 xfprintf(output
, " Exception number: 0x%08x (%s)" NEWLINE
, Record
.ExceptionCode
, Exception2Str(Record
.ExceptionCode
));
70 xfprintf(output
, " Exception flags: 0x%08x" NEWLINE
, Record
.ExceptionFlags
);
71 xfprintf(output
, " Exception address: %p" NEWLINE
, Record
.ExceptionAddress
);
72 if (Record
.NumberParameters
)
74 xfprintf(output
, " Exception parameters: %u" NEWLINE
, Record
.NumberParameters
);
75 for (DWORD n
= 0; n
< std::min
<DWORD
>(EXCEPTION_MAXIMUM_PARAMETERS
, Record
.NumberParameters
); ++n
)
77 xfprintf(output
, " Parameter %u: 0x%p" NEWLINE
, n
, Record
.ExceptionInformation
[n
]);
81 char Buffer
[MAX_PATH
];
82 DWORD count
= sizeof(Buffer
);
83 xfprintf(output
, NEWLINE
"*----> System Information <----*" NEWLINE NEWLINE
);
84 if (GetComputerNameA(Buffer
, &count
))
85 xfprintf(output
, " Computer Name: %s" NEWLINE
, Buffer
);
86 count
= sizeof(Buffer
);
87 if (GetUserNameA(Buffer
, &count
))
88 xfprintf(output
, " User Name: %s" NEWLINE
, Buffer
);
92 PCHAR DmiStrings
[ID_STRINGS_MAX
] = { 0 };
93 SMBiosBuf
= LoadSMBiosData(DmiStrings
);
96 if (DmiStrings
[BIOS_VENDOR
])
97 xfprintf(output
, " BIOS Vendor: %s" NEWLINE
, DmiStrings
[BIOS_VENDOR
]);
98 if (DmiStrings
[BIOS_VERSION
])
99 xfprintf(output
, " BIOS Version: %s" NEWLINE
, DmiStrings
[BIOS_VERSION
]);
100 if (DmiStrings
[BIOS_DATE
])
101 xfprintf(output
, " BIOS Date: %s" NEWLINE
, DmiStrings
[BIOS_DATE
]);
102 if (DmiStrings
[SYS_VENDOR
])
103 xfprintf(output
, " System Manufacturer: %s" NEWLINE
, DmiStrings
[SYS_VENDOR
]);
104 if (DmiStrings
[SYS_FAMILY
])
105 xfprintf(output
, " System Family: %s" NEWLINE
, DmiStrings
[SYS_FAMILY
]);
106 if (DmiStrings
[SYS_PRODUCT
])
107 xfprintf(output
, " System Model: %s" NEWLINE
, DmiStrings
[SYS_PRODUCT
]);
108 if (DmiStrings
[SYS_VERSION
])
109 xfprintf(output
, " System Version: %s" NEWLINE
, DmiStrings
[SYS_VERSION
]);
110 if (DmiStrings
[SYS_SKU
])
111 xfprintf(output
, " System SKU: %s" NEWLINE
, DmiStrings
[SYS_SKU
]);
112 if (DmiStrings
[BOARD_VENDOR
])
113 xfprintf(output
, " Baseboard Manufacturer: %s" NEWLINE
, DmiStrings
[BOARD_VENDOR
]);
114 if (DmiStrings
[BOARD_NAME
])
115 xfprintf(output
, " Baseboard Model: %s" NEWLINE
, DmiStrings
[BOARD_NAME
]);
116 if (DmiStrings
[BOARD_VERSION
])
117 xfprintf(output
, " Baseboard Version: %s" NEWLINE
, DmiStrings
[BOARD_VERSION
]);
118 FreeSMBiosData(SMBiosBuf
);
122 GetSystemInfo(&info
);
123 xfprintf(output
, " Number of Processors: %d" NEWLINE
, info
.dwNumberOfProcessors
);
126 LONG ret
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
128 if (ret
== ERROR_SUCCESS
)
131 count
= sizeof(Buffer
);
132 ret
= RegQueryValueExA(hKey
, "Identifier", NULL
, &dwType
, (LPBYTE
)Buffer
, &count
);
133 if (ret
== ERROR_SUCCESS
&& dwType
== REG_SZ
)
135 Buffer
[count
] = '\0';
136 xfprintf(output
, " Processor Type: %s" NEWLINE
, Buffer
);
141 ret
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ
, &hKey
);
142 if (ret
== ERROR_SUCCESS
)
145 ReadKey(hKey
, "ProductName", Buffer
, sizeof(Buffer
));
146 ReadKey(hKey
, "CurrentVersion", Version
, sizeof(Version
));
147 xfprintf(output
, " %s Version: %s" NEWLINE
, Buffer
, Version
);
148 ReadKey(hKey
, "BuildLab", Buffer
, sizeof(Buffer
));
149 xfprintf(output
, " BuildLab: %s" NEWLINE
, Buffer
);
150 ReadKey(hKey
, "CSDVersion", Buffer
, sizeof(Buffer
));
152 xfprintf(output
, " Service Pack: %s" NEWLINE
, Buffer
);
153 ReadKey(hKey
, "CurrentType", Buffer
, sizeof(Buffer
));
154 xfprintf(output
, " Current Type: %s" NEWLINE
, Buffer
);
155 ReadKey(hKey
, "RegisteredOrganization", Buffer
, sizeof(Buffer
));
156 xfprintf(output
, " Registered Organization: %s" NEWLINE
, Buffer
);
157 ReadKey(hKey
, "RegisteredOwner", Buffer
, sizeof(Buffer
));
158 xfprintf(output
, " Registered Owner: %s" NEWLINE
, Buffer
);