ReactOS  0.4.14-dev-49-gfb4591c
debug.c
Go to the documentation of this file.
1 /*
2  * FreeLoader
3  * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
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 along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #include <freeldr.h>
21 #include <debug.h>
22 
23 #if DBG && !defined(_M_ARM)
24 
25 // #define DEBUG_ALL
26 // #define DEBUG_WARN
27 // #define DEBUG_ERR
28 // #define DEBUG_INIFILE
29 // #define DEBUG_REACTOS
30 // #define DEBUG_CUSTOM
31 #define DEBUG_NONE
32 
33 #define DBG_DEFAULT_LEVELS (ERR_LEVEL|FIXME_LEVEL)
34 
35 static UCHAR DbgChannels[DBG_CHANNELS_COUNT];
36 
37 #define SCREEN 1
38 #define RS232 2
39 #define BOCHS 4
40 
41 #define BOCHS_OUTPUT_PORT 0xE9
42 
43 ULONG DebugPort = RS232;
44 
45 /* Serial debug connection */
46 ULONG ComPort = 0; // The COM port initializer chooses the first available port starting from COM4 down to COM1.
47 ULONG BaudRate = 115200;
48 ULONG PortIrq = 0; // Not used at the moment.
49 
50 BOOLEAN DebugStartOfLine = TRUE;
51 
52 VOID DebugInit(IN ULONG_PTR FrLdrSectionId)
53 {
54  PCHAR CommandLine, PortString, BaudString, IrqString;
55  ULONG Value;
56  CHAR DebugString[256];
57 
58  /* Always reset the debugging channels */
59 
60 #if defined (DEBUG_ALL)
61  memset(DbgChannels, MAX_LEVEL, DBG_CHANNELS_COUNT);
62 #elif defined (DEBUG_WARN)
63  memset(DbgChannels, WARN_LEVEL|FIXME_LEVEL|ERR_LEVEL, DBG_CHANNELS_COUNT);
64 #elif defined (DEBUG_ERR)
65  memset(DbgChannels, ERR_LEVEL, DBG_CHANNELS_COUNT);
66 #else
67  memset(DbgChannels, 0, DBG_CHANNELS_COUNT);
68 #endif
69 
70 #if defined (DEBUG_INIFILE)
71  DbgChannels[DPRINT_INIFILE] = MAX_LEVEL;
72 #elif defined (DEBUG_REACTOS)
73  DbgChannels[DPRINT_REACTOS] = MAX_LEVEL;
74  DbgChannels[DPRINT_REGISTRY] = MAX_LEVEL;
75 #elif defined (DEBUG_CUSTOM)
76  DbgChannels[DPRINT_WARNING] = MAX_LEVEL;
77  DbgChannels[DPRINT_WINDOWS] = MAX_LEVEL;
78 #endif
79 
80  /* Check for pre- or main initialization phase */
81  if (FrLdrSectionId == 0)
82  {
83  /* Pre-initialization phase: use the FreeLdr command-line debugging string */
84  CommandLine = (PCHAR)CmdLineGetDebugString();
85 
86  /* If no command-line is provided, initialize the debug port with default settings */
87  if (CommandLine == NULL)
88  goto Done;
89 
90  strcpy(DebugString, CommandLine);
91  }
92  else
93  {
94  /* Main initialization phase: use the FreeLdr INI debugging string */
95  if (!IniReadSettingByName(FrLdrSectionId, "Debug", DebugString, sizeof(DebugString)))
96  {
97  return;
98  }
99  }
100 
101  /* Get the Command Line */
102  CommandLine = DebugString;
103 
104  /* Upcase it */
105  _strupr(CommandLine);
106 
107  /* Get the port and baud rate */
108  PortString = strstr(CommandLine, "DEBUGPORT");
109  BaudString = strstr(CommandLine, "BAUDRATE");
110  IrqString = strstr(CommandLine, "IRQ");
111 
112  /*
113  * Check if we got /DEBUGPORT parameters.
114  * NOTE: Inspired by reactos/ntoskrnl/kd/kdinit.c, KdInitSystem(...)
115  */
116  while (PortString)
117  {
118  /* Move past the actual string, to reach the port*/
119  PortString += strlen("DEBUGPORT");
120 
121  /* Now get past any spaces and skip the equal sign */
122  while (*PortString == ' ') PortString++;
123  PortString++;
124 
125  /* Check for possible ports and set the port to use */
126  if (strncmp(PortString, "SCREEN", 6) == 0)
127  {
128  PortString += 6;
129  DebugPort |= SCREEN;
130  }
131  else if (strncmp(PortString, "BOCHS", 5) == 0)
132  {
133  PortString += 5;
134  DebugPort |= BOCHS;
135  }
136  else if (strncmp(PortString, "COM", 3) == 0)
137  {
138  PortString += 3;
139  DebugPort |= RS232;
140 
141  /* Set the port to use */
142  Value = atol(PortString);
143  if (Value) ComPort = Value;
144  }
145 
146  PortString = strstr(PortString, "DEBUGPORT");
147  }
148 
149  /* Check if we got a baud rate */
150  if (BaudString)
151  {
152  /* Move past the actual string, to reach the rate */
153  BaudString += strlen("BAUDRATE");
154 
155  /* Now get past any spaces */
156  while (*BaudString == ' ') BaudString++;
157 
158  /* And make sure we have a rate */
159  if (*BaudString)
160  {
161  /* Read and set it */
162  Value = atol(BaudString + 1);
163  if (Value) BaudRate = Value;
164  }
165  }
166 
167  /* Check Serial Port Settings [IRQ] */
168  if (IrqString)
169  {
170  /* Move past the actual string, to reach the rate */
171  IrqString += strlen("IRQ");
172 
173  /* Now get past any spaces */
174  while (*IrqString == ' ') IrqString++;
175 
176  /* And make sure we have an IRQ */
177  if (*IrqString)
178  {
179  /* Read and set it */
180  Value = atol(IrqString + 1);
181  if (Value) PortIrq = Value;
182  }
183  }
184 
185 Done:
186  /* Try to initialize the port; if it fails, remove the corresponding flag */
187  if (DebugPort & RS232)
188  {
189  if (!Rs232PortInitialize(ComPort, BaudRate))
190  DebugPort &= ~RS232;
191  }
192 }
193 
194 VOID DebugPrintChar(UCHAR Character)
195 {
196  if (Character == '\n')
197  DebugStartOfLine = TRUE;
198 
199  if (DebugPort & RS232)
200  {
201  if (Character == '\n')
202  Rs232PortPutByte('\r');
203 
204  Rs232PortPutByte(Character);
205  }
206  if (DebugPort & BOCHS)
207  {
208  WRITE_PORT_UCHAR((PUCHAR)BOCHS_OUTPUT_PORT, Character);
209  }
210  if (DebugPort & SCREEN)
211  {
212  MachConsPutChar(Character);
213  }
214 }
215 
216 ULONG
217 DbgPrint(const char *Format, ...)
218 {
219  va_list ap;
220  int Length;
221  char* ptr;
222  CHAR Buffer[512];
223 
224  va_start(ap, Format);
225  Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap);
226  va_end(ap);
227 
228  /* Check if we went past the buffer */
229  if (Length == -1)
230  {
231  /* Terminate it if we went over-board */
232  Buffer[sizeof(Buffer) - 1] = '\n';
233 
234  /* Put maximum */
235  Length = sizeof(Buffer);
236  }
237 
238  ptr = Buffer;
239  while (Length--)
240  DebugPrintChar(*ptr++);
241 
242  return 0;
243 }
244 
245 VOID
246 DbgPrint2(ULONG Mask, ULONG Level, const char *File, ULONG Line, char *Format, ...)
247 {
248  va_list ap;
249  char Buffer[2096];
250  char *ptr = Buffer;
251 
252  /* Mask out unwanted debug messages */
253  if (!(DbgChannels[Mask] & Level) && !(Level & DBG_DEFAULT_LEVELS))
254  {
255  return;
256  }
257 
258  /* Print the header if we have started a new line */
259  if (DebugStartOfLine)
260  {
261  DbgPrint("(%s:%lu) ", File, Line);
262 
263  switch (Level)
264  {
265  case ERR_LEVEL:
266  DbgPrint("err: ");
267  break;
268  case FIXME_LEVEL:
269  DbgPrint("fixme: ");
270  break;
271  case WARN_LEVEL:
272  DbgPrint("warn: ");
273  break;
274  case TRACE_LEVEL:
275  DbgPrint("trace: ");
276  break;
277  }
278 
279  DebugStartOfLine = FALSE;
280  }
281 
282  va_start(ap, Format);
284  va_end(ap);
285 
286  while (*ptr)
287  {
288  DebugPrintChar(*ptr++);
289  }
290 }
291 
292 VOID
293 DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length)
294 {
295  PUCHAR BufPtr = (PUCHAR)Buffer;
296  ULONG Offset, Count, i;
297 
298  /* Mask out unwanted debug messages */
299  if (!(DbgChannels[Mask] & TRACE_LEVEL))
300  return;
301 
302  DebugStartOfLine = FALSE; // We don't want line headers
303  DbgPrint("Dumping buffer at %p with length of %lu bytes:\n", Buffer, Length);
304 
305  Offset = 0;
306  while (Offset < Length)
307  {
308  /* We don't want line headers */
309  DebugStartOfLine = FALSE;
310 
311  /* Print the offset */
312  DbgPrint("%04x:\t", Offset);
313 
314  /* Print either 16 or the remaining number of bytes */
315  Count = min(Length - Offset, 16);
316  for (i = 0; i < Count; i++, Offset++)
317  {
318  DbgPrint("%02x%c", BufPtr[Offset], (i == 7) ? '-' : ' ');
319  }
320 
321  DbgPrint("\n");
322  }
323 }
324 
325 static BOOLEAN
326 DbgAddDebugChannel(CHAR* channel, CHAR* level, CHAR op)
327 {
328  int iLevel, iChannel;
329 
330  if (channel == NULL || *channel == '\0' || strlen(channel) == 0)
331  return FALSE;
332 
333  if (level == NULL || *level == '\0' || strlen(level) == 0)
334  iLevel = MAX_LEVEL;
335  else if (strcmp(level, "err") == 0)
336  iLevel = ERR_LEVEL;
337  else if (strcmp(level, "fixme") == 0)
338  iLevel = FIXME_LEVEL;
339  else if (strcmp(level, "warn") == 0)
340  iLevel = WARN_LEVEL;
341  else if (strcmp(level, "trace") == 0)
342  iLevel = TRACE_LEVEL;
343  else
344  return FALSE;
345 
346  if (strcmp(channel, "memory" ) == 0) iChannel = DPRINT_MEMORY;
347  else if (strcmp(channel, "filesystem") == 0) iChannel = DPRINT_FILESYSTEM;
348  else if (strcmp(channel, "inifile" ) == 0) iChannel = DPRINT_INIFILE;
349  else if (strcmp(channel, "ui" ) == 0) iChannel = DPRINT_UI;
350  else if (strcmp(channel, "disk" ) == 0) iChannel = DPRINT_DISK;
351  else if (strcmp(channel, "cache" ) == 0) iChannel = DPRINT_CACHE;
352  else if (strcmp(channel, "registry" ) == 0) iChannel = DPRINT_REGISTRY;
353  else if (strcmp(channel, "linux" ) == 0) iChannel = DPRINT_LINUX;
354  else if (strcmp(channel, "hwdetect" ) == 0) iChannel = DPRINT_HWDETECT;
355  else if (strcmp(channel, "windows" ) == 0) iChannel = DPRINT_WINDOWS;
356  else if (strcmp(channel, "peloader" ) == 0) iChannel = DPRINT_PELOADER;
357  else if (strcmp(channel, "scsiport" ) == 0) iChannel = DPRINT_SCSIPORT;
358  else if (strcmp(channel, "heap" ) == 0) iChannel = DPRINT_HEAP;
359  else if (strcmp(channel, "all" ) == 0)
360  {
361  int i;
362 
363  for (i = 0; i < DBG_CHANNELS_COUNT; i++)
364  {
365  if (op == '+')
366  DbgChannels[i] |= iLevel;
367  else
368  DbgChannels[i] &= ~iLevel;
369  }
370 
371  return TRUE;
372  }
373  else return FALSE;
374 
375  if (op == '+')
376  DbgChannels[iChannel] |= iLevel;
377  else
378  DbgChannels[iChannel] &= ~iLevel;
379 
380  return TRUE;
381 }
382 
383 VOID
385 {
386  CHAR *str, *separator, *c, op;
387 
388  str = Value;
389 
390  do
391  {
392  separator = strchr(str, ',');
393  if (separator != NULL)
394  *separator = '\0';
395 
396  c = strchr(str, '+');
397  if (c == NULL)
398  c = strchr(str, '-');
399 
400  if (c != NULL)
401  {
402  op = *c;
403  *c = '\0';
404  c++;
405 
406  DbgAddDebugChannel(c, str, op);
407  }
408 
409  str = separator + 1;
410  } while (separator != NULL);
411 }
412 
413 #else
414 
415 ULONG
417 {
418  return 0;
419 }
420 
421 #endif // DBG
422 
423 ULONG
424 MsgBoxPrint(const char *Format, ...)
425 {
426  va_list ap;
427  CHAR Buffer[512];
428  ULONG Length;
429 
430  va_start(ap, Format);
431 
432  /* Construct a string */
433  Length = _vsnprintf(Buffer, 512, Format, ap);
434 
435  /* Check if we went past the buffer */
436  if (Length == MAXULONG)
437  {
438  /* Terminate it if we went over-board */
439  Buffer[sizeof(Buffer) - 1] = '\n';
440 
441  /* Put maximum */
442  Length = sizeof(Buffer);
443  }
444 
445  /* Show it as a message box */
447 
448  /* Cleanup and exit */
449  va_end(ap);
450  return 0;
451 }
452 
454 VOID
455 NTAPI
457  IN ULONG BugCheckCode,
458  IN ULONG_PTR BugCheckParameter1,
459  IN ULONG_PTR BugCheckParameter2,
460  IN ULONG_PTR BugCheckParameter3,
461  IN ULONG_PTR BugCheckParameter4)
462 {
463  char Buffer[70];
464 
465  sprintf(Buffer,
466  "*** STOP: 0x%08lX (0x%p,0x%p,0x%p,0x%p)",
467  BugCheckCode,
468  (PVOID)BugCheckParameter1,
469  (PVOID)BugCheckParameter2,
470  (PVOID)BugCheckParameter3,
471  (PVOID)BugCheckParameter4);
472 
474  ASSERT(FALSE);
475  for (;;);
476 }
477 
478 VOID
479 NTAPI
480 RtlAssert(IN PVOID FailedAssertion,
481  IN PVOID FileName,
484 {
485  if (Message)
486  {
487  DbgPrint("Assertion \'%s\' failed at %s line %lu: %s\n",
488  (PCHAR)FailedAssertion,
489  (PCHAR)FileName,
490  LineNumber,
491  Message);
492  }
493  else
494  {
495  DbgPrint("Assertion \'%s\' failed at %s line %lu\n",
496  (PCHAR)FailedAssertion,
497  (PCHAR)FileName,
498  LineNumber);
499  }
500 
501  DbgBreakPoint();
502 }
503 
504 char *BugCodeStrings[] =
505 {
506  "TEST_BUGCHECK",
507  "MISSING_HARDWARE_REQUIREMENTS",
508  "FREELDR_IMAGE_CORRUPTION",
509  "MEMORY_INIT_FAILURE",
510 };
511 
ULONG DbgPrint(PCCH Format,...)
Definition: debug.c:416
_In_opt_ ULONG _Out_ PULONG Value
Definition: rtlfuncs.h:2343
signed char * PCHAR
Definition: retypes.h:7
#define MAX_LEVEL
Definition: cdmake.c:83
GLint level
Definition: gl.h:1546
#define IN
Definition: typedefs.h:38
#define DPRINT_PELOADER
Definition: debug.h:36
#define TRUE
Definition: types.h:120
PCSTR CmdLineGetDebugString(VOID)
Definition: cmdline.c:123
static const WCHAR separator[]
Definition: asmname.c:63
#define DbgParseDebugChannels(val)
Definition: debug.h:119
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
unsigned char * PUCHAR
Definition: retypes.h:3
#define DebugInit(FrLdrSectionId)
Definition: debug.h:116
char CHAR
Definition: xmlstorage.h:175
BOOLEAN Rs232PortInitialize(ULONG ComPort, ULONG BaudRate)
#define DPRINT_WARNING
Definition: debug.h:24
#define DPRINT_HEAP
Definition: debug.h:38
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
#define DPRINT_UI
Definition: debug.h:28
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:55
VOID Rs232PortPutByte(UCHAR ByteToSend)
VOID NTAPI RtlAssert(IN PVOID FailedAssertion, IN PVOID FileName, IN ULONG LineNumber, IN PCHAR Message OPTIONAL)
Definition: debug.c:480
#define DECLSPEC_NORETURN
Definition: ntbasedef.h:176
uint32_t ULONG_PTR
Definition: typedefs.h:63
char * BugCodeStrings[]
Definition: debug.c:504
#define sprintf(buf, format,...)
Definition: sprintf.c:55
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define va_end(ap)
Definition: acmsvcex.h:90
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
static PVOID ptr
Definition: dispmode.c:27
VOID UiMessageBox(PCSTR Format,...)
Definition: ui.c:320
const WCHAR * str
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
char * va_list
Definition: acmsvcex.h:78
Definition: bufpool.h:45
#define DPRINT_HWDETECT
Definition: debug.h:34
ULONG_PTR BugCheckInfo[5]
Definition: debug.c:512
#define DPRINT_LINUX
Definition: debug.h:33
#define PCHAR
Definition: match.c:90
BOOLEAN IniReadSettingByName(ULONG_PTR SectionId, PCSTR SettingName, PCHAR Buffer, ULONG BufferSize)
Definition: inifile.c:147
#define DPRINT_INIFILE
Definition: debug.h:27
#define DPRINT_REACTOS
Definition: debug.h:32
CONST CHAR * PCCH
Definition: ntbasedef.h:399
#define MachConsPutChar(Ch)
Definition: machine.h:86
const GLubyte * c
Definition: glext.h:8905
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
#define DPRINT_FILESYSTEM
Definition: debug.h:26
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
_Check_return_ long __cdecl atol(_In_z_ const char *_Str)
#define DPRINT_CACHE
Definition: debug.h:30
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
CHAR Message[80]
Definition: alive.c:5
Definition: ncftp.h:79
unsigned char UCHAR
Definition: xmlstorage.h:181
#define DPRINT_MEMORY
Definition: debug.h:25
#define DPRINT_SCSIPORT
Definition: debug.h:37
#define MAXULONG
Definition: typedefs.h:250
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 LineNumber
Definition: acpixf.h:1206
_CRTIMP char *__cdecl _strupr(_Inout_z_ char *_String)
int __cdecl vsprintf(char *_Dest, const char *_Format, va_list _Args)
Definition: sprintf.c:733
#define min(a, b)
Definition: monoChain.cc:55
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define DPRINT_WINDOWS
Definition: debug.h:35
#define DPRINT_REGISTRY
Definition: debug.h:31
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
Definition: debug.c:456
#define _vsnprintf
Definition: xmlstorage.h:202
char * strchr(const char *String, int ch)
Definition: utclib.c:501
void int int ULONGLONG int va_list * ap
Definition: winesup.h:32
NTKERNELAPI VOID DbgBreakPoint()
Definition: debug.c:6
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define DPRINT_DISK
Definition: debug.h:29
#define c
Definition: ke_i.h:80
unsigned int ULONG
Definition: retypes.h:1
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
void WRITE_PORT_UCHAR(PUCHAR Address, UCHAR Value)
Definition: mach.c:532
CCHAR DebugString[256]
Definition: cmdline.c:22
UINT op
Definition: effect.c:223
ULONG MsgBoxPrint(const char *Format,...)
Definition: debug.c:424
Definition: File.h:15
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
#define memset(x, y, z)
Definition: compat.h:39
VOID UiMessageBoxCritical(PCSTR MessageText)
Definition: ui.c:331
#define DBG_CHANNELS_COUNT
Definition: debug.h:39
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68