⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atmsmdbg.c

📁 驱动开发,经过测试可以直接编译后使用,编译使用DDK中的build工具
💻 C
字号:
/*++

Copyright (c) 1990-1998  Microsoft Corporation, All Rights Reserved.

Module Name:

    AtmSmDbg.c

Abstract:

    This module contains all debug-related code.
    In debug mode we use our own memory management scheme to find out memory
    leaks etc.

Author:

    Anil Francis Thomas (10/98)

Environment:

    Kernel

Revision History:

--*/


#include "precomp.h"
#pragma hdrstop

#define MODULE_ID   MODULE_DEBUG


#if DBG

// global variable holding alloc Info
ATMSMD_ALLOC_GLOBAL    AtmSmDAllocGlobal;


VOID
AtmSmInitializeAuditMem(
    )
{
    AtmSmDAllocGlobal.pAtmSmHead              = (PATMSMD_ALLOCATION)NULL;
    AtmSmDAllocGlobal.pAtmSmTail              = (PATMSMD_ALLOCATION)NULL;
    AtmSmDAllocGlobal.ulAtmSmAllocCount       = 0;
    
    NdisAllocateSpinLock(&AtmSmDAllocGlobal.AtmSmMemoryLock);

    AtmSmDAllocGlobal.ulAtmSmInitDonePattern  = INIT_DONE_PATTERN;
}


PVOID
AtmSmAuditAllocMem(
    PVOID   *ppPointer,
    ULONG   ulSize,
    ULONG   ulModuleNumber,
    ULONG   ulLineNumber
    )
{
    PUCHAR              pBuffer;
    PULONG              pulTrailer;
    PATMSMD_ALLOCATION     pAllocInfo;
    NDIS_STATUS         Status;

    if(INIT_DONE_PATTERN != AtmSmDAllocGlobal.ulAtmSmInitDonePattern){
        ASSERT(FALSE);
        AtmSmInitializeAuditMem();
    }

    Status = NdisAllocateMemoryWithTag(
                (PVOID *)&pAllocInfo,
                sizeof(ATMSMD_ALLOCATION) + ulSize + (2 * sizeof(ULONG)),
                (ULONG)MEMORY_TAG
                );

    if (Status != NDIS_STATUS_SUCCESS)
    {
        DbgErr(("AtmSmAuditAllocMem: Module 0x%X, line %d, Size %d failed!\n",
                                       ulModuleNumber, ulLineNumber, ulSize));
        pBuffer = NULL;
    }
    else
    {
        pBuffer         = (PUCHAR)(pAllocInfo + 1);
        pulTrailer      = (PULONG)(pBuffer + ulSize);

        *pulTrailer++   = TRAILER_PATTERN;
        *pulTrailer     = TRAILER_PATTERN;

        pAllocInfo->ulSignature     = (ULONG)MEMORY_TAG;
        pAllocInfo->ulModuleNumber  = ulModuleNumber;
        pAllocInfo->ulLineNumber    = ulLineNumber;
        pAllocInfo->ulSize          = ulSize;
        pAllocInfo->Location        = (UINT_PTR)ppPointer;
        pAllocInfo->Next            = (PATMSMD_ALLOCATION)NULL;

        NdisAcquireSpinLock(&AtmSmDAllocGlobal.AtmSmMemoryLock);

        pAllocInfo->Prev = AtmSmDAllocGlobal.pAtmSmTail;

        if((PATMSMD_ALLOCATION)NULL == AtmSmDAllocGlobal.pAtmSmTail)
        {
            // empty list
            AtmSmDAllocGlobal.pAtmSmHead = AtmSmDAllocGlobal.pAtmSmTail = pAllocInfo;
        }
        else
        {
            AtmSmDAllocGlobal.pAtmSmTail->Next = pAllocInfo;
        }

        AtmSmDAllocGlobal.pAtmSmTail = pAllocInfo;

        AtmSmDAllocGlobal.ulAtmSmAllocCount++;

        NdisReleaseSpinLock(&AtmSmDAllocGlobal.AtmSmMemoryLock);
    }

    DbgLoud(("AtmSmAuditAllocMem: Module %p, line %d, %d bytes, [0x%x] <- 0x%x\n",
              ulModuleNumber, ulLineNumber, ulSize, ppPointer, pBuffer));

    return ((PVOID)pBuffer);

}


