windows-nt/Source/XPSP1/NT/base/pnp/setupapi/debug.c
2020-09-26 16:20:57 +08:00

104 lines
1.9 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
debug.c
Abstract:
Diagnositc/debug routines for Windows NT Setup API dll.
Author:
Ted Miller (tedm) 17-Jan-1995
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#if ASSERTS_ON
extern BOOL InInitialization;
VOID
AssertFail(
IN PSTR FileName,
IN UINT LineNumber,
IN PSTR Condition,
IN BOOL NoUI
)
{
int i;
CHAR Name[MAX_PATH];
PCHAR p;
LPSTR Msg;
DWORD msglen;
DWORD sz;
DWORD rc;
rc = GetLastError(); // preserve GLE
//
// Use dll name as caption
//
sz = GetModuleFileNameA(NULL,Name,MAX_PATH);
if((sz == 0) || (sz > MAX_PATH)) {
strcpy(Name,"?");
}
if(p = strrchr(Name,'\\')) {
p++;
} else {
p = Name;
}
msglen = strlen(p)+strlen(FileName)+strlen(Condition)+128;
//
// assert might be out of memory condition
// stack alloc is more likely to succeed than memory alloc
//
try {
Msg = (LPSTR)_alloca(msglen);
wsprintfA(
Msg,
"Assertion failure at line %u in file %s!%s: %s%s",
LineNumber,
p,
FileName,
Condition,
(GlobalSetupFlags & PSPGF_NONINTERACTIVE) ? "\r\n" : "\n\nCall DebugBreak()?"
);
OutputDebugStringA(Msg);
if((GlobalSetupFlags & PSPGF_NONINTERACTIVE) || InInitialization || NoUI) {
i = IDYES;
} else {
i = MessageBoxA(
NULL,
Msg,
p,
MB_YESNO | MB_TASKMODAL | MB_ICONSTOP | MB_SETFOREGROUND
);
}
} except (EXCEPTION_EXECUTE_HANDLER) {
OutputDebugStringA("SetupAPI ASSERT!!!! (out of stack)\r\n");
i=IDYES;
}
if(i == IDYES) {
SetLastError(rc);
DebugBreak();
}
SetLastError(rc);
}
#endif