|
|
/*
Copyright (c) 1992 Microsoft Corporation
Module Name:
memory.h
Abstract:
This module contains the memory allocation routines.
Author:
Jameel Hyder (microsoft!jameelh)
Revision History: 25 Apr 1992 Initial Version
Notes: Tab stop: 4 --*/
#ifndef _AFPMEMORY_
#define _AFPMEMORY_
//
// NOTE: The tag values below are designed to allocate/detect on free memory allocated.
// Note that the callers free the memory simply via AfpFreeMemory and allocate
// via AfpAllocMemory.
//
// via one of the three possible ways:
// a, Non paged memory via ExAllocatePool
// b, Paged memory via ExAllocatePool
// c, Non paged memory via Io Pool
//
#define AFP_TAG *(PULONG)"Afp " // For ExAllocatePoolWithTag()
#define PGD_MEM_TAG 0x11
#define PAGED_MEMORY_TAG (PGD_MEM_TAG << 24)
#define NPG_MEM_TAG 0x22
#define NON_PAGED_MEMORY_TAG (NPG_MEM_TAG << 24)
#define IO_POOL_TAG 0x44
#define IO_POOL_MEMORY_TAG (IO_POOL_TAG << 24)
#define ZEROED_MEM_TAG 0x88
#define ZEROED_MEMORY_TAG (ZEROED_MEM_TAG << 24)
#define MEMORY_TAG_MASK (PAGED_MEMORY_TAG | \
NON_PAGED_MEMORY_TAG | \ IO_POOL_MEMORY_TAG | \ ZEROED_MEMORY_TAG)
extern NTSTATUS AfpMemoryInit( VOID );
extern VOID AfpMemoryDeInit( VOID );
#ifdef TRACK_MEMORY_USAGE
#define AfpAllocNonPagedMemory(_S) \
AfpAllocMemory((_S) | NON_PAGED_MEMORY_TAG, FILENUM | __LINE__)
#define AfpAllocZeroedNonPagedMemory(_S) \
AfpAllocMemory((_S) | NON_PAGED_MEMORY_TAG | ZEROED_MEMORY_TAG, FILENUM | __LINE__)
#define AfpAllocPANonPagedMemory(_S) \
AfpAllocPAMemory((_S) | NON_PAGED_MEMORY_TAG, FILENUM | __LINE__)
#define AfpAllocPagedMemory(_S) \
AfpAllocMemory((_S) | PAGED_MEMORY_TAG, FILENUM | __LINE__)
#define AfpAllocZeroedPagedMemory(_S) \
AfpAllocMemory((_S) | PAGED_MEMORY_TAG | ZEROED_MEMORY_TAG, FILENUM | __LINE__)
#define AfpAllocPAPagedMemory(_S) \
AfpAllocPAMemory((_S) | PAGED_MEMORY_TAG, FILENUM | __LINE__)
extern PBYTE FASTCALL AfpAllocMemory( IN LONG Size, IN DWORD FileLine );
extern PBYTE FASTCALL AfpAllocNonPagedLowPriority( IN LONG Size, IN DWORD FileLine );
extern PBYTE FASTCALL AfpAllocPAMemory( IN LONG Size, IN DWORD FileLine );
extern VOID AfpTrackMemoryUsage( IN PVOID pMem, IN BOOLEAN Alloc, IN BOOLEAN Paged, IN DWORD FileLine );
#else
#define AfpAllocNonPagedMemory(_S) AfpAllocMemory((_S) | NON_PAGED_MEMORY_TAG)
#define AfpAllocZeroedNonPagedMemory(_S) AfpAllocMemory((_S) | NON_PAGED_MEMORY_TAG | ZEROED_MEMORY_TAG)
#define AfpAllocPANonPagedMemory(_S) AfpAllocPAMemory((_S) | NON_PAGED_MEMORY_TAG)
#define AfpAllocPagedMemory(_S) AfpAllocMemory((_S) | PAGED_MEMORY_TAG)
#define AfpAllocZeroedPagedMemory(_S) AfpAllocMemory((_S) | PAGED_MEMORY_TAG | ZEROED_MEMORY_TAG)
#define AfpAllocPAPagedMemory(_S) AfpAllocPAMemory((_S) | PAGED_MEMORY_TAG)
extern PBYTE FASTCALL AfpAllocMemory( IN LONG Size );
extern PBYTE FASTCALL AfpAllocNonPagedLowPriority( IN LONG Size );
extern PBYTE FASTCALL AfpAllocPAMemory( IN LONG Size );
#endif
#define AfpAllocIoMemory(Size) AfpIoAllocBuffer(Size)
extern VOID FASTCALL AfpFreeMemory( IN PVOID pBuffer );
#define AfpFreePAPagedMemory(_pBuf, _S) AfpFreePAMemory(_pBuf, (_S) | PAGED_MEMORY_TAG)
#define AfpFreePANonPagedMemory(_pBuf, _S) AfpFreePAMemory(_pBuf, (_S) | NON_PAGED_MEMORY_TAG)
extern VOID FASTCALL AfpFreePAMemory( IN PVOID pBuffer, IN DWORD Size );
extern PBYTE FASTCALL AfpAllocateVirtualMemoryPage( IN VOID );
extern VOID FASTCALL AfpFreeVirtualMemoryPage( IN PVOID pBuffer );
extern AFPSTATUS FASTCALL AfpAllocReplyBuf( IN PSDA pSda );
extern PBYTE FASTCALL AfpAllocStatusBuf( IN LONG Size );
extern PIRP FASTCALL AfpAllocIrp( IN CCHAR StackSize );
extern VOID FASTCALL AfpFreeIrp( IN PIRP pIrp );
extern PMDL FASTCALL AfpAllocMdl( IN PVOID pBuffer, IN DWORD Size, IN PIRP pIrp );
extern PMDL AfpAllocMdlForPagedPool( IN PVOID pBuffer, IN DWORD Size, IN PIRP pIrp );
extern VOID FASTCALL AfpFreeMdl( IN PMDL pMdl );
extern DWORD FASTCALL AfpMdlChainSize( IN PMDL pMdl );
extern PVOID FASTCALL AfpIOAllocBuffer( IN DWORD BufSize );
extern VOID FASTCALL AfpIOFreeBuffer( IN PVOID pBuffer );
#define EQUAL_UNICODE_STRING(pUS1, pUS2, fIgnoreCase) \
(((pUS1)->Length == (pUS2)->Length) && \ RtlEqualUnicodeString(pUS1, pUS2, fIgnoreCase))
#define EQUAL_STRING(pS1, pS2, fIgnoreCase) \
(((pS1)->Length == (pS2)->Length) && \ RtlEqualString(pS1, pS2, fIgnoreCase))
// case sensitive unicode string compare
#define EQUAL_UNICODE_STRING_CS(pUS1, pUS2) \
(((pUS1)->Length == (pUS2)->Length) && \ (memcmp((pUS1)->Buffer, (pUS2)->Buffer, (pUS1)->Length) == 0))
//
// AfpSetEmptyUnicodeString and AfpSetEmptyAnsiString are used in
// situations where you have allocated your own pointer for the string
// Buffer, and now you want to initialize all the fields of a counted
// string, making it point to your buffer and setting its length fields
// appropriately for an 'empty' string. Situations like this would
// include data structures where you have allocated a large chunk of
// memory that has included room for any required strings at the end of
// the chunk. For example, the VolDesc structure includes several
// counted strings, and we can just point the string buffers to the
// end of the same chunk of memory that the VolDesc itself occupies.
//
// VOID
// AfpSetEmptyUnicodeString(
// OUT PUNICODE_STRING pstring,
// IN USHORT buflen,
// IN PWSTR pbuf
// );
//
#define AfpSetEmptyUnicodeString(pstring,buflen,pbuf) \
{ \ (pstring)->Length = 0; \ (pstring)->MaximumLength = (USHORT)buflen; \ (pstring)->Buffer = (PWSTR)(pbuf); \ }
//
// VOID
// AfpSetEmptyAnsiString(
// OUT PANSI_STRING pstring,
// IN USHORT buflen,
// IN PCHAR pbuf
// );
//
#define AfpSetEmptyAnsiString(pstring,buflen,pbuf) \
{ \ (pstring)->Length = 0; \ (pstring)->MaximumLength = (USHORT)buflen; \ (pstring)->Buffer = (PCHAR)(pbuf); \ }
//
// AfpInitUnicodeStringWithNonNullTerm initializes a unicode string with
// a non-null terminated wide char string and its length.
//
// VOID
// AfpInitUnicodeStringWithNonNullTerm(
// OUT PUNICODE_STRING pstring,
// IN USHORT buflen,
// IN PWCHAR pbuf
// );
//
#define AfpInitUnicodeStringWithNonNullTerm(pstring,buflen,pbuf) \
{ \ (pstring)->Buffer = pbuf; \ (pstring)->Length = (USHORT)buflen; \ (pstring)->MaximumLength = (USHORT)buflen; \ }
//
// AfpInitAnsiStringWithNonNullTerm initializes an Ansi string with
// a non-null terminated char string and its length.
//
// VOID
// AfpInitAnsiStringWithNonNullTerm(
// OUT PANSI_STRING pstring,
// IN USHORT buflen,
// IN PCHAR pbuf
// );
//
#define AfpInitAnsiStringWithNonNullTerm(pstring,buflen,pbuf) \
{ \ (pstring)->Buffer = pbuf; \ (pstring)->Length = (USHORT)buflen; \ (pstring)->MaximumLength = (USHORT)buflen; \ }
#define AfpCopyUnicodeString(pDst, pSrc) \
{ \ ASSERT((pDst)->MaximumLength >= (pSrc)->Length); \ RtlCopyMemory((pDst)->Buffer, \ (pSrc)->Buffer, \ (pSrc)->Length); \ (pDst)->Length = (pSrc)->Length; \ }
#define AfpCopyAnsiString(pDst, pSrc) \
{ \ ASSERT((pDst)->MaximumLength >= (pSrc)->Length); \ RtlCopyMemory((pDst)->Buffer, \ (pSrc)->Buffer, \ (pSrc)->Length); \ (pDst)->Length = (pSrc)->Length; \ }
#endif // _AFPMEMORY_
|