mirror of https://github.com/lianthony/NT4.0
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.
120 lines
2.9 KiB
120 lines
2.9 KiB
/*****************************************************************************
|
|
* *
|
|
* ASSERTF.C *
|
|
* *
|
|
* Copyright (C) Microsoft Corporation 1991. *
|
|
* All Rights reserved. *
|
|
* *
|
|
*****************************************************************************/
|
|
|
|
#include "help.h"
|
|
|
|
#if defined(_DEBUG)
|
|
|
|
/***************************************************************************
|
|
|
|
FUNCTION: FatalPchW
|
|
|
|
PURPOSE: Report an assertion error
|
|
|
|
PARAMETERS:
|
|
pszExpression -- expression causing the assert
|
|
pszFile -- file the assertion occurred in
|
|
line -- line where the assertion occurred
|
|
|
|
RETURNS:
|
|
Won't return unless user agrees
|
|
|
|
COMMENTS:
|
|
Only exists in debug build
|
|
|
|
MODIFICATION DATES:
|
|
09-Jul-1994 [ralphw]
|
|
|
|
***************************************************************************/
|
|
|
|
VOID STDCALL FatalPchW(PCSTR pszExpression, PCSTR pszFile, int line)
|
|
{
|
|
char szBuf[512], szErrorFile[30];
|
|
char szExpression[256];
|
|
HFILE hf;
|
|
OFSTRUCT of;
|
|
char szName[_MAX_FNAME];
|
|
int answer;
|
|
static BOOL fInErrorRoutine = FALSE;
|
|
|
|
if (fInErrorRoutine)
|
|
return; // only allow one message box up at a time
|
|
|
|
/*
|
|
* Sometimes the expression will have been obtained via GetStringResource,
|
|
* so we make a copy of it here to save the information.
|
|
*/
|
|
|
|
strncpy(szExpression, pszExpression, sizeof(szExpression));
|
|
|
|
// REVIEW: ultimately, we should use the Mail API to do this.
|
|
|
|
if (!GetVolumeInformation("c:\\", szName, sizeof(szName),
|
|
NULL, NULL, NULL, NULL, 0)) {
|
|
strcpy(szName, "winhelp");
|
|
}
|
|
else {
|
|
szName[8] = '\0';
|
|
CharLower(szName);
|
|
strcat(szName, ".err");
|
|
strcpy(szErrorFile, "\\\\pike\\bugs\\");
|
|
strcat(szErrorFile, szName);
|
|
}
|
|
|
|
of.cBytes = sizeof(OFSTRUCT);
|
|
hf = OpenFile(szErrorFile, &of, OF_CREATE | OF_WRITE);
|
|
if (hf == HFILE_ERROR) {
|
|
|
|
// couldn't find \\pike, so copy it to their C drive.
|
|
|
|
strcpy(szErrorFile, "c:\\");
|
|
strcat(szErrorFile, szName);
|
|
hf = OpenFile(szErrorFile, &of, OF_CREATE | OF_WRITE);
|
|
}
|
|
|
|
fInErrorRoutine = TRUE;
|
|
|
|
if (hf >= 0) {
|
|
|
|
GetStringResource2(IDS_VERSION, szBuf);
|
|
wsprintf(szBuf + strlen(szBuf),
|
|
"\n%s(%u) : Assertion failure: %s\n",
|
|
pszFile, line, szExpression);
|
|
_lwrite(hf, szBuf, strlen(szBuf));
|
|
_lclose(hf);
|
|
|
|
wsprintf(szBuf,
|
|
"An internal error has occurred. An error file has been copied to %s.\r\n\r\n%s",
|
|
szErrorFile, szExpression);
|
|
answer = MessageBox((hwndAnimate ? hwndAnimate : ahwnd[iCurWindow].hwndParent),
|
|
szBuf,
|
|
"Only press Retry if using a Debugger",
|
|
MB_ABORTRETRYIGNORE | MB_TASKMODAL);
|
|
}
|
|
else {
|
|
answer = MessageBox((hwndAnimate ? hwndAnimate : ahwnd[iCurWindow].hwndParent),
|
|
GetStringResource(wERRS_INTERNAL_ERROR),
|
|
"Only press Retry if using a Debugger",
|
|
MB_ABORTRETRYIGNORE | MB_TASKMODAL);
|
|
}
|
|
|
|
fInErrorRoutine = FALSE;
|
|
|
|
if (answer == IDRETRY) {
|
|
DebugBreak();
|
|
return;
|
|
}
|
|
else if (answer == IDIGNORE)
|
|
return;
|
|
|
|
_exit(-1);
|
|
return;
|
|
}
|
|
|
|
#endif // _DEBUG
|