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.8 KiB
356 lines
7.8 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_
|
|
|
|
|