windows-nt/Source/XPSP1/NT/net/rras/ndis/raspptp/common/debug.c

270 lines
6.4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*****************************************************************************
*
* Copyright (c) 1998-1999 Microsoft Corporation
*
* DEBUG.C - debugging functions, etc.
*
* Author: Stan Adermann (stana)
*
* Created: 9/2/1998
*
*****************************************************************************/
#include "raspptp.h"
#if DBG
PPPTP_ADAPTER gAdapter;
#endif
#if MEM_CHECKING
typedef struct MEM_HDR {
LIST_ENTRY ListEntry;
ULONG Size;
CHAR File[16];
ULONG Line;
} MEM_HDR;
LIST_ENTRY leAlloc;
NDIS_SPIN_LOCK slAlloc;
VOID InitMemory()
{
NdisAllocateSpinLock(&slAlloc);
NdisInitializeListHead(&leAlloc);
}
VOID DeinitMemory()
{
PLIST_ENTRY ListEntry;
NdisAcquireSpinLock(&slAlloc);
for (ListEntry=leAlloc.Flink;
ListEntry!=&leAlloc;
ListEntry = ListEntry->Flink)
{
MEM_HDR *Hdr = (MEM_HDR*)ListEntry;
DEBUGMSG(DBG_ERROR, (DTEXT("PPTP Unfreed Memory:0x%08X size:%X <%s:%d>\n"),
&Hdr[1], Hdr->Size, Hdr->File, Hdr->Line));
}
NdisReleaseSpinLock(&slAlloc);
NdisFreeSpinLock(&slAlloc);
}
#endif
#if MEM_CHECKING
PVOID
_MyMemAlloc(UINT size, ULONG tag, PUCHAR file, UINT line)
#else
PVOID
MyMemAlloc(UINT size, ULONG tag)
#endif
{
PVOID memptr;
NDIS_STATUS status;
#if MEM_CHECKING
status = NdisAllocateMemoryWithTag(&memptr, size+sizeof(MEM_HDR), tag);
#else
status = NdisAllocateMemoryWithTag(&memptr, size, tag);
#endif
if (status != NDIS_STATUS_SUCCESS)
{
DEBUGMSG(DBG_ERROR, (DTEXT("Memory allocation failed <%s:%d>.\n"),
file, line));
memptr = NULL;
}
#if MEM_CHECKING
else
{
MEM_HDR *Hdr = memptr;
UINT FileNameLen = strlen(file);
Hdr->Size = size;
Hdr->Line = line;
if (FileNameLen>sizeof(Hdr->File)-1)
strcpy(Hdr->File, &file[FileNameLen-sizeof(Hdr->File)+1]);
else
strcpy(Hdr->File, file);
MyInterlockedInsertHeadList(&leAlloc, &Hdr->ListEntry, &slAlloc);
memptr = &Hdr[1];
}
#endif
return memptr;
}
VOID
MyMemFree(
PVOID memptr,
UINT size
)
{
#if MEM_CHECKING
PLIST_ENTRY ListEntry;
MEM_HDR *Hdr = (MEM_HDR*)((PUCHAR)memptr-sizeof(MEM_HDR));
NdisAcquireSpinLock(&slAlloc);
for (ListEntry = leAlloc.Flink;
ListEntry != &leAlloc;
ListEntry = ListEntry->Flink)
{
if (ListEntry==&Hdr->ListEntry)
{
RemoveEntryList(&Hdr->ListEntry);
break;
}
}
if (ListEntry==&leAlloc)
{
DEBUGMSG(DBG_ERROR, (DTEXT("PPTP: Freeing memory not owned %x\n"), memptr));
}
NdisReleaseSpinLock(&slAlloc);
NdisFreeMemory(Hdr, size+sizeof(MEM_HDR), 0);
#else
NdisFreeMemory(memptr, size, 0);
#endif
}
#if LIST_CHECKING
VOID FASTCALL CheckList(PLIST_ENTRY ListHead)
{
PLIST_ENTRY ListEntry, PrevListEntry;
if (ListHead->Flink==ListHead)
{
if (ListHead->Blink!=ListHead)
{
DEBUGMSG(DBG_ERROR|DBG_BREAK,(DTEXT("PPTP: Corrupt list head:%x Flink:%x Blink:%x\n"), ListHead, ListHead->Flink, ListHead->Blink));
}
}
else
{
ListEntry = ListHead;
do
{
PrevListEntry = ListEntry;
ListEntry = ListEntry->Flink;
if (ListEntry->Blink!=PrevListEntry)
{
DEBUGMSG(DBG_ERROR|DBG_BREAK, (DTEXT("PPTP: Corrupt LIST_ENTRY Head:%08x %08x->Flink==%08x %08x->Blink==%08x\n"),
ListHead, PrevListEntry, PrevListEntry->Flink, ListEntry, ListEntry->Blink));
}
} while (ListEntry!=ListHead);
}
}
PLIST_ENTRY FASTCALL MyInterlockedInsertHeadList(PLIST_ENTRY Head, PLIST_ENTRY Entry, PNDIS_SPIN_LOCK SpinLock)
{
PLIST_ENTRY RetVal;
NdisAcquireSpinLock(SpinLock);
if (IsListEmpty(Head))
RetVal = NULL;
else
RetVal = Head->Flink;
CheckedInsertHeadList(Head, Entry);
NdisReleaseSpinLock(SpinLock);
return RetVal;
}
PLIST_ENTRY FASTCALL MyInterlockedInsertTailList(PLIST_ENTRY Head, PLIST_ENTRY Entry, PNDIS_SPIN_LOCK SpinLock)
{
PLIST_ENTRY RetVal;
NdisAcquireSpinLock(SpinLock);
if (IsListEmpty(Head))
RetVal = NULL;
else
RetVal = Head->Blink;
CheckedInsertTailList(Head, Entry);
NdisReleaseSpinLock(SpinLock);
return RetVal;
}
PLIST_ENTRY FASTCALL MyInterlockedRemoveHeadList(PLIST_ENTRY Head, PNDIS_SPIN_LOCK SpinLock)
{
PLIST_ENTRY RetVal;
NdisAcquireSpinLock(SpinLock);
//RemoveHeadList uses RemoveEntryList, which is redefined to call CheckList in DEBUG.H
RetVal = RemoveHeadList(Head);
if (RetVal==Head)
RetVal = NULL;
else
RetVal->Flink = RetVal->Blink = NULL;
NdisReleaseSpinLock(SpinLock);
return RetVal;
}
#endif
#define CASE_RETURN_NAME(x) case x: return DTEXT(#x)
#ifdef DBG
char *ControlStateToString(ULONG State)
{
switch( State ){
CASE_RETURN_NAME(STATE_CTL_INVALID);
CASE_RETURN_NAME(STATE_CTL_LISTEN);
CASE_RETURN_NAME(STATE_CTL_DIALING);
CASE_RETURN_NAME(STATE_CTL_WAIT_REQUEST);
CASE_RETURN_NAME(STATE_CTL_WAIT_REPLY);
CASE_RETURN_NAME(STATE_CTL_ESTABLISHED);
CASE_RETURN_NAME(STATE_CTL_WAIT_STOP);
CASE_RETURN_NAME(STATE_CTL_CLEANUP);
default:
return DTEXT("UNKNOWN CONTROL STATE");
}
}
char *CallStateToString(ULONG State)
{
switch( State ){
CASE_RETURN_NAME(STATE_CALL_INVALID);
CASE_RETURN_NAME(STATE_CALL_CLOSED);
CASE_RETURN_NAME(STATE_CALL_IDLE);
CASE_RETURN_NAME(STATE_CALL_OFFHOOK);
CASE_RETURN_NAME(STATE_CALL_OFFERING);
CASE_RETURN_NAME(STATE_CALL_PAC_OFFERING);
CASE_RETURN_NAME(STATE_CALL_PAC_WAIT);
CASE_RETURN_NAME(STATE_CALL_DIALING);
CASE_RETURN_NAME(STATE_CALL_PROCEEDING);
CASE_RETURN_NAME(STATE_CALL_ESTABLISHED);
CASE_RETURN_NAME(STATE_CALL_WAIT_DISCONNECT);
CASE_RETURN_NAME(STATE_CALL_CLEANUP);
default:
return DTEXT("UNKNOWN CALL STATE");
}
}
#endif
#if LOCK_CHECKING
VOID FASTCALL
_MyAcquireSpinLock(
PMY_SPIN_LOCK pLock,
PUCHAR file,
UINT line
)
{
UINT FileNameLen = strlen(file);
NdisAcquireSpinLock((PNDIS_SPIN_LOCK)pLock);
if (FileNameLen>sizeof(pLock->File)-1)
strcpy(pLock->File, &file[FileNameLen-sizeof(pLock->File)+1]);
else
strcpy(pLock->File, file);
pLock->Line = line;
}
#endif