/*++ 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 #include #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