Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//--------------------------------------------------------------------
// Copyright (C)1998 Microsoft Corporation, All Rights Reserved.
//
// memory.cpp
//
// Simple memory allocation routines. We use our own private heap
// so we won't (have less chances of) interfering with any other
// service code.
//
// Author:
//
// Edward Reus (EdwardR) 03-04-98 Initial coding.
//
// Edward Reus (EdwardR) 06-08-98 Convert to use private heap.
//
//--------------------------------------------------------------------
#include "precomp.h"
#pragma warning (disable:4200)
typedef struct _PDU_MEMORY { LIST_ENTRY Link; DWORD dwPduSize; UCHAR Pdu[]; } PDU_MEMORY;
#pragma warning (default:4200)
static HANDLE g_hHeap = 0; // Can't use INVALID_HANDLE_VALUE.
static LIST_ENTRY g_FreePduList; static BOOL g_fListInitialized = FALSE;
#ifdef DBG_MEM
static LONG g_lPduCount = 0; #endif
//--------------------------------------------------------------------
// InitializeMemory()
//
//--------------------------------------------------------------------
DWORD InitializeMemory() { DWORD dwStatus = NO_ERROR; #define INITIAL_HEAP_PAGES 64
if (!g_hHeap) { SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
DWORD dwFlags = 0; DWORD dwInitialSize = INITIAL_HEAP_PAGES * SystemInfo.dwPageSize; DWORD dwMaxSize = 0; g_hHeap = HeapCreate( dwFlags, dwInitialSize, dwMaxSize ); if (!g_hHeap) { dwStatus = GetLastError(); } }
return dwStatus; }
//--------------------------------------------------------------------
// AllocateMemory()
//
//--------------------------------------------------------------------
void *AllocateMemory( DWORD dwBytes ) { DWORD dwStatus; void *pvMemory;
if (!g_hHeap) { dwStatus = InitializeMemory(); }
if ((g_hHeap) && (dwBytes > 0)) { #ifdef DBG_MEM_VALIDATE
HeapValidate(g_hHeap,0,0); #endif
pvMemory = HeapAlloc(g_hHeap,0,dwBytes); } else { pvMemory = 0; }
return pvMemory; }
//--------------------------------------------------------------------
// FreeMemory()
//
//--------------------------------------------------------------------
DWORD FreeMemory( void *pvMemory ) { DWORD dwStatus = NO_ERROR;
if (g_hHeap) { #ifdef DBG_MEM_VALIDATE
HeapValidate(g_hHeap,0,0); #endif
if (pvMemory) { if (!HeapFree(g_hHeap,0,pvMemory)) { dwStatus = GetLastError(); } } } else { #ifdef DBG_MEM
DbgPrint("IrXfer.dll: IrTran-P: Free memory with NULL g_hHeap.\n"); #endif
}
return dwStatus; }
//--------------------------------------------------------------------
// UninitializeMemory()
//
//--------------------------------------------------------------------
DWORD UninitializeMemory() { DWORD dwStatus = NO_ERROR;
#ifdef DBG_MEM_VALIDATE
HeapValidate(g_hHeap,0,0); #endif
if (g_hHeap) { if (!HeapDestroy(g_hHeap)) { dwStatus = GetLastError(); } }
g_hHeap = 0;
return dwStatus; }
//--------------------------------------------------------------------
// NewPdu()
//
//--------------------------------------------------------------------
SCEP_HEADER *NewPdu( DWORD dwPduSize ) { SCEP_HEADER *pPdu; PDU_MEMORY *pPduMemory; LIST_ENTRY *pLink;
if (!g_fListInitialized) { InitializeListHead(&g_FreePduList); g_fListInitialized = TRUE; }
if (dwPduSize == 0) { dwPduSize = MAX_PDU_SIZE; }
if (IsListEmpty(&g_FreePduList)) { pPduMemory = (PDU_MEMORY*)AllocateMemory( sizeof(PDU_MEMORY)+dwPduSize );
if (pPduMemory) { pPduMemory->Link.Flink = 0; pPduMemory->Link.Blink = 0; pPduMemory->dwPduSize = dwPduSize; } } else { pLink = RemoveHeadList(&g_FreePduList); pPduMemory = CONTAINING_RECORD(pLink,PDU_MEMORY,Link); }
if (pPduMemory) { pPdu = (SCEP_HEADER*)(pPduMemory->Pdu); } else { pPdu = 0; }
#ifdef DBG_MEM
if (pPdu) { InterlockedIncrement(&g_lPduCount); } DbgPrint("NewPdu(): Count: %d Bytes: %d Addr: 0x%x\n", g_lPduCount, dwPduSize, pPdu ); #endif
return pPdu; }
//--------------------------------------------------------------------
// DeletePdu()
//
//--------------------------------------------------------------------
void DeletePdu( SCEP_HEADER *pPdu ) { PDU_MEMORY *pPduMemory;
if (pPdu) { pPduMemory = CONTAINING_RECORD(pPdu,PDU_MEMORY,Pdu); InsertTailList(&g_FreePduList,&pPduMemory->Link);
#ifdef DBG_MEM
InterlockedDecrement(&g_lPduCount); DbgPrint("DeletePdu(): Count: %d\n",g_lPduCount); #endif
} }
|