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.
182 lines
4.7 KiB
182 lines
4.7 KiB
#include "all.h"
|
|
#pragma hdrstop
|
|
#include "dbg.h"
|
|
|
|
|
|
#ifdef DEBUG
|
|
#pragma message("informational warning: DEBUG build")
|
|
|
|
/* Global variables that hold the debug masks */
|
|
UINT DbgActnMask = DEF_DBG_MASK;
|
|
UINT AppZoneMask = DEF_APP_MASK; /* want at least 32 bits */
|
|
TCHAR const szModuleName[] = {"NTIE20: "}; /* leader for all debug output */
|
|
TCHAR const szEmpty[] = {""}; /* used as a dummy */
|
|
TCHAR const cszLogFileName[] = {"ntie20.log"}; /* filename of logfile to write debug output to */
|
|
TCHAR const cszCRLF[] = {"\r\n"};
|
|
|
|
/* internal private function prototype */
|
|
BOOL WINAPI DBGLogOutputDebugString(LPCTSTR pcsz);
|
|
|
|
/* _FormatMessage uses a static buffer to put the message into */
|
|
#define MAX_DEBUG_MESSAGE_SIZE 64*1024 /* arbitrary */
|
|
//#ifndef MAX_PATH
|
|
//#define MAX_PATH 260
|
|
//#endif
|
|
|
|
UINT WINAPI DBGSetDebugMask(UINT mask)
|
|
{
|
|
UINT wOld = AppZoneMask;
|
|
AppZoneMask = mask;
|
|
return wOld;
|
|
}
|
|
|
|
UINT WINAPI DBGSetDebugInternalMask(UINT mask)
|
|
{
|
|
UINT wOld = DbgActnMask;
|
|
DbgActnMask = mask;
|
|
return wOld;
|
|
}
|
|
|
|
UINT WINAPI DBGGetDebugMask()
|
|
{
|
|
return AppZoneMask;
|
|
}
|
|
|
|
UINT WINAPI DBGGetDebugInternalMask()
|
|
{
|
|
return DbgActnMask;
|
|
}
|
|
|
|
void WINAPI DBGAssertFailed(LPCTSTR pszFile, int line, LPCTSTR pszExpr, LPCTSTR pszMsg)
|
|
{
|
|
LPCTSTR psz;
|
|
TCHAR ach[256];
|
|
static TCHAR const szAssertFailed[] = TEXT("NTIE20: assert %s failed in %s, line %d: %s\r\n");
|
|
|
|
// Strip off path info from filename string, if present.
|
|
//
|
|
if (DbgActnMask & DM_ASSERT) // macro just checks if the assert failed
|
|
{
|
|
for (psz = pszFile + lstrlen(pszFile); psz != pszFile; psz=CharPrev(pszFile, psz))
|
|
{
|
|
if ((CharPrev(pszFile, psz)!= (psz-2)) && *(psz - 1) == TEXT('\\'))
|
|
break;
|
|
}
|
|
if (!pszMsg) pszMsg = szEmpty;
|
|
wsprintf(ach, szAssertFailed, pszExpr, psz, line, pszMsg);
|
|
OutputDebugString (szModuleName);
|
|
OutputDebugString (ach);
|
|
if (DbgActnMask & DM_LOG)
|
|
{
|
|
DBGLogOutputDebugString (szModuleName);
|
|
DBGLogOutputDebugString (ach);
|
|
}
|
|
}
|
|
if (DbgActnMask & DM_ASSERTTRAP)
|
|
DEBUG_BREAK
|
|
}
|
|
|
|
|
|
void __cdecl DBGDebugMsg(LPCTSTR pszMsg, ...)
|
|
{
|
|
TCHAR ach[5*MAX_PATH+40]; // Handles 5*largest path + slop for message
|
|
UINT ul = 0;
|
|
|
|
#ifdef WINNT
|
|
va_list ArgList;
|
|
|
|
va_start(ArgList, pszMsg);
|
|
try {
|
|
ul = wvsprintf(ach, pszMsg, ArgList);
|
|
} except (EXCEPTION_EXECUTE_HANDLER) {
|
|
OutputDebugString(TEXT("NTIE20: DebugMsg exception: "));
|
|
OutputDebugString(pszMsg);
|
|
if (DbgActnMask & DM_LOG)
|
|
{
|
|
DBGLogOutputDebugString (szModuleName);
|
|
DBGLogOutputDebugString (ach);
|
|
}
|
|
}
|
|
va_end(ArgList);
|
|
#else
|
|
ul = wvsprintf(ach, pszMsg, (LPVOID)(&pszMsg + 1));
|
|
#endif
|
|
if (!ul || ul && ach[ul-1] != '\n') /* append CRLF if appears there isnt one */
|
|
lstrcat(ach, cszCRLF);
|
|
OutputDebugString(szModuleName);
|
|
OutputDebugString(ach);
|
|
if (DbgActnMask & DM_LOG)
|
|
{
|
|
DBGLogOutputDebugString (szModuleName);
|
|
DBGLogOutputDebugString (ach);
|
|
}
|
|
}
|
|
|
|
/* DBGFormatMessage
|
|
* AssertMsg macro/function need to format and get
|
|
* at the args as well as the line and file info
|
|
*
|
|
* Arguments: series of args form of (argv, ...) as for printf
|
|
*
|
|
* Return: Pointer to buffer with string neatly formated via wvsprintf
|
|
*
|
|
* Comments: This is a static buffer that is reused, this is
|
|
* ugly, but necessary.
|
|
*/
|
|
LPCTSTR __cdecl DBGFormatMessage(LPCTSTR pszMsg, ...)
|
|
{
|
|
static unsigned char ach[MAX_DEBUG_MESSAGE_SIZE];
|
|
va_list ArgList;
|
|
|
|
va_start(ArgList, pszMsg);
|
|
wvsprintf(ach, pszMsg, ArgList);
|
|
va_end(ArgList);
|
|
return (ach);
|
|
}
|
|
|
|
/*
|
|
** DBGLogOutputDebugString()
|
|
** Write the contents of pcsz to the logfile.
|
|
**
|
|
** Arguments: null terminated buffer with string to write
|
|
**
|
|
** Returns: True | False
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
BOOL WINAPI DBGLogOutputDebugString(LPCTSTR pcsz)
|
|
{
|
|
BOOL bResult = FALSE;
|
|
UINT ucb;
|
|
TCHAR szLogFile[MAX_PATH_LEN];
|
|
|
|
ucb = GetWindowsDirectory(szLogFile, sizeof (szLogFile));
|
|
|
|
if (ucb > 0 && ucb < sizeof (szLogFile))
|
|
{
|
|
HANDLE hfLog;
|
|
|
|
lstrcat (szLogFile, "\\");
|
|
lstrcat (szLogFile, cszLogFileName);
|
|
|
|
hfLog = CreateFile(szLogFile, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
|
|
FILE_FLAG_WRITE_THROUGH, NULL);
|
|
|
|
if (hfLog != INVALID_HANDLE_VALUE)
|
|
{
|
|
if (SetFilePointer(hfLog, 0, NULL, FILE_END) != INVALID_FILE_SIZE)
|
|
{
|
|
DWORD dwcbWritten;
|
|
|
|
bResult = WriteFile(hfLog, pcsz, lstrlen(pcsz), &dwcbWritten, NULL);
|
|
|
|
if (! CloseHandle(hfLog) && bResult)
|
|
bResult = FALSE;
|
|
}
|
|
}
|
|
}
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
#endif // DEBUG
|