Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

330 lines
5.5 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
debug.c
Abstract:
Debugging routines exported by the STOR library.
Author:
Matthew D Hendel (math) 29-Apr-2000
Revision History:
--*/
#include "precomp.h"
//#include "ntrtl.h"
#if DBG
BOOLEAN StorQuiet = FALSE;
ULONG StorComponentId = -1;
PCSTR StorDebugPrefix = "STOR: ";
//
// NB: These should come from ntrtl.h
//
ULONG
vDbgPrintExWithPrefix(
IN PCH Prefix,
IN ULONG ComponentId,
IN ULONG Level,
IN PCSTR Format,
va_list arglist
);
NTSYSAPI
ULONG
NTAPI
DbgPrompt(
PCH Prompt,
PCH Response,
ULONG MaximumResponseLength
);
BOOLEAN
StorAssertHelper(
PCHAR Expression,
PCHAR File,
ULONG Line,
PBOOLEAN Ignore
)
{
CHAR Response[2];
DebugPrint (("*** Assertion failed: %s\n", Expression));
DebugPrint (("*** Source File: %s, line %ld\n\n", File, Line));
if (*Ignore == TRUE) {
DebugPrint (("Ignored\n"));
return FALSE;
}
for (;;) {
//
// The following line will print the prefix, not just the space.
//
DebugPrint ((" "));
DbgPrompt( "(B)reak, (S)kip (I)gnore (bsi)? ",
Response,
sizeof (Response) );
switch (tolower (Response[0])) {
case 'b':
return TRUE;
case 'i':
*Ignore = TRUE;
return FALSE;
case 's':
return FALSE;
}
}
}
VOID
StorSetDebugPrefixAndId(
IN PCSTR Prefix,
IN ULONG ComponentId
)
/*++
Routine Description:
Set the default debug prefix to something other than "STOR: ".
Arguments:
Prefix - Supplies the prefix. The pointer to the prefix is saved
preserved, so the prefix memory cannot be paged deallocated.
Generally, using a static string here is best.
ComponentId -
Return Value:
None.
--*/
{
StorDebugPrefix = Prefix;
StorComponentId = ComponentId;
}
VOID
vStorDebugPrintEx(
IN ULONG Level,
IN PCSTR Format,
va_list arglist
)
{
if (Level == DPFLTR_ERROR_LEVEL || !StorQuiet) {
vDbgPrintExWithPrefix ((PSTR)StorDebugPrefix,
StorComponentId,
Level,
Format,
arglist);
}
}
VOID
StorDebugPrintEx(
IN ULONG Level,
IN PCSTR Format,
...
)
{
va_list ap;
va_start (ap, Format);
vStorDebugPrintEx (Level, Format, ap);
va_end (ap);
}
VOID
StorDebugWarn(
IN PCSTR Format,
...
)
{
va_list ap;
va_start (ap, Format);
vStorDebugPrintEx (DPFLTR_WARNING_LEVEL,
Format,
ap);
va_end (ap);
}
VOID
StorDebugTrace(
IN PCSTR Format,
...
)
{
va_list ap;
va_start (ap, Format);
vStorDebugPrintEx (DPFLTR_TRACE_LEVEL,
Format,
ap);
va_end (ap);
}
VOID
StorDebugPrint(
IN PCSTR Format,
...
)
{
va_list ap;
va_start (ap, Format);
vStorDebugPrintEx (DPFLTR_ERROR_LEVEL,
Format,
ap);
va_end (ap);
}
#endif // DBG
//
// The following are support functions for compiler runtime checks.
//
#if defined (_RTC) || (DBG == 1)
typedef struct _RTC_vardesc {
int addr;
int size;
char *name;
} _RTC_vardesc;
typedef struct _RTC_framedesc {
int varCount;
_RTC_vardesc *variables;
} _RTC_framedesc;
VOID
__cdecl
_RTC_InitBase(
VOID
)
{
}
VOID
__cdecl
_RTC_Shutdown(
VOID
)
{
}
VOID
#if defined (_X86_)
__declspec(naked)
#endif // _X86_
__cdecl
_RTC_CheckEsp(
)
{
#if defined (_X86_)
__asm {
jne esperror ;
ret
esperror:
; function prolog
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
push eax ; save the old return value
push edx
push ebx
push esi
push edi
}
DebugPrint (("*** Callstack Check failure at %p\n", _ReturnAddress()));
KdBreakPoint();
__asm {
; function epilog
pop edi
pop esi
pop ebx
pop edx ; restore the old return value
pop eax
mov esp, ebp
pop ebp
ret
}
#endif
}
VOID
FASTCALL
_RTC_CheckStackVars(
PVOID frame,
_RTC_framedesc *v
)
{
int i;
for (i = 0; i < v->varCount; i++) {
int *head = (int *)(((char *)frame) + v->variables[i].addr + v->variables[i].size);
int *tail = (int *)(((char *)frame) + v->variables[i].addr - sizeof(int));
if (*tail != 0xcccccccc || *head != 0xcccccccc) {
DebugPrint(("*** RTC Failure %p: stack corruption near %p (%s)\n",
_ReturnAddress(),
v->variables[i].addr + (ULONG_PTR)frame,
v->variables[i].name));
KdBreakPoint();
}
}
}
VOID
__cdecl
_RTC_UninitUse(
IN PCSTR varname
)
{
DebugPrint(("\n*** RTC Failure %p: uninitialized variable %s.\n",
_ReturnAddress(),
varname));
KdBreakPoint();
}
#endif // _RTC || DBG