-dont return NULL when realloc to 0 bytes (fixes one kernel32_winetest heap test) -only allow realloc to new position if GMEM_MOVEABLE is passed (fixed mem) -only allow realloc to new position if GMEM_MOVEABLE is passed OR mem is not locked (moveable mem) Modified: trunk/reactos/lib/kernel32/mem/global.c _____
Modified: trunk/reactos/lib/kernel32/mem/global.c --- trunk/reactos/lib/kernel32/mem/global.c 2005-10-17 19:29:51 UTC (rev 18527) +++ trunk/reactos/lib/kernel32/mem/global.c 2005-10-17 20:11:21 UTC (rev 18528) @@ -536,6 +536,11 @@
{ if(ISPOINTER(hMem)) { + if (!(uFlags & GMEM_MOVEABLE)) + { + heap_flags |= HEAP_REALLOC_IN_PLACE_ONLY; + } + /* reallocate fixed memory */ hnew = (HANDLE)RtlReAllocateHeap(GetProcessHeap(), heap_flags, (LPVOID) hMem, dwBytes); } @@ -543,37 +548,47 @@ { /* reallocate a moveable block */ phandle= HANDLE_TO_INTERN(hMem); + hnew = hMem; + if (0 != dwBytes) { - hnew = hMem; - if(phandle->Pointer) - { - palloc = RtlReAllocateHeap(GetProcessHeap(), heap_flags, - (PVOID)((ULONG_PTR)phandle->Pointer - HANDLE_SIZE), - dwBytes + HANDLE_SIZE); - if (0 == palloc) - { - hnew = 0; - } - else - { - *(PHANDLE)palloc = hMem; - phandle->Pointer = (PVOID)((ULONG_PTR)palloc + HANDLE_SIZE); - } - } - else - { - palloc = RtlAllocateHeap(GetProcessHeap(), heap_flags, dwBytes + HANDLE_SIZE); - if (0 == palloc) - { - hnew = 0; - } - else - { - *(PHANDLE)palloc = hMem; - phandle->Pointer = (PVOID)((ULONG_PTR)palloc + HANDLE_SIZE); - } - } + if(phandle->Pointer) + { + + if (phandle->LockCount && !(uFlags & GMEM_MOVEABLE)) + { + /* Locked memory cant normally move but the MEM_MOVEABLE flag + * override this behaviour. But in this case that flag was not passed. + */ + heap_flags |= HEAP_REALLOC_IN_PLACE_ONLY; + } + + palloc = RtlReAllocateHeap(GetProcessHeap(), heap_flags, + (PVOID)((ULONG_PTR)phandle->Pointer - HANDLE_SIZE), + dwBytes + HANDLE_SIZE); + if (0 == palloc) + { + hnew = 0; + } + else + { + *(PHANDLE)palloc = hMem; + phandle->Pointer = (PVOID)((ULONG_PTR)palloc + HANDLE_SIZE); + } + } + else + { + palloc = RtlAllocateHeap(GetProcessHeap(), heap_flags, dwBytes + HANDLE_SIZE); + if (0 == palloc) + { + hnew = 0; + } + else + { + *(PHANDLE)palloc = hMem; + phandle->Pointer = (PVOID)((ULONG_PTR)palloc + HANDLE_SIZE); + } + } } else { @@ -585,6 +600,7 @@ } } } + HeapUnlock(GetProcessHeap());
return hnew;