2025-04-27 07:49:33 -04:00

261 lines
5.7 KiB
C

/*****************************************************************************/
/** Microsoft LAN Manager **/
/** Copyright (C) Microsoft Corp., 1992 **/
/*****************************************************************************/
//
// *** Main For Supervisor Debug ***
//
#include <windows.h>
#include <ctype.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include "sdebug.h"
#if DBG
VOID AaAssert(
IN PVOID FailedAssertion,
IN PVOID FileName,
IN DWORD LineNumber
)
{
BOOL ok;
BYTE choice[16];
DWORD bytes;
DWORD error;
AaPrintf( "\nAssertion failed: %s\n at line %ld of %s\n",
FailedAssertion, LineNumber, FileName );
do {
AaPrintf( "Break or Ignore [bi]? " );
bytes = sizeof(choice);
ok = ReadFile(
GetStdHandle(STD_INPUT_HANDLE),
&choice,
bytes,
&bytes,
NULL
);
if ( ok ) {
if ( toupper(choice[0]) == 'I' ) {
break;
}
if ( toupper(choice[0]) == 'B' ) {
DbgUserBreakPoint( );
}
} else {
error = GetLastError( );
}
} while ( TRUE );
return;
} // AaAssert
#endif
#if DBG
static BOOL first = TRUE;
DWORD g_dbgaction = 0L;
VOID AaGetDebugConsole(VOID)
{
if ((g_dbgaction==1) && first)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
COORD coord;
first = FALSE;
g_dbgaction = 0;
AllocConsole( );
GetConsoleScreenBufferInfo( GetStdHandle(STD_OUTPUT_HANDLE), &csbi );
coord.X = (SHORT)(csbi.srWindow.Right - csbi.srWindow.Left + 1);
coord.Y = (SHORT)((csbi.srWindow.Bottom - csbi.srWindow.Top + 1) * 20);
SetConsoleScreenBufferSize( GetStdHandle(STD_OUTPUT_HANDLE), coord );
}
}
#endif
#if DBG
VOID AaPrintf(
char *Format,
...
)
{
va_list arglist;
char OutputBuffer[1024];
DWORD length;
va_start( arglist, Format );
vsprintf( OutputBuffer, Format, arglist );
va_end( arglist );
length = strlen( OutputBuffer );
WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), (LPVOID )OutputBuffer, length, &length, NULL );
} // AaPrintf
#endif
#if DBG
DWORD g_level;
#undef GlobalAlloc
#undef GlobalLock
#undef GlobalReAlloc
#undef GlobalFree
#undef GlobalUnlock
// Get a dword from on-the-wire format to the host format
#define GETULONG(DstPtr, SrcPtr) \
*(unsigned long *)(DstPtr) = \
((*((unsigned char *)(SrcPtr)+3) << 24) +\
(*((unsigned char *)(SrcPtr)+2) << 16) + \
(*((unsigned char *)(SrcPtr)+1) << 8) + \
(*((unsigned char *)(SrcPtr)+0)))
// Put a ulong from the host format to on-the-wire format
#define PUTULONG(DstPtr, Src) \
*((unsigned char *)(DstPtr)+3)=(unsigned char)((unsigned long)(Src) >> 24),\
*((unsigned char *)(DstPtr)+2)=(unsigned char)((unsigned long)(Src) >> 16),\
*((unsigned char *)(DstPtr)+1)=(unsigned char)((unsigned long)(Src) >> 8),\
*((unsigned char *)(DstPtr)+0)=(unsigned char)(Src)
HGLOBAL DEBUG_MEM_ALLOC(UINT allocflags, DWORD numbytes)
{
HGLOBAL retval;
PBYTE pb;
retval = GlobalAlloc(allocflags, numbytes + 3 * sizeof(DWORD));
if ((retval) && !(allocflags & GMEM_MOVEABLE))
{
pb = (PBYTE) retval;
PUTULONG(pb, BEG_SIGNATURE_DWORD);
pb += sizeof(DWORD);
PUTULONG(pb, numbytes);
pb += sizeof(DWORD);
IF_DEBUG(MEMORY_TRACE)
SS_PRINT(("**ALLOC MEM %li (%li) BYTES BEGINNING AT %lx (%lx)\n",
numbytes, numbytes + 3 * sizeof(DWORD), pb, retval));
retval = (HGLOBAL) pb;
pb += numbytes;
PUTULONG(pb, END_SIGNATURE_DWORD);
}
return (retval);
}
LPVOID DEBUG_MEM_LOCK(HGLOBAL hglbl)
{
PBYTE pb;
pb = GlobalLock(hglbl);
if (pb)
{
DWORD numbytes = (DWORD)(GlobalSize(hglbl) - 3 * sizeof(DWORD));
PBYTE pEnd;
PUTULONG(pb, BEG_SIGNATURE_DWORD);
pb += sizeof(DWORD);
PUTULONG(pb, numbytes);
pb += sizeof(DWORD);
IF_DEBUG(MEMORY_TRACE)
SS_PRINT(("**LOCKED MEM %li (%li) BYTES BEGINNING AT %lx (%lx)\n",
numbytes, numbytes + 3 * sizeof(DWORD), pb, pb-2*sizeof(DWORD)));
pEnd = pb + numbytes;
PUTULONG(pEnd, END_SIGNATURE_DWORD);
}
return (pb);
}
HGLOBAL DEBUG_MEM_REALLOC(HGLOBAL hmem, DWORD numbytes, UINT flags)
{
IF_DEBUG(MEMORY_TRACE)
SS_PRINT(("**REALLOCING HGLOBAL %lx\n", hmem));
hmem = GlobalReAlloc(hmem, numbytes + 3 * sizeof(DWORD), flags);
return (hmem);
}
HGLOBAL DEBUG_MEM_FREE(HGLOBAL hmem)
{
HGLOBAL hglbl;
DWORD Signature;
DWORD numbytes;
PBYTE pb;
pb = (PBYTE) hmem;
pb -= 2 * sizeof(DWORD);
hglbl = (HGLOBAL) pb;
GETULONG(&Signature, pb);
SS_ASSERT(Signature == BEG_SIGNATURE_DWORD);
pb += sizeof(DWORD);
GETULONG(&numbytes, pb);
pb += sizeof(DWORD);
pb += numbytes;
GETULONG(&Signature, pb);
SS_ASSERT(Signature == END_SIGNATURE_DWORD);
IF_DEBUG(MEMORY_TRACE)
SS_PRINT(("**FREED MEM %li (%li) BYTES BEGINNING AT %lx (%lx)\n",
numbytes, numbytes + 3 * sizeof(DWORD), hmem, hglbl));
return (GlobalFree(hglbl));
}
HGLOBAL DEBUG_MEM_UNLOCK(HGLOBAL hmem)
{
IF_DEBUG(MEMORY_TRACE)
SS_PRINT(("**UNLOCKED HGLOBAL %lx\n", hmem));
return (HGLOBAL)(ULONG_PTR) (GlobalUnlock(hmem));
}
#endif