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.
 
 
 
 
 
 

356 lines
7.5 KiB

/*
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_