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.
 
 
 
 
 
 

246 lines
4.8 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
Debug.c
Abstract:
This module contains debugging support.
Author:
David J. Gilman (davegi) 30-Jul-1992
Environment:
User Mode
--*/
//
// Global flag bits.
//
struct
DEBUG_FLAGS {
int DebuggerAttached:1;
} WintoolsGlobalFlags;
#if DBG
#include <stdarg.h>
#include <stdio.h>
#include "wintools.h"
//
// Internal function prototypes.
//
LPCWSTR
DebugFormatStringW(
IN DWORD Flags,
IN LPCWSTR Format,
IN va_list* Args
);
VOID
DebugAssertW(
IN LPCWSTR Expression,
IN LPCSTR File,
IN DWORD LineNumber
)
/*++
Routine Description:
Display an assertion failure message box which gives the user a choice
as to whether the process should be aborted, the assertion ignored or
a break exception generated.
Arguments:
Expression - Supplies a string representation of the failed assertion.
File - Supplies a pointer to the file name where the assertion
failed.
LineNumber - Supplies the line number in the file where the assertion
failed.
Return Value:
None.
--*/
{
LPCWSTR Buffer;
DWORD_PTR Args[ ] = {
( DWORD_PTR ) Expression,
( DWORD_PTR ) GetLastError( ),
( DWORD_PTR ) File,
( DWORD_PTR ) LineNumber
};
DbgPointerAssert( Expression );
DbgPointerAssert( File );
//
// Format the assertion string that describes the failure.
//
Buffer = DebugFormatStringW(
FORMAT_MESSAGE_ARGUMENT_ARRAY,
L"Assertion Failed : %1!s! (%2!d!)\nin file %3!hs! at line %4!d!\n",
( va_list* ) Args
);
//
// If the debugger is attached flag is set, display the string on the
// debugger and break. If not generate a pop-up and leave the choice
// to the user.
//
if( WintoolsGlobalFlags.DebuggerAttached ) {
OutputDebugString( Buffer );
DebugBreak( );
} else {
int Response;
WCHAR ModuleBuffer[ MAX_PATH ];
DWORD Length;
//
// Get the asserting module's file name.
//
Length = GetModuleFileName(
NULL,
ModuleBuffer,
ARRAYSIZE(ModuleBuffer)
);
//
// Display the assertin message and gives the user the choice of:
// Abort: - kills the process.
// Retry: - generates a breakpoint exception.
// Ignore: - continues the process.
//
Response = MessageBox(
NULL,
Buffer,
( Length != 0 ) ? ModuleBuffer : L"Assertion Failure",
MB_ABORTRETRYIGNORE | MB_ICONHAND | MB_SETFOREGROUND | MB_TASKMODAL
);
switch( Response ) {
//
// Terminate the process.
//
case IDABORT:
{
ExitProcess( (UINT) -1 );
break;
}
//
// Ignore the failed assertion.
//
case IDIGNORE:
{
break;
}
//
// Break into a debugger.
//
case IDRETRY:
{
DebugBreak( );
break;
}
//
// Break into a debugger because of a catastrophic failure.
//
default:
{
DebugBreak( );
break;
}
}
}
}
LPCWSTR
DebugFormatStringW(
IN DWORD Flags,
IN LPCWSTR Format,
IN va_list* Args
)
/*++
Routine Description:
Formats a string using the FormatMessage API.
Arguments:
Flags - Supplies flags which are used to control the FormatMessage API.
Format - Supplies a printf style format string.
Args - Supplies a list of arguments whose format is depndent on the
flags valuse.
Return Value:
LPCWSTR - Returns a pointer to the formatted string.
--*/
{
static
WCHAR Buffer[ MAX_CHARS ];
DWORD Count;
DbgPointerAssert( Format );
//
// Format the string.
//
Count = FormatMessageW(
Flags | FORMAT_MESSAGE_FROM_STRING & ~FORMAT_MESSAGE_FROM_HMODULE,
( LPVOID ) Format,
0,
0,
Buffer,
ARRAYSIZE( Buffer ),
Args
);
DbgAssert( Count != 0 );
//
// Return the formatted string.
//
return Buffer;
}
#endif // DBG