VOID
AtmSmAuditFreeMem(
    PVOID   Pointer
    )
{
    PUCHAR              pBuffer = (PUCHAR)Pointer;
    PULONG              pulTrailer;
    PATMSMD_ALLOCATION     pAllocInfo;

    pAllocInfo = (PATMSMD_ALLOCATION)(pBuffer - sizeof(ATMSMD_ALLOCATION));

    if(pAllocInfo->ulSignature != MEMORY_TAG){

        DbgErr(("AtmSmAuditFreeMem: unknown buffer %p!\n", Pointer));

        DbgBreakPoint();
        return;
    }

    DbgLoud(("AtmSmAuditFreeMem: Freeing Buffer %p pAudit %p!\n", 
                                                         Pointer, pAllocInfo));

    // check the trailer
    pulTrailer  = (PULONG)(pBuffer + pAllocInfo->ulSize);

    if((*pulTrailer != TRAILER_PATTERN) ||
        (*(++pulTrailer) != TRAILER_PATTERN)){

        DbgErr(("AtmSmAuditFreeMem: Trailer over written! Alloc - %p "
                "Trailer - %p\n", pAllocInfo, pulTrailer));

        DbgBreakPoint();
        return;
    }


    NdisAcquireSpinLock(&AtmSmDAllocGlobal.AtmSmMemoryLock);

    pAllocInfo->ulSignature = (ULONG)'DEAD';
    if((PATMSMD_ALLOCATION)NULL != pAllocInfo->Prev)
    {
        pAllocInfo->Prev->Next = pAllocInfo->Next;
    }
    else
    {
        AtmSmDAllocGlobal.pAtmSmHead = pAllocInfo->Next;
    }

    if((PATMSMD_ALLOCATION)NULL != pAllocInfo->Next)
    {
        pAllocInfo->Next->Prev = pAllocInfo->Prev;
    }
    else
    {
        AtmSmDAllocGlobal.pAtmSmTail = pAllocInfo->Prev;
    }

    AtmSmDAllocGlobal.ulAtmSmAllocCount--;

    NdisReleaseSpinLock(&AtmSmDAllocGlobal.AtmSmMemoryLock);

    NdisFreeMemory(pAllocInfo, 0, 0);
}


VOID
AtmSmShutdownAuditMem(
    )
{
    if(AtmSmDAllocGlobal.ulAtmSmAllocCount)
        DbgErr(("Number of memory blocks still allocated - %u\n", 
                                        AtmSmDAllocGlobal.ulAtmSmAllocCount));

    
    NdisFreeSpinLock(&AtmSmDAllocGlobal.AtmSmMemoryLock);

    AtmSmDAllocGlobal.ulAtmSmInitDonePattern  = 'DAED';
}


VOID
PrintATMAddr(
    IN      char            *pStr,
    IN      PATM_ADDRESS    pAtmAddr
    )
/*++
Routine Description:
    Print an ATM_ADDRESS address onto the debugger.

Arguments:
    pStr       - pointer to the string to be printed together with address
    pAtmAddr   - pointer to an NSAP or E164 address

Return Value:
--*/
{
    ULONG   i,j;
    char    HexChars[] = "0123456789ABCDEF";
    ULONG   NumOfDigits;
    PUCHAR  pucAtmAddr = pAtmAddr->Address;
    UCHAR   AddrString[(ATM_ADDRESS_LENGTH*2) + 1];

    if ((NumOfDigits = pAtmAddr->NumberOfDigits) > ATM_ADDRESS_LENGTH){

        NumOfDigits = ATM_ADDRESS_LENGTH;
    }

    j = 0;
    for(i = 0; i < NumOfDigits; i++){
        AddrString[j++] = HexChars[(pucAtmAddr[i] >> 4)];
        AddrString[j++] = HexChars[(pucAtmAddr[i] &0xF)];
    }

    AddrString[j] = '\0';

    DbgPrint("%s(%s, %u): %s\n",
                    pStr,
                    (pAtmAddr->AddressType == ATM_E164) ? "E164" : "NSAP",
                    NumOfDigits,
                    AddrString);
}
#endif // DBG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -