Author: ion Date: Sat Jun 24 21:05:05 2006 New Revision: 22576
URL: http://svn.reactos.org/svn/reactos?rev=22576&view=rev Log: - Fix implementation of RtlSetUserValueHeap and RtlGetUserInfoHeap to write their flags to the subheap and not the actual main heap structure (since those flags are valid for each allocation). - Make heap allocations 8-byte aligned again.
Modified: trunk/reactos/lib/rtl/heap.c
Modified: trunk/reactos/lib/rtl/heap.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heap.c?rev=22576&am... ============================================================================== --- trunk/reactos/lib/rtl/heap.c (original) +++ trunk/reactos/lib/rtl/heap.c Sat Jun 24 21:05:05 2006 @@ -87,6 +87,8 @@ struct tagSUBHEAP *next; /* Next sub-heap */ struct tagHEAP *heap; /* Main heap structure */ ULONG magic; /* Magic number */ + ULONG UserFlags; + PVOID UserValue; } SUBHEAP, *PSUBHEAP;
@@ -100,7 +102,6 @@ RTL_CRITICAL_SECTION critSection; /* Critical section for serialization */ ULONG flags; /* Heap flags */ ULONG magic; /* Magic number */ - PVOID UserValue; PRTL_HEAP_COMMIT_ROUTINE commitRoutine; } HEAP, *PHEAP; @@ -1250,6 +1251,9 @@ pInUse->threadId = (ULONG)NtCurrentTeb()->Cid.UniqueThread; pInUse->magic = ARENA_INUSE_MAGIC;
+ /* Save user flags */ + subheap->UserFlags = flags & HEAP_SETTABLE_USER_FLAGS; + /* Shrink the block */
HEAP_ShrinkBlock( subheap, pInUse, size ); @@ -1262,7 +1266,7 @@ if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection );
- DPRINT("(%p,%08lx,%08lx): returning %p\n", + DPRINT1("(%p,%08lx,%08lx): returning %p\n", heap, flags, size, (PVOID)(pInUse + 1) ); return (PVOID)(pInUse + 1); } @@ -1855,9 +1859,15 @@ IN PVOID UserValue) { HEAP *heapPtr = HEAP_GetPtr(HeapHandle); + ARENA_INUSE *pInUse; + SUBHEAP *subheap; + + /* Get the subheap */ + pInUse = (ARENA_INUSE *)BaseAddress - 1; + subheap = HEAP_FindSubHeap( heapPtr, pInUse );
/* Hack */ - heapPtr->UserValue = UserValue; + subheap->UserValue = UserValue; return TRUE; }
@@ -1873,10 +1883,16 @@ OUT PULONG UserFlags) { HEAP *heapPtr = HEAP_GetPtr(HeapHandle); + ARENA_INUSE *pInUse; + SUBHEAP *subheap; + + /* Get the subheap */ + pInUse = (ARENA_INUSE *)BaseAddress - 1; + subheap = HEAP_FindSubHeap( heapPtr, pInUse );
/* Hack */ - if (UserValue) *UserValue = heapPtr->UserValue; - if (UserFlags) *UserFlags = heapPtr->flags & HEAP_SETTABLE_USER_FLAGS; + if (UserValue) *UserValue = subheap->UserValue; + if (UserFlags) *UserFlags = subheap->UserFlags; return TRUE; }