3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/pool.c
6 * PURPOSE: Implements the kernel memory pool
7 * PROGRAMMER: David Welch (welch@mcmail.com)
10 /* INCLUDES ****************************************************************/
12 #include <ddk/ntddk.h>
13 #include <reactos/bugcodes.h>
14 #include <internal/ntoskrnl.h>
15 #include <internal/pool.h>
18 #include <internal/debug.h>
20 /* GLOBALS *****************************************************************/
22 #define TAG_NONE (ULONG)(('N'<<0) + ('o'<<8) + ('n'<<16) + ('e'<<24))
24 /* FUNCTIONS ***************************************************************/
27 EiAllocatePool(POOL_TYPE PoolType,
34 if (PoolType == NonPagedPoolCacheAligned ||
35 PoolType == NonPagedPoolCacheAlignedMustS)
43 case NonPagedPoolMustSucceed:
44 case NonPagedPoolCacheAligned:
45 case NonPagedPoolCacheAlignedMustS:
47 ExAllocateNonPagedPoolWithTag(PoolType,
54 case PagedPoolCacheAligned:
55 Block = ExAllocatePagedPoolWithTag(PoolType,NumberOfBytes,Tag);
62 if ((PoolType==NonPagedPoolMustSucceed ||
63 PoolType==NonPagedPoolCacheAlignedMustS) && Block==NULL)
65 KeBugCheck(MUST_SUCCEED_POOL_EMPTY);
71 ExAllocatePool (POOL_TYPE PoolType, ULONG NumberOfBytes)
73 * FUNCTION: Allocates pool memory of a specified type and returns a pointer
74 * to the allocated block. This routine is used for general purpose allocation
78 * Specifies the type of memory to allocate which can be one
82 * NonPagedPoolMustSucceed
83 * NonPagedPoolCacheAligned
84 * NonPagedPoolCacheAlignedMustS
86 * PagedPoolCacheAligned
89 * Specifies the number of bytes to allocate
90 * RETURNS: The allocated block on success
95 Block = EiAllocatePool(PoolType,
98 (PVOID)__builtin_return_address(0));
104 ExAllocatePoolWithTag (ULONG PoolType, ULONG NumberOfBytes, ULONG Tag)
107 Block = EiAllocatePool(PoolType,
110 (PVOID)__builtin_return_address(0));
116 ExAllocatePoolWithQuota (POOL_TYPE PoolType, ULONG NumberOfBytes)
118 return(ExAllocatePoolWithQuotaTag(PoolType, NumberOfBytes, TAG_NONE));
123 ExAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType,
124 IN ULONG NumberOfBytes,
129 Block = EiAllocatePool(PoolType,
132 (PVOID)__builtin_return_address(0));
139 ExFreePool(IN PVOID Block)
141 if (Block >= MmPagedPoolBase && Block < (MmPagedPoolBase + MmPagedPoolSize))
143 ExFreePagedPool(Block);
147 ExFreeNonPagedPool(Block);