windows-nt/Source/XPSP1/NT/drivers/net/ms/e100bex/mp_dbg.c
2020-09-26 16:20:57 +08:00

295 lines
6.7 KiB
C

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
mp_dbg.c
Abstract:
This module contains all debug-related code.
Revision History:
Who When What
-------- -------- ----------------------------------------------
DChen 11-01-99 created
Notes:
--*/
#include "precomp.h"
#if DBG
/**
Constants
**/
#define _FILENUMBER 'GBED'
// Bytes to appear on each line of dump output.
//
#define DUMP_BytesPerLine 16
ULONG MPDebugLevel = MP_WARN;
ULONG MPAllocCount = 0; // the number of outstanding allocs
NDIS_SPIN_LOCK MPMemoryLock; // spinlock for the debug mem list
LIST_ENTRY MPMemoryList;
BOOLEAN MPInitDone = FALSE; // debug mem list init flag
NDIS_STATUS MPAuditAllocMem(
PVOID *pPointer,
UINT Size,
UINT Flags,
NDIS_PHYSICAL_ADDRESS HighestAddr,
ULONG FileNumber,
ULONG LineNumber
)
{
NDIS_STATUS Status;
PMP_ALLOCATION pAllocInfo;
if (!MPInitDone)
{
NdisAllocateSpinLock(&MPMemoryLock);
InitializeListHead(&MPMemoryList);
MPInitDone = TRUE;
}
//
// Ensure Flags is non-zero,
// otherwise NdisAllocateMemoryWithTag should be used
//
ASSERT(Flags);
Status = NdisAllocateMemory(
(PVOID *)(&pAllocInfo),
(UINT)(Size + sizeof(MP_ALLOCATION)),
Flags,
HighestAddr);
if (pAllocInfo == (PMP_ALLOCATION)NULL)
{
DBGPRINT(MP_LOUD,
("MPAuditAllocMemCore: file %d, line %d, Size %d failed!\n",
FileNumber, LineNumber, Size));
*pPointer = NULL;
}
else
{
*pPointer = (PVOID)&(pAllocInfo->UserData);
MP_MEMSET(*pPointer, Size, 0xc);
pAllocInfo->Signature = 'DOOG';
pAllocInfo->FileNumber = FileNumber;
pAllocInfo->LineNumber = LineNumber;
pAllocInfo->Size = Size;
pAllocInfo->Location = pPointer;
pAllocInfo->Flags = Flags;
NdisAcquireSpinLock(&MPMemoryLock);
InsertTailList(&MPMemoryList, &pAllocInfo->List);
MPAllocCount++;
NdisReleaseSpinLock(&MPMemoryLock);
}
DBGPRINT(MP_LOUD,
("MPAuditAllocMem: file %c%c%c%c, line %d, %d bytes, [0x"PTR_FORMAT"] <- 0x"PTR_FORMAT"\n",
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber, Size, pPointer, *pPointer));
return(Status);
}
NDIS_STATUS MPAuditAllocMemTag(
PVOID * pPointer,
UINT Size,
ULONG FileNumber,
ULONG LineNumber
)
{
NDIS_STATUS Status;
PMP_ALLOCATION pAllocInfo;
if (!MPInitDone)
{
NdisAllocateSpinLock(&MPMemoryLock);
InitializeListHead(&MPMemoryList);
MPInitDone = TRUE;
}
Status = NdisAllocateMemoryWithTag(
(PVOID *)(&pAllocInfo),
(UINT)(Size + sizeof(MP_ALLOCATION)),
NIC_TAG);
if (pAllocInfo == (PMP_ALLOCATION)NULL)
{
*pPointer = NULL;
DBGPRINT(MP_LOUD,
("MPAuditAllocMemCore: file %d, line %d, Size %d failed!\n",
FileNumber, LineNumber, Size));
}
else
{
*pPointer = (PVOID)&(pAllocInfo->UserData);
MP_MEMSET(*pPointer, Size, 0xc);
pAllocInfo->Signature = 'DOOG';
pAllocInfo->FileNumber = FileNumber;
pAllocInfo->LineNumber = LineNumber;
pAllocInfo->Size = Size;
pAllocInfo->Location = pPointer;
pAllocInfo->Flags = 0;
NdisAcquireSpinLock(&MPMemoryLock);
InsertTailList(&MPMemoryList, &pAllocInfo->List);
MPAllocCount++;
NdisReleaseSpinLock(&MPMemoryLock);
}
DBGPRINT(MP_LOUD,
("MPAuditAllocMemTag: file %c%c%c%c, line %d, %d bytes, [0x"PTR_FORMAT"] <- 0x"PTR_FORMAT"\n",
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber, Size, pPointer, *pPointer));
return(Status);
}
VOID MPAuditFreeMem(
IN PVOID Pointer,
IN UINT Size,
IN UINT Flags
)
{
PMP_ALLOCATION pAllocInfo;
pAllocInfo = CONTAINING_RECORD(Pointer, MP_ALLOCATION, UserData);
ASSERT(pAllocInfo->Signature == (ULONG)'DOOG');
ASSERT(pAllocInfo->Size == Size);
ASSERT(pAllocInfo->Flags == Flags);
NdisAcquireSpinLock(&MPMemoryLock);
pAllocInfo->Signature = (ULONG)'DEAD';
RemoveEntryList(&pAllocInfo->List);
MPAllocCount--;
NdisReleaseSpinLock(&MPMemoryLock);
NdisFreeMemory(pAllocInfo, Size + sizeof(MP_ALLOCATION), Flags);
}
VOID mpDbgPrintUnicodeString(
IN PUNICODE_STRING UnicodeString
)
{
UCHAR Buffer[256];
USHORT i;
for (i = 0; (i < UnicodeString->Length / 2) && (i < 255); i++)
{
Buffer[i] = (UCHAR)UnicodeString->Buffer[i];
}
Buffer[i] = '\0';
DbgPrint("%s", Buffer);
}
// Hex dump 'cb' bytes starting at 'p' grouping 'ulGroup' bytes together.
// For example, with 'ulGroup' of 1, 2, and 4:
//
// 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
// 0000 0000 0000 0000 0000 0000 0000 0000 |................|
// 00000000 00000000 00000000 00000000 |................|
//
// If 'fAddress' is true, the memory address dumped is prepended to each
// line.
//
VOID
Dump(
IN CHAR* p,
IN ULONG cb,
IN BOOLEAN fAddress,
IN ULONG ulGroup
)
{
INT cbLine;
while (cb)
{
cbLine = (cb < DUMP_BytesPerLine) ? cb : DUMP_BytesPerLine;
DumpLine( p, cbLine, fAddress, ulGroup );
cb -= cbLine;
p += cbLine;
}
}
VOID
DumpLine(
IN CHAR* p,
IN ULONG cb,
IN BOOLEAN fAddress,
IN ULONG ulGroup
)
{
CHAR* pszDigits = "0123456789ABCDEF";
CHAR szHex[ ((2 + 1) * DUMP_BytesPerLine) + 1 ];
CHAR* pszHex = szHex;
CHAR szAscii[ DUMP_BytesPerLine + 1 ];
CHAR* pszAscii = szAscii;
ULONG ulGrouped = 0;
if (fAddress)
{
DbgPrint( "E100: %p: ", p );
}
else
{
DbgPrint( "E100: " );
}
while (cb)
{
*pszHex++ = pszDigits[ ((UCHAR )*p) / 16 ];
*pszHex++ = pszDigits[ ((UCHAR )*p) % 16 ];
if (++ulGrouped >= ulGroup)
{
*pszHex++ = ' ';
ulGrouped = 0;
}
*pszAscii++ = (*p >= 32 && *p < 128) ? *p : '.';
++p;
--cb;
}
*pszHex = '\0';
*pszAscii = '\0';
DbgPrint(
"%-*s|%-*s|\n",
(2 * DUMP_BytesPerLine) + (DUMP_BytesPerLine / ulGroup), szHex,
DUMP_BytesPerLine, szAscii );
}
#endif // DBG