windows-nt/Source/XPSP1/NT/net/tapi/rca/rcadebug.c
2020-09-26 16:20:57 +08:00

308 lines
6.8 KiB
C

/*++
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
rcadebug.c
Abstract:
This module contains all debug-related code.
Revision History:
Who When What
-------- -------- ----------------------------------------------
rmachin 2-18-97 stolen from ArvindM's cmadebug file
JameelH 4-18-98 Cleanup
Notes:
--*/
#include <precomp.h>
#define MODULE_NUMBER MODULE_DEBUG
#define _FILENUMBER 'BDCR'
INT RCADebugLevel= RCA_ERROR;
ULONG PXDebugMicos = 0xFF;
#ifdef PERF
LARGE_INTEGER PerfTimeConnRequest;
LARGE_INTEGER PerfTimeSetupSent;
LARGE_INTEGER PerfTimeConnectReceived;
LARGE_INTEGER PerfTimeConnConfirm;
LARGE_INTEGER PerfTimeSetupReceived;
LARGE_INTEGER PerfTimeConnIndication;
LARGE_INTEGER PerfTimeConnResponse;
LARGE_INTEGER PerfTimeConnectSent;
LARGE_INTEGER PerfTimeFrequency;
#endif // PERF
#if DBG
#undef AUDIT_MEM
#define AUDIT_MEM 1
#endif
//
// For debugging only: set this to 0x1 for to enable hardcoded data format, 0x0 otherwise.
//
ULONG g_ulHardcodeDataFormat = 0x0;
//
// For debugging only: set this to some positive value to indicate the buffer size to
// advertise in our AllocatorFraming property handler, and the amount of data to copy
// in the WriteStream handler. If set to zero, this will be ignored.
//
ULONG g_ulBufferSize = 0x0;
#if AUDIT_MEM
PVOID DebugVar1 = (PVOID)NULL;
PRCA_ALLOCATION RCAdMemoryHead = (PRCA_ALLOCATION)NULL;
PVOID DebugVar2 = (PVOID)NULL;
PRCA_ALLOCATION RCAdMemoryTail = (PRCA_ALLOCATION)NULL;
PVOID DebugVar3 = (PVOID)NULL;
ULONG RCAdAllocCount = 0; // how many allocated so far (unfreed)
PVOID DebugVar4 = (PVOID)NULL;
NDIS_SPIN_LOCK RCAdMemoryLock;
BOOLEAN RCAdInitDone = FALSE;
PVOID
RCAAuditAllocMem(
PVOID pPointer,
ULONG Size,
ULONG FileNumber,
ULONG LineNumber
)
{
PVOID pBuffer;
PRCA_ALLOCATION pAllocInfo = NULL;
RCADEBUGP(RCA_VERY_LOUD+50, ("RCAAuditAllocMem(): Enter with size == %lu\n", Size));
if (!RCAdInitDone)
{
RCAInitLock(&RCAdMemoryLock);
DebugVar1 = (PVOID)(UINT_PTR)0x01010101;
DebugVar2 = (PVOID)(UINT_PTR)0xabababab;
DebugVar3 = (PVOID)(UINT_PTR)0xcdcdcdcd;
DebugVar4 = (PVOID)(UINT_PTR)0xefefefef;
RCAdInitDone = TRUE;
}
//pAllocInfo = (PRCA_ALLOCATION)CTEAllocMem(Size+sizeof(RCA_ALLOCATION));
NdisAllocateMemoryWithTag((PVOID *)(&pAllocInfo),
(UINT)(Size + sizeof(RCA_ALLOCATION)),
RCA_TAG);
if (pAllocInfo == (PRCA_ALLOCATION)NULL)
{
RCADEBUGP(RCA_VERY_LOUD+50,
("RCAAuditAllocMem: file %d, line %d, Size %d failed!\n",
FileNumber, LineNumber, Size));
pBuffer = NULL;
}
else
{
pBuffer = (PVOID)&(pAllocInfo->UserData);
RCAMemSet(pBuffer, 0xc, Size);
pAllocInfo->Signature = RCA_MEMORY_SIGNATURE;
pAllocInfo->FileNumber = FileNumber;
pAllocInfo->LineNumber = LineNumber;
pAllocInfo->Size = Size;
pAllocInfo->Location = (ULONG_PTR)pPointer;
pAllocInfo->Next = (PRCA_ALLOCATION)NULL;
RCAAcquireLock(&RCAdMemoryLock);
pAllocInfo->Prev = RCAdMemoryTail;
if (RCAdMemoryTail == (PRCA_ALLOCATION)NULL)
{
// empty list
RCAdMemoryHead = RCAdMemoryTail = pAllocInfo;
}
else
{
RCAdMemoryTail->Next = pAllocInfo;
}
RCAdMemoryTail = pAllocInfo;
RCAdAllocCount++;
RCAReleaseLock(&RCAdMemoryLock);
}
RCADEBUGP(RCA_VERY_LOUD+100,
("RCAAuditAllocMem: file %c%c%c%c, line %d, %d bytes, [0x%x] <- 0x%x\n",
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber, Size, pPointer, pBuffer));
return (pBuffer);
}
VOID
RCAAuditFreeMem(
PVOID Pointer
)
{
PRCA_ALLOCATION pAllocInfo;
pAllocInfo = STRUCT_OF(RCA_ALLOCATION, Pointer, UserData);
if (pAllocInfo->Signature != RCA_MEMORY_SIGNATURE)
{
RCADEBUGP(RCA_ERROR,
("RCAAuditFreeMem: unknown buffer 0x%x!\n", Pointer));
DbgBreakPoint();
return;
}
RCAAcquireLock(&RCAdMemoryLock);
pAllocInfo->Signature = (ULONG)'DEAD';
if (pAllocInfo->Prev != (PRCA_ALLOCATION)NULL)
{
pAllocInfo->Prev->Next = pAllocInfo->Next;
}
else
{
RCAdMemoryHead = pAllocInfo->Next;
}
if (pAllocInfo->Next != (PRCA_ALLOCATION)NULL)
{
pAllocInfo->Next->Prev = pAllocInfo->Prev;
}
else
{
RCAdMemoryTail = pAllocInfo->Prev;
}
RCAdAllocCount--;
RCAReleaseLock(&RCAdMemoryLock);
NdisFreeMemory(pAllocInfo, 0, 0);
}
#endif // AUDIT_MEM
VOID
RCADumpGUID(
INT DebugLevel,
GUID *Guid
)
/*++
Routine Description:
This routine prints a GUID in human-readable form.
Arguments:
DebugLevel - The debug level that should be set before
the print becomes visible
Guid - The GUID structure to print
Return Value:
(None)
--*/
{
if (DebugLevel <= RCADebugLevel) {
DbgPrint("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
Guid->Data1, Guid->Data2,
Guid->Data3, Guid->Data4[0],
Guid->Data4[1], Guid->Data4[2],
Guid->Data4[3], Guid->Data4[4],
Guid->Data4[5], Guid->Data4[6],
Guid->Data4[7]);
};
}
NTSTATUS
RCADumpKsPropertyInfo(
INT DebugLevel,
PIRP pIrp
)
/*++
Routine Description:
This routine prints the property information in stored in an
IOCTL_KS_PROPERTY Irp. This helps to identify which property
is being set/queried by means of the irp.
Arguments:
DebugLevel - The debug level that should be set before
the print becomes visible
pIrp - The IOCTL_KS_PROPERTY Irp
Return Value:
STATUS_SUCCESS if all goes well, or an appropriate error code
otherwise.
--*/
{
PIO_STACK_LOCATION pIrpStack;
ULONG ulInputBufferLength;
NTSTATUS Status = STATUS_SUCCESS;
PKSPROPERTY pProperty;
RCADEBUGP(DebugLevel, ("RCADumpKsPropertyInfo - Enter\n"));
pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
ulInputBufferLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
do {
if (ulInputBufferLength < sizeof(KSPROPERTY)) {
RCADEBUGP(DebugLevel, ("RCADumpKsPropertyInfo: Irp's input buffer is too small\n"));
Status = STATUS_INVALID_BUFFER_SIZE;
break;
}
try {
//
// Validate the pointers if the client is not trusted.
//
if (pIrp->RequestorMode != KernelMode) {
ProbeForRead(pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer,
ulInputBufferLength,
sizeof(BYTE));
}
pProperty = (PKSPROPERTY)pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
RCADEBUGP(DebugLevel, ("RCADumpKsPropertyInfo: Property Set == "));
RCADumpGUID(DebugLevel, &pProperty->Set);
RCADEBUGP(DebugLevel, ("\nRcaDumpKsPropertyInfo: Property Id == %lu\n", pProperty->Id));
RCADEBUGP(DebugLevel, ("RCADumpKsPropertyInfo: Property Flags == 0x%x\n", pProperty->Flags));
} except (EXCEPTION_EXECUTE_HANDLER) {
Status = GetExceptionCode();
break;
}
} while (FALSE);
RCADEBUGP(DebugLevel, ("RCADumpKsPropertyInfo - Exit, Returing Status == 0x%x\n",
Status));
return Status;
}