Fix prototype of RtlCreateHeap and respect the CommitRoutine if passed. Also fix the heap manager to be usable by kernel mode code. Modified: trunk/reactos/include/ndk/rtlfuncs.h Modified: trunk/reactos/include/ndk/rtltypes.h Modified: trunk/reactos/lib/rtl/heap.c Modified: trunk/reactos/lib/rtl/ppb.c Modified: trunk/reactos/lib/rtl/rtl.h Modified: trunk/reactos/w32api/include/ddk/ntifs.h _____
Modified: trunk/reactos/include/ndk/rtlfuncs.h --- trunk/reactos/include/ndk/rtlfuncs.h 2005-08-01 09:23:13 UTC (rev 16938) +++ trunk/reactos/include/ndk/rtlfuncs.h 2005-08-01 10:19:22 UTC (rev 16939) @@ -81,10 +81,10 @@
RtlCreateHeap( IN ULONG Flags, IN PVOID BaseAddress OPTIONAL, - IN ULONG SizeToReserve OPTIONAL, - IN ULONG SizeToCommit OPTIONAL, + IN SIZE_T SizeToReserve OPTIONAL, + IN SIZE_T SizeToCommit OPTIONAL, IN PVOID Lock OPTIONAL, - IN PRTL_HEAP_DEFINITION Definition OPTIONAL + IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL );
DWORD _____
Modified: trunk/reactos/include/ndk/rtltypes.h --- trunk/reactos/include/ndk/rtltypes.h 2005-08-01 09:23:13 UTC (rev 16938) +++ trunk/reactos/include/ndk/rtltypes.h 2005-08-01 10:19:22 UTC (rev 16939) @@ -109,6 +109,15 @@
PVOID Parameter );
+#ifndef _NTIFS_ +typedef NTSTATUS +(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) ( + IN PVOID Base, + IN OUT PVOID *CommitAddress, + IN OUT PSIZE_T CommitSize +); +#endif + /* TYPES *********************************************************************/
typedef unsigned short RTL_ATOM; @@ -219,12 +228,6 @@ ULONG ModuleCount; DEBUG_MODULE_INFORMATION ModuleEntry[1]; } MODULE_INFORMATION, *PMODULE_INFORMATION; - -typedef struct _RTL_HEAP_DEFINITION -{ - ULONG Length; - ULONG Unknown[11]; -} RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION; /* END REVIEW AREA */
#ifdef _INC_EXCPT @@ -399,6 +402,22 @@ PRTL_ATOM_TABLE_ENTRY Buckets[1]; } RTL_ATOM_TABLE, *PRTL_ATOM_TABLE;
+#ifndef _NTIFS_ +typedef struct _RTL_HEAP_PARAMETERS { + ULONG Length; + SIZE_T SegmentReserve; + SIZE_T SegmentCommit; + SIZE_T DeCommitFreeBlockThreshold; + SIZE_T DeCommitTotalFreeThreshold; + SIZE_T MaximumAllocationSize; + SIZE_T VirtualMemoryThreshold; + SIZE_T InitialCommit; + SIZE_T InitialReserve; + PRTL_HEAP_COMMIT_ROUTINE CommitRoutine; + SIZE_T Reserved[2]; +} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS; +#endif + /* Let Kernel Drivers use this */ #ifndef _WINBASE_ typedef struct _SYSTEMTIME _____
Modified: trunk/reactos/lib/rtl/heap.c --- trunk/reactos/lib/rtl/heap.c 2005-08-01 09:23:13 UTC (rev 16938) +++ trunk/reactos/lib/rtl/heap.c 2005-08-01 10:19:22 UTC (rev 16939) @@ -96,7 +96,7 @@
RTL_CRITICAL_SECTION critSection; /* Critical section for serialization */ ULONG flags; /* Heap flags */ ULONG magic; /* Magic number */ - UCHAR filler[4]; /* Make multiple of 8 bytes */ + PRTL_HEAP_COMMIT_ROUTINE commitRoutine; } HEAP, *PHEAP;
@@ -301,12 +301,19 @@ address = (PVOID)((char *)subheap + subheap->commitSize); commitsize = size - subheap->commitSize;
- Status = NtAllocateVirtualMemory(NtCurrentProcess(), - &address, - 0, - &commitsize, - MEM_COMMIT, - PAGE_EXECUTE_READWRITE); + if (subheap->heap->commitRoutine != NULL) + { + Status = subheap->heap->commitRoutine(subheap->heap, &address, &commitsize); + } + else + { + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + &address, + 0, + &commitsize, + MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + } if (!NT_SUCCESS(Status)) { DPRINT( "Could not commit %08lx bytes at %p for heap %p\n", @@ -321,6 +328,7 @@ }
+#if 0
/*********************************************************************** * HEAP_Decommit * @@ -356,8 +364,8 @@ subheap->commitSize -= decommitsize; return TRUE; } +#endif
-
/*********************************************************************** * HEAP_CreateFreeBlock * @@ -504,27 +512,14 @@ * HEAP_InitSubHeap */ static BOOLEAN HEAP_InitSubHeap( HEAP *heap, PVOID address, ULONG flags, - ULONG commitSize, ULONG totalSize ) + ULONG commitSize, ULONG totalSize, + PRTL_HEAP_PARAMETERS Parameters ) { SUBHEAP *subheap = (SUBHEAP *)address; FREE_LIST_ENTRY *pEntry; int i; NTSTATUS Status;
- /* Commit memory */ - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - &address, - 0, - (PULONG)&commitSize, - MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT("Could not commit %08lx bytes for sub-heap %p\n", - commitSize, address); - return FALSE; - } - /* Fill the sub-heap structure */
subheap = (PSUBHEAP)address; @@ -550,6 +545,10 @@ heap->next = NULL; heap->flags = flags; heap->magic = HEAP_MAGIC; + if (Parameters) + heap->commitRoutine = Parameters->CommitRoutine; + else + heap->commitRoutine = NULL;
/* Build the free lists */
@@ -570,6 +569,27 @@ RtlInitializeCriticalSection( &heap->critSection ); }
+ /* Commit memory */ + if (heap->commitRoutine) + { + Status = heap->commitRoutine(heap, &address, &commitSize); + } + else + { + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &address, + 0, + &commitSize, + MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + } + if (!NT_SUCCESS(Status)) + { + DPRINT("Could not commit %08lx bytes for sub-heap %p\n", + commitSize, address); + return FALSE; + } + /* Create the first free block */
HEAP_CreateFreeBlock( subheap, (PUCHAR)subheap + subheap->headerSize, @@ -586,8 +606,9 @@ */ static PSUBHEAP HEAP_CreateSubHeap(PVOID BaseAddress, - HEAP *heap, ULONG flags, - ULONG commitSize, ULONG totalSize ) + HEAP *heap, ULONG flags, + ULONG commitSize, ULONG totalSize, + PRTL_HEAP_PARAMETERS Parameters ) { PVOID address; NTSTATUS Status; @@ -621,8 +642,9 @@
/* Initialize subheap */
- if (!HEAP_InitSubHeap( heap? heap : (HEAP *)address, - address, flags, commitSize, totalSize )) + if (!HEAP_InitSubHeap( heap ? heap : (HEAP *)address, + address, flags, commitSize, totalSize, + Parameters )) { if (!BaseAddress) { @@ -690,7 +712,7 @@ * might get assigned all remaining free space in HEAP_ShrinkBlock() */ size += sizeof(SUBHEAP) + sizeof(ARENA_FREE) + HEAP_MIN_BLOCK_SIZE; if (!(subheap = HEAP_CreateSubHeap( NULL, heap, heap->flags, size, - max( HEAP_DEF_SIZE, size ) ))) + max( HEAP_DEF_SIZE, size ), NULL ))) return NULL;
DPRINT("created new sub-heap %p of %08lx bytes for heap %p\n", @@ -1055,10 +1077,10 @@ HANDLE STDCALL RtlCreateHeap(ULONG flags, PVOID BaseAddress, - ULONG maxSize, - ULONG initialSize, - PVOID Unknown, - PRTL_HEAP_DEFINITION Definition) + SIZE_T maxSize, + SIZE_T initialSize, + PVOID Lock, + PRTL_HEAP_PARAMETERS Parameters) { SUBHEAP *subheap; HEAP *heapPtr; @@ -1070,20 +1092,24 @@ maxSize = HEAP_DEF_SIZE; flags |= HEAP_GROWABLE; } - if (!(subheap = HEAP_CreateSubHeap( BaseAddress, NULL, flags, initialSize, maxSize ))) + if (!(subheap = HEAP_CreateSubHeap( BaseAddress, NULL, flags, initialSize, + maxSize, Parameters ))) { return 0; }
- /* link it into the per-process heap list */ - RtlEnterCriticalSection (&RtlpProcessHeapsListLock); + if (RtlpGetMode() == UserMode) + { + /* link it into the per-process heap list */ + RtlEnterCriticalSection (&RtlpProcessHeapsListLock);
- heapPtr = subheap->heap; - heapPtr->next = (HEAP*)NtCurrentPeb()->ProcessHeaps; - NtCurrentPeb()->ProcessHeaps = (HANDLE)heapPtr; - NtCurrentPeb()->NumberOfHeaps++; + heapPtr = subheap->heap; + heapPtr->next = (HEAP*)NtCurrentPeb()->ProcessHeaps; + NtCurrentPeb()->ProcessHeaps = (HANDLE)heapPtr; + NtCurrentPeb()->NumberOfHeaps++;
- RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); + RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); + }
return (HANDLE)subheap; } @@ -1112,18 +1138,21 @@ if (!heapPtr) return heap;
- if (heap == NtCurrentPeb()->ProcessHeap) - return heap; /* cannot delete the main process heap */ + if (RtlpGetMode() == UserMode) + { + if (heap == NtCurrentPeb()->ProcessHeap) + return heap; /* cannot delete the main process heap */
- /* remove it from the per-process list */ - RtlEnterCriticalSection (&RtlpProcessHeapsListLock); + /* remove it from the per-process list */ + RtlEnterCriticalSection (&RtlpProcessHeapsListLock);
- pptr = (HEAP**)&NtCurrentPeb()->ProcessHeaps; - while (*pptr && *pptr != heapPtr) pptr = &(*pptr)->next; - if (*pptr) *pptr = (*pptr)->next; - NtCurrentPeb()->NumberOfHeaps--; + pptr = (HEAP**)&NtCurrentPeb()->ProcessHeaps; + while (*pptr && *pptr != heapPtr) pptr = &(*pptr)->next; + if (*pptr) *pptr = (*pptr)->next; + NtCurrentPeb()->NumberOfHeaps--;
- RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); + RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); + }
RtlDeleteCriticalSection( &heapPtr->critSection ); subheap = &heapPtr->subheap; _____
Modified: trunk/reactos/lib/rtl/ppb.c --- trunk/reactos/lib/rtl/ppb.c 2005-08-01 09:23:13 UTC (rev 16938) +++ trunk/reactos/lib/rtl/ppb.c 2005-08-01 10:19:22 UTC (rev 16939) @@ -22,11 +22,6 @@
#define DENORMALIZE(x,addr) {if(x) x=(PVOID)((ULONG_PTR)(x)-(ULONG_PTR)(addr));} #define ALIGN(x,align) (((ULONG)(x)+(align)-1UL)&(~((align)-1UL)))
- -KPROCESSOR_MODE -RtlpGetMode(); - - /* FUNCTIONS ****************************************************************/
_____
Modified: trunk/reactos/lib/rtl/rtl.h --- trunk/reactos/lib/rtl/rtl.h 2005-08-01 09:23:13 UTC (rev 16938) +++ trunk/reactos/lib/rtl/rtl.h 2005-08-01 10:19:22 UTC (rev 16939) @@ -29,6 +29,7 @@
extern PVOID RtlpAllocateMemory(UINT Bytes, ULONG Tag); extern VOID RtlpFreeMemory(PVOID Mem, ULONG Tag); +extern KPROCESSOR_MODE RtlpGetMode();
#define RtlpAllocateStringMemory RtlpAllocateMemory #define RtlpFreeStringMemory RtlpFreeMemory _____
Modified: trunk/reactos/w32api/include/ddk/ntifs.h --- trunk/reactos/w32api/include/ddk/ntifs.h 2005-08-01 09:23:13 UTC (rev 16938) +++ trunk/reactos/w32api/include/ddk/ntifs.h 2005-08-01 10:19:22 UTC (rev 16939) @@ -1486,6 +1486,27 @@
#endif
+typedef NTSTATUS +(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) ( + IN PVOID Base, + IN OUT PVOID *CommitAddress, + IN OUT PSIZE_T CommitSize +); + +typedef struct _RTL_HEAP_PARAMETERS { + ULONG Length; + SIZE_T SegmentReserve; + SIZE_T SegmentCommit; + SIZE_T DeCommitFreeBlockThreshold; + SIZE_T DeCommitTotalFreeThreshold; + SIZE_T MaximumAllocationSize; + SIZE_T VirtualMemoryThreshold; + SIZE_T InitialCommit; + SIZE_T InitialReserve; + PRTL_HEAP_COMMIT_ROUTINE CommitRoutine; + SIZE_T Reserved[2]; +} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS; + NTKERNELAPI BOOLEAN NTAPI @@ -2171,6 +2192,18 @@ );
NTKERNELAPI +PVOID +NTAPI +RtlCreateHeap ( + IN ULONG Flags, + IN PVOID HeapBase OPTIONAL, + IN SIZE_T ReserveSize OPTIONAL, + IN SIZE_T CommitSize OPTIONAL, + IN PVOID Lock OPTIONAL, + IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL +); + +NTKERNELAPI BOOLEAN NTAPI FsRtlCurrentBatchOplock ( @@ -2200,6 +2233,13 @@ );
NTKERNELAPI +PVOID +NTAPI +RtlDestroyHeap( + IN PVOID HeapHandle +); + +NTKERNELAPI VOID NTAPI FsRtlDissectDbcs (