3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/zone.c
6 * PURPOSE: Implements zone buffers
7 * PROGRAMMER: David Welch (welch@mcmail.com)
10 /* INCLUDES ****************************************************************/
12 #include <ddk/ntddk.h>
14 /* FUNCTIONS ***************************************************************/
16 // undocumented? from extypes.h in here for now...
18 //typedef struct _ZONE_ENTRY
20 // SINGLE_LIST_ENTRY Entry;
21 //} ZONE_ENTRY, *PZONE_ENTRY;
36 PZONE_SEGMENT_HEADER entry;
37 PZONE_SEGMENT_HEADER seg;
40 seg = (PZONE_SEGMENT_HEADER)Segment;
41 seg->Reserved = (PVOID) SegmentSize;
43 PushEntryList(&Zone->SegmentList,&seg->SegmentList);
45 entry = (PZONE_SEGMENT_HEADER)( ((PVOID)seg) + sizeof(ZONE_SEGMENT_HEADER) );
47 for (i=0;i<(SegmentSize / Zone->BlockSize);i++)
49 PushEntryList(&Zone->FreeList,&entry->SegmentList);
50 entry = (PZONE_SEGMENT_HEADER)(((PVOID)entry) + sizeof(PZONE_SEGMENT_HEADER) +
53 return(STATUS_SUCCESS);
62 ExInterlockedExtendZone (
72 KeAcquireSpinLock(Lock,&oldlvl);
73 ret = ExExtendZone(Zone,Segment,SegmentSize);
74 KeReleaseSpinLock(Lock,oldlvl);
88 ULONG InitialSegmentSize
91 * FUNCTION: Initalizes a zone header
93 * Zone = zone header to be initialized
94 * BlockSize = Size (in bytes) of the allocation size of the zone
95 * InitialSegment = Initial segment of storage allocated by the
97 * InitialSegmentSize = Initial size of the segment
101 PZONE_SEGMENT_HEADER seg;
102 PZONE_SEGMENT_HEADER entry;
104 Zone->FreeList.Next=NULL;
105 Zone->SegmentList.Next=NULL;
106 Zone->BlockSize=BlockSize;
107 Zone->TotalSegmentSize = InitialSegmentSize;
109 seg = (PZONE_SEGMENT_HEADER)InitialSegment;
110 seg->Reserved = (PVOID*) InitialSegmentSize;
112 PushEntryList(&Zone->SegmentList,&seg->SegmentList);
114 entry = (PZONE_SEGMENT_HEADER)( ((PVOID)seg) + sizeof(ZONE_SEGMENT_HEADER) );
116 for (i=0;i<(InitialSegmentSize / BlockSize);i++)
118 PushEntryList(&Zone->FreeList,&entry->SegmentList);
119 entry = (PZONE_SEGMENT_HEADER)(((PVOID)entry) + sizeof(PZONE_SEGMENT_HEADER) + BlockSize);
122 return(STATUS_SUCCESS);