/*++ 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 #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; }