ReactOS  0.4.15-dev-1207-g698a8e6
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 #if defined(SARCH_PC98)
47 ULONG BaudRate = 9600;
48 #else
49 ULONG BaudRate = 115200;
50 #endif
51 
52 ULONG ComPort = 0; // The COM port initializer chooses the first available port starting from COM4 down to COM1.
53 ULONG PortIrq = 0; // Not used at the moment.
54 
55 BOOLEAN DebugStartOfLine = TRUE;
56 
57 VOID DebugInit(IN ULONG_PTR FrLdrSectionId)
58 {
59  PCHAR CommandLine, PortString, BaudString, IrqString;
60  ULONG Value;
61  CHAR DebugString[256];
62 
63  /* Always reset the debugging channels */
64 
65 #if defined (DEBUG_ALL)
66  memset(DbgChannels, MAX_LEVEL, DBG_CHANNELS_COUNT);
67 #elif defined (DEBUG_WARN)
68  memset(DbgChannels, WARN_LEVEL|FIXME_LEVEL|ERR_LEVEL, DBG_CHANNELS_COUNT);
69 #elif defined (DEBUG_ERR)
70  memset(DbgChannels, ERR_LEVEL, DBG_CHANNELS_COUNT);
71 #else
72  memset(DbgChannels, 0, DBG_CHANNELS_COUNT);
73 #endif
74 
75 #if defined (DEBUG_INIFILE)
76  DbgChannels[DPRINT_INIFILE] = MAX_LEVEL;
77 #elif defined (DEBUG_REACTOS)
78  DbgChannels[DPRINT_REACTOS] = MAX_LEVEL;
79  DbgChannels[DPRINT_REGISTRY] = MAX_LEVEL;
80 #elif defined (DEBUG_CUSTOM)
81  DbgChannels[DPRINT_WARNING] = MAX_LEVEL;
82  DbgChannels[DPRINT_WINDOWS] = MAX_LEVEL;
83 #endif
84 
85  /* Check for pre- or main initialization phase */
86  if (FrLdrSectionId == 0)
87  {
88  /* Pre-initialization phase: use the FreeLdr command-line debugging string */
89  CommandLine = (PCHAR)CmdLineGetDebugString();
90 
91  /* If no command-line is provided, initialize the debug port with default settings */
92  if (CommandLine == NULL)
93  goto Done;
94 
95  strcpy(DebugString, CommandLine);
96  }
97  else
98  {
99  /* Main initialization phase: use the FreeLdr INI debugging string */
100  if (!IniReadSettingByName(FrLdrSectionId, "Debug", DebugString, sizeof(DebugString)))
101  {
102  return;
103  }
104  }
105 
106  /* Get the Command Line */
107  CommandLine = DebugString;
108 
109  /* Upcase it */
110  _strupr(CommandLine);
111 
112  /* Get the port and baud rate */
113  PortString = strstr(CommandLine, "DEBUGPORT");
114  BaudString = strstr(CommandLine, "BAUDRATE");
115  IrqString = strstr(CommandLine, "IRQ");
116 
117  /*
118  * Check if we got /DEBUGPORT parameters.
119  * NOTE: Inspired by reactos/ntoskrnl/kd/kdinit.c, KdInitSystem(...)
120  */
121  while (PortString)
122  {
123  /* Move past the actual string, to reach the port*/
124  PortString += strlen("DEBUGPORT");
125 
126  /* Now get past any spaces and skip the equal sign */
127  while (*PortString == ' ') PortString++;
128  PortString++;
129 
130  /* Check for possible ports and set the port to use */
131  if (strncmp(PortString, "SCREEN", 6) == 0)
132  {
133  PortString += 6;
134  DebugPort |= SCREEN;
135  }
136  else if (strncmp(PortString, "BOCHS", 5) == 0)
137  {
138  PortString += 5;
139  DebugPort |= BOCHS;
140  }
141  else if (strncmp(PortString, "COM", 3) == 0)
142  {
143  PortString += 3;
144  DebugPort |= RS232;
145 
146  /* Set the port to use */
147  Value = atol(PortString);
148  if (Value) ComPort = Value;
149  }
150 
151  PortString = strstr(PortString, "DEBUGPORT");
152  }
153 
154  /* Check if we got a baud rate */
155  if (BaudString)
156  {
157  /* Move past the actual string, to reach the rate */
158  BaudString += strlen("BAUDRATE");
159 
160  /* Now get past any spaces */
161  while (*BaudString == ' ') BaudString++;
162 
163  /* And make sure we have a rate */
164  if (*BaudString)
165  {
166  /* Read and set it */
167  Value = atol(BaudString + 1);
168  if (Value) BaudRate = Value;
169  }
170  }
171 
172  /* Check Serial Port Settings [IRQ] */
173  if (IrqString)
174  {
175  /* Move past the actual string, to reach the rate */
176  IrqString += strlen("IRQ");
177 
178  /* Now get past any spaces */
179  while (*IrqString == ' ') IrqString++;
180 
181  /* And make sure we have an IRQ */
182  if (*IrqString)
183  {
184  /* Read and set it */
185  Value = atol(IrqString + 1);
186  if (Value) PortIrq = Value;
187  }
188  }
189 
190 Done:
191  /* Try to initialize the port; if it fails, remove the corresponding flag */
192  if (DebugPort & RS232)
193  {
194  if (!Rs232PortInitialize(ComPort, BaudRate))
195  DebugPort &= ~RS232;
196  }
197 }
198 
199 VOID DebugPrintChar(UCHAR Character)
200 {
201  if (Character == '\n')
202  DebugStartOfLine = TRUE;
203 
204  if (DebugPort & RS232)
205  {
206  if (Character == '\n')
207  Rs232PortPutByte('\r');
208 
209  Rs232PortPutByte(Character);
210  }
211  if (DebugPort & BOCHS)
212  {
213  WRITE_PORT_UCHAR((PUCHAR)BOCHS_OUTPUT_PORT, Character);
214  }
215  if (DebugPort & SCREEN)
216  {
217  MachConsPutChar(Character);
218  }
219 }
220 
221 ULONG
222 DbgPrint(const char *Format, ...)
223 {
224  va_list ap;
225  int Length;
226  char* ptr;
227  CHAR Buffer[512];
228 
229  va_start(ap, Format);
230  Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap);
231  va_end(ap);
232 
233  /* Check if we went past the buffer */
234  if (Length == -1)
235  {
236  /* Terminate it if we went over-board */
237  Buffer[sizeof(Buffer) - 1] = '\n';
238 
239  /* Put maximum */
240  Length = sizeof(Buffer);
241  }
242 
243  ptr = Buffer;
244  while (Length--)
245  DebugPrintChar(*ptr++);
246 
247  return 0;
248 }
249 
250 VOID
251 DbgPrint2(ULONG Mask, ULONG Level, const char *File, ULONG Line, char *Format, ...)
252 {
253  va_list ap;
254  char Buffer[2096];
255  char *ptr = Buffer;
256 
257  /* Mask out unwanted debug messages */
258  if (!(DbgChannels[Mask] & Level) && !(Level & DBG_DEFAULT_LEVELS))
259  {
260  return;
261  }
262 
263  /* Print the header if we have started a new line */
264  if (DebugStartOfLine)
265  {
266  DbgPrint("(%s:%lu) ", File, Line);
267 
268  switch (Level)
269  {
270  case ERR_LEVEL:
271  DbgPrint("err: ");
272  break;
273  case FIXME_LEVEL:
274  DbgPrint("fixme: ");
275  break;
276  case WARN_LEVEL:
277  DbgPrint("warn: ");
278  break;
279  case TRACE_LEVEL:
280  DbgPrint("trace: ");
281  break;
282  }
283 
284  DebugStartOfLine = FALSE;
285  }
286 
287  va_start(ap, Format);
289  va_end(ap);
290 
291  while (*ptr)
292  {
293  DebugPrintChar(*ptr++);
294  }
295 }
296 
297 VOID
298 DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length)
299 {
300  PUCHAR BufPtr = (PUCHAR)Buffer;
301  ULONG Offset, Count, i;
302 
303  /* Mask out unwanted debug messages */
304  if (!(DbgChannels[Mask] & TRACE_LEVEL))
305  return;
306 
307  DebugStartOfLine = FALSE; // We don't want line headers
308  DbgPrint("Dumping buffer at %p with length of %lu bytes:\n", Buffer, Length);
309 
310  Offset = 0;
311  while (Offset < Length)
312  {
313  /* We don't want line headers */
314  DebugStartOfLine = FALSE;
315 
316  /* Print the offset */
317  DbgPrint("%04x:\t", Offset);
318 
319  /* Print either 16 or the remaining number of bytes */
320  Count = min(Length - Offset, 16);
321  for (i = 0; i < Count; i++, Offset++)
322  {
323  DbgPrint("%02x%c", BufPtr[Offset], (i == 7) ? '-' : ' ');
324  }
325 
326  DbgPrint("\n");
327  }
328 }
329 
330 VOID
331 DebugDisableScreenPort(VOID)
332 {
333  DebugPort &= ~SCREEN;
334 }
335 
336 static BOOLEAN
337 DbgAddDebugChannel(CHAR* channel, CHAR* level, CHAR op)
338 {
339  int iLevel, iChannel;
340 
341  if (channel == NULL || *channel == '\0' || strlen(channel) == 0)
342  return FALSE;
343 
344  if (level == NULL || *level == '\0' || strlen(level) == 0)
345  iLevel = MAX_LEVEL;
346  else if (strcmp(level, "err") == 0)
347  iLevel = ERR_LEVEL;
348  else if (strcmp(level, "fixme") == 0)
349  iLevel = FIXME_LEVEL;
350  else if (strcmp(level, "warn") == 0)
351  iLevel = WARN_LEVEL;
352  else if (strcmp(level, "trace") == 0)
353  iLevel = TRACE_LEVEL;
354  else
355  return FALSE;
356 
357  if (strcmp(channel, "memory" ) == 0) iChannel = DPRINT_MEMORY;
358  else if (strcmp(channel, "filesystem") == 0) iChannel = DPRINT_FILESYSTEM;
359  else if (strcmp(channel, "inifile" ) == 0) iChannel = DPRINT_INIFILE;
360  else if (strcmp(channel, "ui" ) == 0) iChannel = DPRINT_UI;
361  else if (strcmp(channel, "disk" ) == 0) iChannel = DPRINT_DISK;
362  else if (strcmp(channel, "cache" ) == 0) iChannel = DPRINT_CACHE;
363  else if (strcmp(channel, "registry" ) == 0) iChannel = DPRINT_REGISTRY;
364  else if (strcmp(channel, "linux" ) == 0) iChannel = DPRINT_LINUX;
365  else if (strcmp(channel, "hwdetect" ) == 0) iChannel = DPRINT_HWDETECT;
366  else if (strcmp(channel, "windows" ) == 0) iChannel = DPRINT_WINDOWS;
367  else if (strcmp(channel, "peloader" ) == 0) iChannel = DPRINT_PELOADER;
368  else if (strcmp(channel, "scsiport" ) == 0) iChannel = DPRINT_SCSIPORT;
369  else if (strcmp(channel, "heap" ) == 0) iChannel = DPRINT_HEAP;
370  else if (strcmp(channel, "all" ) == 0)
371  {
372  int i;
373 
374  for (i = 0; i < DBG_CHANNELS_COUNT; i++)
375  {
376  if (op == '+')
377  DbgChannels[i] |= iLevel;
378  else
379  DbgChannels[i] &= ~iLevel;
380  }
381 
382  return TRUE;
383  }
384  else return FALSE;
385 
386  if (op == '+')
387  DbgChannels[iChannel] |= iLevel;
388  else
389  DbgChannels[iChannel] &= ~iLevel;
390 
391  return TRUE;
392 }
393 
394 VOID
396 {
397  CHAR *str, *separator, *c, op;
398 
399  str = Value;
400 
401  do
402  {
403  separator = strchr(str, ',');
404  if (separator != NULL)
405  *separator = '\0';
406 
407  c = strchr(str, '+');
408  if (c == NULL)
409  c = strchr(str, '-');
410 
411  if (c != NULL)
412  {
413  op = *c;
414  *c = '\0';
415  c++;
416 
417  DbgAddDebugChannel(c, str, op);
418  }
419 
420  str = separator + 1;
421  } while (separator != NULL);
422 }
423 
424 #else
425 
426 ULONG
428 {
429  return 0;
430 }
431 
432 #endif // DBG
433 
434 ULONG
435 MsgBoxPrint(const char *Format, ...)
436 {
437  va_list ap;
438  CHAR Buffer[512];
439  ULONG Length;
440 
441  va_start(ap, Format);
442 
443  /* Construct a string */
444  Length = _vsnprintf(Buffer, 512, Format, ap);
445 
446  /* Check if we went past the buffer */
447  if (Length == MAXULONG)
448  {
449  /* Terminate it if we went over-board */
450  Buffer[sizeof(Buffer) - 1] = '\n';
451 
452  /* Put maximum */
453  Length = sizeof(Buffer);
454  }
455 
456  /* Show it as a message box */
458 
459  /* Cleanup and exit */
460  va_end(ap);
461  return 0;
462 }
463 
465 VOID
466 NTAPI
468  IN ULONG BugCheckCode,
469  IN ULONG_PTR BugCheckParameter1,
470  IN ULONG_PTR BugCheckParameter2,
471  IN ULONG_PTR BugCheckParameter3,
472  IN ULONG_PTR BugCheckParameter4)
473 {
474  char Buffer[70];
475 
476  sprintf(Buffer,
477  "*** STOP: 0x%08lX (0x%p,0x%p,0x%p,0x%p)",
478  BugCheckCode,
479  (PVOID)BugCheckParameter1,
480  (PVOID)BugCheckParameter2,
481  (PVOID)BugCheckParameter3,
482  (PVOID)BugCheckParameter4);
483 
485  ASSERT(FALSE);
486  for (;;);
487 }
488 
489 VOID
490 NTAPI
491 RtlAssert(IN PVOID FailedAssertion,
492  IN PVOID FileName,
495 {
496  if (Message)
497  {
498  DbgPrint("Assertion \'%s\' failed at %s line %lu: %s\n",
499  (PCHAR)FailedAssertion,
500  (PCHAR)FileName,
501  LineNumber,
502  Message);
503  }
504  else
505  {
506  DbgPrint("Assertion \'%s\' failed at %s line %lu\n",
507  (PCHAR)FailedAssertion,
508  (PCHAR)FileName,
509  LineNumber);
510  }
511 
512  DbgBreakPoint();
513 }
514 
515 char *BugCodeStrings[] =
516 {
517  "TEST_BUGCHECK",
518  "MISSING_HARDWARE_REQUIREMENTS",
519  "FREELDR_IMAGE_CORRUPTION",
520  "MEMORY_INIT_FAILURE",
521 };
522 
ULONG DbgPrint(PCCH Format,...)
Definition: debug.c:427
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:39
#define DPRINT_PELOADER
Definition: debug.h:36
PCSTR CmdLineGetDebugString(VOID)
Definition: cmdline.c:123
static const WCHAR separator[]
Definition: asmname.c:65
#define DbgParseDebugChannels(val)
Definition: debug.h:120
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define TRUE
Definition: types.h:120
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
unsigned char * PUCHAR
Definition: retypes.h:3
#define DebugInit(FrLdrSectionId)
Definition: debug.h:117
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:1223
#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:491
#define DECLSPEC_NORETURN
Definition: ntbasedef.h:176
IN UCHAR Value
Definition: halp.h:394
uint32_t ULONG_PTR
Definition: typedefs.h:65
char * BugCodeStrings[]
Definition: debug.c:515
#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
#define FALSE
Definition: types.h:117
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:523
#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:393
#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
UINT op
Definition: effect.c:224
_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 WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:20
#define DPRINT_SCSIPORT
Definition: debug.h:37
#define MAXULONG
Definition: typedefs.h:251
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:1216
_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:467
#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
CCHAR DebugString[256]
Definition: cmdline.c:22
ULONG MsgBoxPrint(const char *Format,...)
Definition: debug.c:435
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