* Put the type definitions of the heap in a seperate header. Boudewijn Dekker
*/
+#include <kernel32/kernel32.h>
#include <kernel32/heap.h>
+#include <internal/string.h>
static HEAP_BUCKET __HeapDefaultBuckets[]=
{
{ NULL, 256, 15, 4088 },
};
+PHEAP __ProcessHeap;
static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end);
static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end);
static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag);
static VOID __HeapFreeRest(PHEAP pheap, PHEAP_BLOCK pfree, ULONG allocsize,
ULONG newsize);
-static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, ULONG size);
+static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size);
static BOOL __HeapFree(PHEAP pheap, ULONG flags, LPVOID pmem);
static PHEAP_SUBALLOC __HeapAllocSub(PHEAP pheap, PHEAP_BUCKET pbucket);
static LPVOID __HeapAllocFragment(PHEAP pheap, ULONG flags, ULONG size);
{
dprintf("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n",
(ULONG) pheap, (ULONG) start, (ULONG) end);
-#ifdef NOT
- __VirtualDump();
-#endif
+
if(end >= pheap->LastBlock)
pheap->LastBlock=end;
- return __VirtualCommit(start, end-start, PAGE_READWRITE);
+ if (VirtualAlloc(start,end-start,MEM_COMMIT,PAGE_READWRITE)!=start)
+ {
+ return(FALSE);
+ }
+ return(TRUE);
}
/*********************************************************************
#endif
if((end >= pheap->LastBlock)&&(start<= pheap->LastBlock))
pheap->LastBlock=start;
- return __VirtualDecommit(start, end-start );
+
+ return(VirtualFree(start,end-start,MEM_RESERVE));
}
/*********************************************************************
LPVOID commitend;
ULONG freesize;
ULONG allocsize;
-
+
+ dprintf("__HeapAlloc(pheap %x, flags %x, size %d, tag %x)\n",
+ pheap,flags,size,tag);
+
pfree=&(pheap->Start);
allocsize=SIZE_ROUND(size);
freesize=HEAP_SIZE(pfree);
/* update our administration */
palloc->Size= size | tag;
if((flags | pheap->Flags)& HEAP_ZERO_MEMORY)
- memset((LPVOID)palloc+HEAP_ADMIN_SIZE, 0, allocsize);
+ FillMemory((LPVOID)palloc+HEAP_ADMIN_SIZE, allocsize, 0);
return (LPVOID)palloc+HEAP_ADMIN_SIZE;
}
/* alloc a new fragment */
pmem=__HeapAllocFragment(pheap, flags, size);
if(pmem)
- memcpy(pmem, pold, size);
+ CopyMemory(pmem, pold, size);
return pmem;
}
#endif
oldsize=HEAP_SIZE(prealloc);
pmem=__HeapAlloc(pheap, flags, size, HEAP_NORMAL_TAG);
if(pmem)
- memcpy(pmem, pold, oldsize);
+ CopyMemory(pmem, pold, oldsize);
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
memset(pmem + oldsize, 0, size-oldsize);
__HeapFree(pheap, flags, pold);
pmem=__HeapAllocFragment(pheap, flags, size);
if(pmem)
- memcpy(pmem, pold, size);
+ CopyMemory(pmem, pold, size);
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
memset(pmem+pfrag->Size, 0, size-pfrag->Size);
PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
{
PHEAP pheap=(PHEAP) base;
-
+
+ dprintf("__HeapPrepare(base %x, minsize %d, maxsize %d, flags %x)\n",
+ base,minsize,maxsize,flags);
+
pheap->Magic=MAGIC_HEAP;
pheap->End= ((LPVOID)pheap)+minsize;
pheap->Flags=flags;
pheap->LastBlock=(LPVOID)pheap + PAGESIZE;
- memcpy(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
+ CopyMemory(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
if(__ProcessHeap)
{
pheap->NextHeap=__ProcessHeap->NextHeap;
VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
{
- mmap(base, PAGESIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
- __DevZero, 0);
+ VirtualAlloc(base,maxsize,MEM_RESERVE,PAGE_READWRITE);
+ VirtualAlloc(base,PAGESIZE,MEM_COMMIT,PAGE_READWRITE);
__HeapPrepare(base, minsize, maxsize, 0);
}
/*********************************************************************
* HeapCreate -- KERNEL32 *
*********************************************************************/
-
-HANDLE WINAPI HeapCreate(ULONG flags, ULONG minsize, ULONG maxsize)
+HANDLE STDCALL HeapCreate(DWORD flags, DWORD minsize, DWORD maxsize)
{
PHEAP pheap;
aprintf("HeapCreate( 0x%lX, 0x%lX, 0x%lX )\n", flags, minsize, maxsize);
- pheap = __VirtualReserve(NULL, minsize, PAGE_READWRITE | MEM_TOP_DOWN);
- __VirtualCommit(pheap, PAGESIZE, PAGE_READWRITE);
- __VirtualDump();
+ pheap = VirtualAlloc(NULL, minsize, MEM_TOP_DOWN, PAGE_READWRITE);
+ VirtualAlloc(pheap, PAGESIZE, MEM_COMMIT, PAGE_READWRITE);
return (HANDLE) __HeapPrepare(pheap, minsize, maxsize, flags);
}
return __ErrorReturnFalse(ERROR_INVALID_PARAMETER);
DeleteCriticalSection(&(pheap->Synchronize));
- __VirtualRelease(pheap);
-
+ VirtualFree(pheap,0,MEM_RELEASE);
+
return TRUE;
}
/*********************************************************************
* HeapAlloc -- KERNEL32 *
*********************************************************************/
-LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size)
+LPVOID STDCALL HeapAlloc(HANDLE hheap, DWORD flags, DWORD size)
{
PHEAP pheap=hheap;
LPVOID retval;
/*********************************************************************
* HeapReAlloc -- KERNEL32 *
*********************************************************************/
-LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size)
+LPVOID STDCALL HeapReAlloc(HANDLE hheap, DWORD flags, LPVOID ptr, DWORD size)
{
PHEAP pheap=hheap;
PHEAP_BLOCK pfree=((PHEAP_BLOCK)ptr-1);
/*********************************************************************
* HeapFree -- KERNEL32 *
*********************************************************************/
-BOOL WINAPI HeapFree(HANDLE hheap, ULONG flags, LPVOID ptr)
+WINBOOL STDCALL HeapFree(HANDLE hheap, DWORD flags, LPVOID ptr)
{
PHEAP pheap=hheap;
PHEAP_BLOCK pfree=(PHEAP_BLOCK)((LPVOID)ptr-HEAP_ADMIN_SIZE);