356 lines
7.5 KiB
C
356 lines
7.5 KiB
C
/*
|
||
|
||
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_
|
||
|
||
|