windows-nt/Source/XPSP1/NT/net/nwlink/spx/spxmem.h
2020-09-26 16:20:57 +08:00

145 lines
2.8 KiB
C

/*++
Copyright (c) 1989-1993 Microsoft Corporation
Module Name:
spxmem.h
Abstract:
This module contains memory management routines.
Author:
Nikhil Kamkolkar (nikhilk) 17-November-1993
Environment:
Kernel mode
Revision History:
--*/
#define QWORDSIZEBLOCK(Size) (((Size)+sizeof(LARGE_INTEGER)-1) & ~(sizeof(LARGE_INTEGER)-1))
#define SPX_MEMORY_SIGNATURE *(PULONG)"SPXM"
#define ZEROED_MEMORY_TAG 0xF0000000
#define SPX_TAG *((PULONG)"SPX ")
//
// Definitions for the block management package
//
typedef UCHAR BLKID;
// Add a BLKID_xxx and an entry to atalkBlkSize for every block client
#define BLKID_TIMERLIST (BLKID)0
#define BLKID_NDISSEND (BLKID)1
#define BLKID_NDISRECV (BLKID)2
#define NUM_BLKIDS (BLKID)3
typedef struct _BLK_CHUNK
{
struct _BLK_CHUNK * bc_Next; // Pointer to next in the link
SHORT bc_NumFrees; // Number of free blocks in the chunk
UCHAR bc_Age; // Number of invocations since the chunk free
BLKID bc_BlkId; // Id of the block
struct _BLK_HDR * bc_FreeHead; // Head of the list of free blocks
#ifndef SPX_OWN_PACKETS
PVOID bc_ChunkCtx; // Used to store pool header if not own
// packets
#else
PVOID bc_Padding; // Keep the header 16 bytes
#endif
// This is followed by an array of N blks of size M such that the block header
// is exactly spxChunkSize[i]
} BLK_CHUNK, *PBLK_CHUNK;
typedef struct _BLK_HDR
{
union
{
struct _BLK_HDR * bh_Next; // Valid when it is free
struct _BLK_CHUNK * bh_pChunk; // The parent chunk to which this blocks belong
// valid when it is allocated
};
PVOID bh_Padding; // Make the header 8 bytes
} BLK_HDR, *PBLK_HDR;
#define BC_OVERHEAD (8+8) // LARGE_INTEGER for SpxAllocMemory() header and
// POOL_HEADER for ExAllocatePool() header
#define BLOCK_POOL_TIMER 1000 // Check interval (1 sec)
#define MAX_BLOCK_POOL_AGE 3 // # of timer invocations before free
ULONG
spxBPAgePool(
IN PVOID Context,
IN BOOLEAN TimerShuttingDown);
#ifdef TRACK_MEMORY_USAGE
#define SpxAllocateMemory(Size) SpxAllocMem((Size), FILENUM | __LINE__)
extern
PVOID
SpxAllocMem(
IN ULONG Size,
IN ULONG FileLine
);
extern
VOID
SpxTrackMemoryUsage(
IN PVOID pMem,
IN BOOLEAN Alloc,
IN ULONG FileLine
);
#else
#define SpxAllocateMemory(Size) SpxAllocMem(Size)
#define SpxTrackMemoryUsage(pMem, Alloc, FileLine)
extern
PVOID
SpxAllocMem(
IN ULONG Size
);
#endif // TRACK_MEMORY_USAGE
VOID
SpxFreeMemory(
IN PVOID pBuf);
#define SpxAllocateZeroedMemory(Size) SpxAllocateMemory((Size) | ZEROED_MEMORY_TAG)
extern
NTSTATUS
SpxInitMemorySystem(
IN PDEVICE pSpxDevice);
extern
VOID
SpxDeInitMemorySystem(
IN PDEVICE pSpxDevice);
PVOID
SpxBPAllocBlock(
IN BLKID BlockId);
VOID
SpxBPFreeBlock(
IN PVOID pBlock,
IN BLKID BlockId);
PNDIS_PACKET
GrowSPXPacketList(void);