a9cd6b6ed11fa8b678c8feaca100863613c78605
[reactos.git] / ntoskrnl / dbg / errinfo.c
1 /*
2  *  ReactOS kernel
3  *  Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /*
20  * PROJECT:         ReactOS kernel
21  * FILE:            ntoskrnl/dbg/errinfo.c
22  * PURPOSE:         Print information descriptions of error messages
23  * PORTABILITY:     Checked
24  * UPDATE HISTORY:
25  *                  Created 22/05/98
26  */
27
28 /* INCLUDES ******************************************************************/
29
30 #define NTOS_MODE_KERNEL
31 #include <ntos.h>
32 #include <internal/debug.h>
33
34 /* GLOBALS *******************************************************************/
35
36 static PCHAR SeverityCodes[] = {"SUC", "INF", "ERR", "WRN"};
37
38 static struct _FACLIST
39 {
40   ULONG Code;
41   PCHAR Name;
42 } FacList[] = 
43 {
44   {0, "KERNEL"},
45   {0, NULL}
46 };
47
48 static struct _ERRLIST 
49 {
50   NTSTATUS Code;
51   PCHAR Name;
52   PCHAR Text;
53 } ErrList[] = 
54 {
55   {STATUS_SUCCESS, "SUCCESS", NULL},
56   {STATUS_INSUFFICIENT_RESOURCES, "INSUFFICIENT_RESOURCES", NULL},
57   {STATUS_OBJECT_NAME_EXISTS, "OBJECT_NAME_EXISTS", NULL},
58   {STATUS_OBJECT_NAME_COLLISION, "OBJECT_NAME_COLLISION", NULL},
59   {STATUS_CTL_FILE_NOT_SUPPORTED, "CTL_FILE_NOT_SUPPORTED", NULL},
60   {STATUS_PORT_ALREADY_SET, "PORT_ALREADY_SET", NULL},
61   {STATUS_SECTION_NOT_IMAGE, "SECTION_NOT_IMAGE", NULL},
62   {STATUS_BAD_WORKING_SET_LIMIT, "BAD_WORKING_SET_LIMIT", NULL},
63   {STATUS_INCOMPATIBLE_FILE_MAP, "INCOMPATIBLE_FILE_MAP", NULL},
64   {STATUS_HANDLE_NOT_WAITABLE, "HANDLE_NOT_WAITABLE", NULL},
65   {STATUS_PORT_DISCONNECTED, "PORT_DISCONNECTED", NULL},
66   {STATUS_NOT_LOCKED, "NOT_LOCKED", NULL},
67   {STATUS_NOT_MAPPED_VIEW, "NOT_MAPPED_VIEW", NULL},
68   {STATUS_UNABLE_TO_FREE_VM, "UNABLE_TO_FREE_VM", NULL},
69   {STATUS_UNABLE_TO_DELETE_SECTION, "UNABLE_TO_DELETE_SECTION", NULL},
70   {STATUS_MORE_PROCESSING_REQUIRED, "MORE_PROCESSING_REQUIRED", NULL},
71   {STATUS_INVALID_CID, "INVALID_CID", NULL},
72   {STATUS_BAD_INITIAL_STACK, "BAD_INITIAL_STACK", NULL},
73   {STATUS_INVALID_VOLUME_LABEL, "INVALID_VOLUME_LABEL", NULL},
74   {STATUS_SECTION_NOT_EXTENDED, "SECTION_NOT_EXTENDED", NULL},
75   {STATUS_NOT_MAPPED_DATA, "NOT_MAPPED_DATA", NULL},
76   {STATUS_INFO_LENGTH_MISMATCH, "INFO_LENGTH_MISMATCH", NULL},
77   {STATUS_INVALID_INFO_CLASS, "INVALID_INFO_CLASS", NULL},
78   {STATUS_SUSPEND_COUNT_EXCEEDED, "SUSPEND_COUNT_EXCEEDED", NULL},
79   {STATUS_NOTIFY_ENUM_DIR, "NOTIFY_ENUM_DIR", NULL},
80   {STATUS_REGISTRY_RECOVERED, "REGISTRY_RECOVERED", NULL},
81   {STATUS_REGISTRY_IO_FAILED, "REGISTRY_IO_FAILED", NULL},
82   {STATUS_KEY_DELETED, "KEY_DELETED", NULL},
83   {STATUS_NO_LOG_SPACE, "NO_LOG_SPACE", NULL},
84   {STATUS_KEY_HAS_CHILDREN, "KEY_HAS_CHILDREN", NULL},
85   {STATUS_CHILD_MUST_BE_VOLATILE, "CHILD_MUST_BE_VOLATILE", NULL},
86   {STATUS_REGISTRY_CORRUPT, "REGISTRY_CORRUPT", NULL},
87   {STATUS_DLL_NOT_FOUND, "DLL_NOT_FOUND", NULL},
88   {STATUS_DLL_INIT_FAILED, "DLL_INIT_FAILED", NULL},
89   {STATUS_ORDINAL_NOT_FOUND, "ORDINAL_NOT_FOUND", NULL},
90   {STATUS_ENTRYPOINT_NOT_FOUND, "ENTRYPOINT_NOT_FOUND", NULL},
91   {STATUS_MORE_ENTRIES, "MORE_ENTRIES", NULL},
92   {STATUS_BUFFER_OVERFLOW, "BUFFER_OVERFLOW", NULL},
93   {STATUS_NO_MORE_FILES, "NO_MORE_FILES", NULL},
94   {STATUS_NO_INHERITANCE, "NO_INHERITANCE", NULL},
95   {STATUS_NO_MORE_EAS, "NO_MORE_EAS", NULL},
96   {STATUS_NO_MORE_ENTRIES, "NO_MORE_ENTRIES", NULL},
97   {STATUS_GUIDS_EXHAUSTED, "GUIDS_EXHAUSTED", NULL},
98   {STATUS_AGENTS_EXHAUSTED, "AGENTS_EXHAUSTED", NULL},
99   {STATUS_UNSUCCESSFUL, "UNSUCCESSFUL", NULL},
100   {STATUS_NOT_IMPLEMENTED, "NOT_IMPLEMENTED", NULL},
101   {STATUS_ILLEGAL_FUNCTION, "ILLEGAL_FUNCTION", NULL},
102   {STATUS_PAGEFILE_QUOTA, "PAGEFILE_QUOTA", NULL},
103   {STATUS_COMMITMENT_LIMIT, "COMMITMENT_LIMIT", NULL},
104   {STATUS_SECTION_TOO_BIG, "SECTION_TOO_BIG", NULL},
105   {RPC_NT_SS_IN_NULL_CONTEXT, "RPC_NT_SS_IN_NULL_CONTEXT", NULL},
106   {RPC_NT_INVALID_BINDING, "RPC_NT_INVALID_BINDING", NULL},
107   {STATUS_OBJECT_FILE_MISMATCH, "OBJECT_FILE_MISMATCH", NULL},
108   {STATUS_FILE_CLOSED, "FILE_CLOSED", NULL},
109   {STATUS_INVALID_PORT_HANDLE, "INVALID_PORT_HANDLE", NULL},
110   {STATUS_NOT_COMMITTED, "NOT_COMMITTED", NULL},
111   {STATUS_INVALID_PARAMETER, "INVALID_PARAMETER", NULL},
112   {STATUS_INVALID_PARAMETER_1, "INVALID_PARAMETER_1", NULL},
113   {STATUS_INVALID_PARAMETER_2, "INVALID_PARAMETER_2", NULL},
114   {STATUS_INVALID_PARAMETER_3, "INVALID_PARAMETER_3", NULL},
115   {STATUS_INVALID_PARAMETER_4, "INVALID_PARAMETER_4", NULL},
116   {STATUS_INVALID_PARAMETER_5, "INVALID_PARAMETER_5", NULL},
117   {STATUS_INVALID_PARAMETER_6, "INVALID_PARAMETER_6", NULL},
118   {STATUS_INVALID_PARAMETER_7, "INVALID_PARAMETER_7", NULL},
119   {STATUS_INVALID_PARAMETER_8, "INVALID_PARAMETER_8", NULL},
120   {STATUS_INVALID_PARAMETER_9, "INVALID_PARAMETER_9", NULL},
121   {STATUS_INVALID_PARAMETER_10, "INVALID_PARAMETER_10", NULL},
122   {STATUS_INVALID_PARAMETER_11, "INVALID_PARAMETER_11", NULL},
123   {STATUS_INVALID_PARAMETER_12, "INVALID_PARAMETER_12", NULL},
124   {STATUS_INVALID_PARAMETER_MAX, "INVALID_PARAMETER_MAX", NULL},
125   {STATUS_INVALID_PAGE_PROTECTION, "INVALID_PAGE_PROTECTION", NULL},
126   {STATUS_RESOURCE_DATA_NOT_FOUND, "RESOURCE_DATA_NOT_FOUND", NULL},
127   {STATUS_RESOURCE_TYPE_NOT_FOUND, "RESOURCE_TYPE_NOT_FOUND", NULL},
128   {STATUS_RESOURCE_NAME_NOT_FOUND, "RESOURCE_NAME_NOT_FOUND", NULL},
129   {STATUS_RESOURCE_LANG_NOT_FOUND, "RESOURCE_LANG_NOT_FOUND", NULL},
130   {STATUS_NO_SUCH_DEVICE, "NO_SUCH_DEVICE", NULL},
131   {STATUS_NO_SUCH_FILE, "NO_SUCH_FILE", NULL},
132   {STATUS_INVALID_DEVICE_REQUEST, "INVALID_DEVICE_REQUEST", NULL},
133   {STATUS_END_OF_FILE, "END_OF_FILE", NULL},
134   {STATUS_FILE_FORCED_CLOSED, "FILE_FORCED_CLOSED", NULL},
135   {STATUS_WRONG_VOLUME, "WRONG_VOLUME", NULL},
136   {STATUS_NO_MEDIA, "NO_MEDIA", NULL},
137   {STATUS_NO_MEDIA_IN_DEVICE, "NO_MEDIA_IN_DEVICE", NULL},
138   {STATUS_NONEXISTENT_SECTOR, "NONEXISTENT_SECTOR", NULL},
139   {STATUS_WORKING_SET_QUOTA, "WORKING_SET_QUOTA", NULL},
140   {STATUS_CONFLICTING_ADDRESS, "CONFLICTING_ADDRESS", NULL},
141   {STATUS_INVALID_SYSTEM_SERVICE, "INVALID_SYSTEM_SERVICE", NULL},
142   {STATUS_THREAD_IS_TERMINATING, "THREAD_IS_TERMINATING", NULL},
143   {STATUS_PROCESS_IS_TERMINATING, "PROCESS_IS_TERMINATING", NULL},
144   {STATUS_INVALID_LOCK_SEQUENCE, "INVALID_LOCK_SEQUENCE", NULL},
145   {STATUS_INVALID_VIEW_SIZE, "INVALID_VIEW_SIZE", NULL},
146   {STATUS_ALREADY_COMMITTED, "ALREADY_COMMITTED", NULL},
147   {STATUS_ACCESS_DENIED, "ACCESS_DENIED", NULL},
148   {STATUS_FILE_IS_A_DIRECTORY, "FILE_IS_A_DIRECTORY", NULL},
149   {STATUS_CANNOT_DELETE, "CANNOT_DELETE", NULL},
150   {STATUS_INVALID_COMPUTER_NAME, "INVALID_COMPUTER_NAME", NULL},
151   {STATUS_FILE_DELETED, "FILE_DELETED", NULL},
152   {STATUS_DELETE_PENDING, "DELETE_PENDING", NULL},
153   {STATUS_PORT_CONNECTION_REFUSED, "PORT_CONNECTION_REFUSED", NULL},
154   {STATUS_NO_SUCH_PRIVILEGE, "NO_SUCH_PRIVILEGE", NULL},
155   {STATUS_PRIVILEGE_NOT_HELD, "PRIVILEGE_NOT_HELD", NULL},
156   {STATUS_CANNOT_IMPERSONATE, "CANNOT_IMPERSONATE", NULL},
157   {STATUS_LOGON_FAILURE, "LOGON_FAILURE", NULL},
158   {STATUS_ACCOUNT_RESTRICTION, "ACCOUNT_RESTRICTION", NULL},
159   {STATUS_INVALID_LOGON_HOURS, "INVALID_LOGON_HOURS", NULL},
160   {STATUS_INVALID_WORKSTATION, "INVALID_WORKSTATION", NULL},
161   {STATUS_BUFFER_TOO_SMALL, "BUFFER_TOO_SMALL", NULL},
162   {STATUS_UNABLE_TO_DECOMMIT_VM, "UNABLE_TO_DECOMMIT_VM", NULL},
163   {STATUS_DISK_CORRUPT_ERROR, "DISK_CORRUPT_ERROR", NULL},
164   {STATUS_OBJECT_NAME_INVALID, "OBJECT_NAME_INVALID", NULL},
165   {STATUS_OBJECT_NAME_NOT_FOUND, "OBJECT_NAME_NOT_FOUND", NULL},
166   {STATUS_OBJECT_PATH_INVALID, "OBJECT_PATH_INVALID", NULL},
167   {STATUS_OBJECT_PATH_NOT_FOUND, "OBJECT_PATH_NOT_FOUND", NULL},
168   {STATUS_DFS_EXIT_PATH_FOUND, "DFS_EXIT_PATH_FOUND", NULL},
169   {STATUS_OBJECT_PATH_SYNTAX_BAD, "OBJECT_PATH_SYNTAX_BAD", NULL},
170   {STATUS_DATA_OVERRUN, "DATA_OVERRUN", NULL},
171   {STATUS_DATA_LATE_ERROR, "DATA_LATE_ERROR", NULL},
172   {STATUS_DATA_ERROR, "DATA_ERROR", NULL},
173   {STATUS_CRC_ERROR, "CRC_ERROR", NULL},
174   {STATUS_SHARING_VIOLATION, "SHARING_VIOLATION", NULL},
175   {STATUS_QUOTA_EXCEEDED, "QUOTA_EXCEEDED", NULL},
176   {STATUS_MUTANT_NOT_OWNED, "MUTANT_NOT_OWNED", NULL},
177   {STATUS_SEMAPHORE_LIMIT_EXCEEDED, "SEMAPHORE_LIMIT_EXCEEDED", NULL},
178   {STATUS_DISK_FULL, "DISK_FULL", NULL},
179   {STATUS_LOCK_NOT_GRANTED, "LOCK_NOT_GRANTED", NULL},
180   {STATUS_DEVICE_NOT_READY, "DEVICE_NOT_READY", NULL},
181   {STATUS_IO_TIMEOUT, "IO_TIMEOUT", NULL},
182   {STATUS_MEDIA_WRITE_PROTECTED, "MEDIA_WRITE_PROTECTED", NULL},
183   {STATUS_NO_MEDIA_IN_DRIVE, "NO_MEDIA_IN_DRIVE", NULL},
184   {STATUS_VERIFY_REQUIRED, "VERIFY_REQUIRED", NULL},
185   {STATUS_UNRECOGNIZED_MEDIA, "UNRECOGNIZED_MEDIA", NULL},
186   {STATUS_UNRECOGNIZED_VOLUME, "UNRECOGNIZED_VOLUME", NULL},
187   {STATUS_FS_DRIVER_REQUIRED, "FS_DRIVER_REQUIRED", NULL},
188   {STATUS_NOT_SUPPORTED, "NOT_SUPPORTED", NULL},
189   {STATUS_DISK_OPERATION_FAILED, "DISK_OPERATION_FAILED", NULL},
190   {STATUS_FS_QUERY_REQUIRED, "FS_QUERY_REQUIRED", NULL},
191   {0, NULL, NULL}
192 };
193
194 /* FUNCTIONS *****************************************************************/
195
196 VOID 
197 DbgGetErrorText(NTSTATUS ErrorCode, PUNICODE_STRING ErrorText, ULONG Flags)
198 {
199   int i;
200   char TempBuf[255], NumBuf[32];
201   ANSI_STRING AnsiString;
202
203   TempBuf[0] = '\0';
204   if (Flags & DBG_GET_SHOW_FACILITY)
205     {
206       if (NT_CUSTOMER(ErrorCode))
207         {
208           sprintf(TempBuf, 
209                   "%%CUST-%s-", 
210                   SeverityCodes[NT_SEVERITY(ErrorCode)]);
211         }
212       else 
213         {
214           for (i = 0; FacList[i].Name != NULL; i++)
215             {
216               if (FacList[i].Code == (ULONG) NT_FACILITY(ErrorCode))
217                 {
218                   break;
219                 }
220             }
221           if (FacList[i].Name != NULL)
222             {
223               sprintf(TempBuf, "%%%s-%s-", 
224                       FacList[i].Name, 
225                       SeverityCodes[NT_SEVERITY(ErrorCode)]);
226             }
227           else
228             {
229               sprintf(TempBuf, "%%UNKNOWN-%s-", 
230                       SeverityCodes[NT_SEVERITY(ErrorCode)]);
231             }
232         }
233     }
234   for (i = 0; ErrList[i].Name != NULL; i++)
235     {
236       if (ErrorCode == ErrList[i].Code)
237         {
238           break;
239         }
240     }
241   if (ErrList[i].Name != NULL)
242     {
243       if (Flags & DBG_GET_SHOW_FACILITY)
244         {
245           strcat(TempBuf, ErrList[i].Name);
246           strcat(TempBuf, " ");
247         }
248       if (ErrList[i].Text != NULL)
249         {
250           strcat(TempBuf, ErrList[i].Text);
251         }
252       else
253         {
254           strcat(TempBuf, ErrList[i].Name);
255         }
256     }
257   else
258     {
259       if (Flags & DBG_GET_SHOW_FACILITY)
260         {
261           sprintf(NumBuf, "%08lx", ErrorCode);
262           strcat(TempBuf, NumBuf);
263           strcat(TempBuf, " ");
264         }
265       sprintf(NumBuf, "Unknown Message #%08lx", ErrorCode);
266       strcat(TempBuf, NumBuf);
267     }
268   RtlInitAnsiString(&AnsiString, TempBuf);
269   RtlAnsiStringToUnicodeString(ErrorText, &AnsiString, TRUE);
270 }
271
272 VOID 
273 DbgPrintErrorMessage(NTSTATUS ErrorCode)
274 {
275   UNICODE_STRING ErrorText;
276
277   DbgGetErrorText(ErrorCode, &ErrorText, 0xf);
278   DbgPrint("%wZ\n", &ErrorText);
279   RtlFreeUnicodeString(&ErrorText);
280 }
281
282