windows-nt/Source/XPSP1/NT/net/sfm/atalk/sys/atkmem.h

373 lines
7.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
atkmem.h
Abstract:
This module contains memory allocator routines for the stack
Author:
Jameel Hyder (jameelh@microsoft.com)
Nikhil Kamkolkar (nikhilk@microsoft.com)
Revision History:
23 Feb 1993 Initial Version
Notes: Tab stop: 4
--*/
#ifndef _ATKMEM_
#define _ATKMEM_
#define DWORDSIZEBLOCK(Size) (((Size)+sizeof(ULONG)-1) & ~(sizeof(ULONG)-1))
#define ATALK_MEMORY_SIGNATURE *(PULONG)"ATKM"
#define ZEROED_MEMORY_TAG 0xF0000000
#define ATALK_TAG *(PULONG)"Atk "
//
// Definitions for the block management package
//
typedef UCHAR BLKID;
// Add a BLKID_xxx and an entry to atalkBlkSize for every block client
#define BLKID_BUFFDESC (BLKID)0
#define BLKID_AMT (BLKID)1
#define BLKID_AMT_ROUTE (BLKID)2
#define BLKID_BRE (BLKID)3
#define BLKID_BRE_ROUTE (BLKID)4
#define BLKID_ATPREQ (BLKID)5
#define BLKID_ATPRESP (BLKID)6
#define BLKID_ASPREQ (BLKID)7
#define BLKID_ARAP_SMPKT (BLKID)8
#define BLKID_ARAP_MDPKT (BLKID)9
#define BLKID_ARAP_LGPKT (BLKID)10
#define BLKID_ARAP_SNDPKT (BLKID)11
#define BLKID_ARAP_LGBUF (BLKID)12
#define BLKID_NEED_NDIS_INT BLKID_AARP // All ids above this needs Ndis Initialization
// See AtalkBPAllocBlock
#define BLKID_AARP (BLKID)13
#define BLKID_DDPSM (BLKID)14
#define BLKID_DDPLG (BLKID)15
#define BLKID_SENDBUF (BLKID)16
#define BLKID_MNP_SMSENDBUF (BLKID)17
#define BLKID_MNP_LGSENDBUF (BLKID)18
#define NUM_BLKIDS (BLKID)19
//
// if we need huge buffers, we just do an alloc ourselves (rather than using the
// above BLKID mechanism. So that we know it is something we allocated, we use
// this as the "block id". Now, make sure NUM_BLKIDS never exceeds 250!
//
#define ARAP_UNLMTD_BUFF_ID (NUM_BLKIDS+5)
// BUFFER DESCRIPTORS
// These will be used by callers into the DDP layer. They can be
// chained together. They contain either an opaque (MDL on NT) or
// a PBYTE buffer. All outside callers *must* pass in an MDL. Only
// DDP/AARP will have the right to create a buffer descriptor which
// will hold a PBYTE buffer.
//
// MODEL OF OPERATION FOR DDP:
// DDP/AARP will call the link AllocBuildLinkHeader routine. This will
// allocate the space that DDP/AARP says it needs. The link header will
// then be built from the start of the buffer. A pointer to the beginning
// and to the place where the caller can fill in their headers is returned.
// DDP/AARP will then fill in its header, make a buffer descriptor for
// this buffer, prepend to the buffer descriptor its received from its
// client, and then call the packet out routines.
#define BD_CHAR_BUFFER (USHORT)0x0001
#define BD_FREE_BUFFER (USHORT)0x0002
#define BD_SIGNATURE *((PULONG)"BDES")
#if DBG
#define VALID_BUFFDESC(pBuffDesc) \
(((pBuffDesc) != NULL) && ((pBuffDesc)->bd_Signature == BD_SIGNATURE))
#else
#define VALID_BUFFDESC(pBuffDesc) ((pBuffDesc) != NULL)
#endif
typedef struct _BUFFER_DESC
{
#if DBG
ULONG bd_Signature;
#endif
struct _BUFFER_DESC * bd_Next;
USHORT bd_Flags;
SHORT bd_Length;
union
{
PAMDL bd_OpaqueBuffer;
struct
{
// bd_FreeBuffer is the beginning of the allocated buffer.
// bd_CharBuffer is from some offset (0 or >) within it
// from where the data starts.
PBYTE bd_CharBuffer;
PBYTE bd_FreeBuffer;
};
};
} BUFFER_DESC, *PBUFFER_DESC;
#ifdef TRACK_MEMORY_USAGE
#define AtalkAllocMemory(Size) AtalkAllocMem(Size, FILENUM | __LINE__)
extern
PVOID FASTCALL
AtalkAllocMem(
IN ULONG Size,
IN ULONG FileLine
);
extern
VOID
AtalkTrackMemoryUsage(
IN PVOID pMem,
IN ULONG Size,
IN BOOLEAN Alloc,
IN ULONG FileLine
);
#else
#define AtalkAllocMemory(Size) AtalkAllocMem(Size)
#define AtalkTrackMemoryUsage(pMem, Size, Alloc, FileLine)
extern
PVOID FASTCALL
AtalkAllocMem(
IN ULONG Size
);
#endif // TRACK_MEMORY_USAGE
#ifdef TRACK_BUFFDESC_USAGE
#define AtalkAllocBuffDesc(Ptr, Length, Flags) \
AtalkAllocBufferDesc(Ptr, Length, Flags, FILENUM | __LINE__)
#define AtalkDescribeBuffDesc(DataPtr, FreePtr, Length, Flags) \
AtalkDescribeBufferDesc(DataPtr, FreePtr, Length, Flags, FILENUM | __LINE__)
extern
VOID
AtalkTrackBuffDescUsage(
IN PVOID pBuffDesc,
IN BOOLEAN Alloc,
IN ULONG FileLine
);
extern
PBUFFER_DESC
AtalkAllocBufferDesc(
IN PVOID Ptr, // Either a PAMDL or a PBYTE
IN USHORT Length,
IN USHORT Flags,
IN ULONG FileLine
);
extern
PBUFFER_DESC
AtalkDescribeBufferDesc(
IN PVOID DataPtr,
IN PVOID FreePtr,
IN USHORT Length,
IN USHORT Flags,
IN ULONG FileLine
);
#else
#define AtalkAllocBuffDesc(Ptr, Length, Flags) \
AtalkAllocBufferDesc(Ptr, Length, Flags)
#define AtalkDescribeBuffDesc(DataPtr, FreePtr, Length, Flags) \
AtalkDescribeBufferDesc(DataPtr, FreePtr, Length, Flags)
#define AtalkTrackBuffDescUsage(pBuffDesc, Alloc, FileLine)
extern
PBUFFER_DESC
AtalkAllocBufferDesc(
IN PVOID Ptr, // Either a PAMDL or a PBYTE
IN USHORT Length,
IN USHORT Flags
);
extern
PBUFFER_DESC
AtalkDescribeBufferDesc(
IN PVOID DataPtr,
IN PVOID FreePtr,
IN USHORT Length,
IN USHORT Flags
);
#endif // TRACK_BUFFDESC_USAGE
#define AtalkAllocZeroedMemory(Size) AtalkAllocMemory((Size) | ZEROED_MEMORY_TAG)
extern
VOID FASTCALL
AtalkFreeMemory(
IN PVOID pBuffer
);
extern
VOID FASTCALL
AtalkFreeBuffDesc(
IN PBUFFER_DESC pBuffDesc
);
extern
VOID
AtalkCopyBuffDescToBuffer(
IN PBUFFER_DESC pBuffDesc,
IN LONG SrcOff,
IN LONG BytesToCopy,
IN PBYTE DstBuf
);
extern
VOID
AtalkCopyBufferToBuffDesc(
IN PBYTE SrcBuf,
IN LONG BytesToCopy,
IN PBUFFER_DESC pBuffDesc,
IN LONG DstOff
);
extern
LONG FASTCALL
AtalkSizeBuffDesc(
IN PBUFFER_DESC pBuffDesc
);
extern
VOID
AtalkInitMemorySystem(
VOID
);
extern
VOID
AtalkDeInitMemorySystem(
VOID
);
// Macros
#define GET_MDL_FROM_OPAQUE(x) ((PMDL)x)
#define AtalkPrependBuffDesc(pNode, pList) \
pNode->bd_Next = pList;
#define AtalkAppendBuffDesc(pNode, pList) \
{ \
PBUFFER_DESC _L = pList; \
\
if (_L == NULL) \
{ \
pNode->bd_Next = NULL; \
} \
else \
{ \
while (_L->bd_Next != NULL) \
_L = _L->bd_Next; \
\
_L->bd_Next = pNode; \
pNode->bd_Next = NULL; \
} \
}
#define AtalkSizeOfBuffDescData(pBuf, pLen) \
{ \
PBUFFER_DESC _B = (pBuf); \
USHORT _L = 0; \
\
while (_B) \
{ \
_L += _B->bd_Length; \
_B = _B->bd_Next; \
} \
*(pLen) = _L; \
}
#define AtalkSetSizeOfBuffDescData(pBuf, Len) ((pBuf)->bd_Length = (Len))
extern
PAMDL
AtalkAllocAMdl(
IN PBYTE pBuffer OPTIONAL,
IN LONG Size
);
extern
PAMDL
AtalkSubsetAmdl(
IN PAMDL pStartingMdl,
IN ULONG TotalOffset,
IN ULONG DesiredLength);
#define AtalkGetAddressFromMdl(pAMdl) MmGetSystemAddressForMdl(pAMdl)
#define AtalkGetAddressFromMdlSafe(pAMdl, PagePriority) MmGetSystemAddressForMdlSafe(pAMdl, PagePriority)
#ifdef PROFILING
#define AtalkFreeAMdl(pAmdl) \
{ \
PAMDL _N; \
PAMDL _L = pAmdl; \
while (_L != NULL) \
{ \
_N = _L->Next; \
ExInterlockedDecrementLong( \
&AtalkStatistics.stat_CurMdlCount,\
&AtalkKeStatsLock); \
IoFreeMdl(_L); \
ATALK_DBG_DEC_COUNT(AtalkDbgMdlsAlloced); \
_L = _N; \
} \
}
#else
#define AtalkFreeAMdl(pAmdl) \
{ \
PAMDL _N; \
PAMDL _L = pAmdl; \
while (_L != NULL) \
{ \
_N = _L->Next; \
IoFreeMdl(_L); \
ATALK_DBG_DEC_COUNT(AtalkDbgMdlsAlloced); \
_L = _N; \
} \
}
#endif
#define AtalkIsMdlFragmented(pMdl) ((pMdl)->Next != NULL)
extern
LONG FASTCALL
AtalkSizeMdlChain(
IN PAMDL pAMdlChain
);
PVOID FASTCALL
AtalkBPAllocBlock(
IN BLKID BlockId
);
VOID FASTCALL
AtalkBPFreeBlock(
IN PVOID pBlock
);
#endif // _ATKMEM_