169 lines
6.6 KiB
C
169 lines
6.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
kernel32.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
The heap manager is identical (exactly) to the Win9x heap manager. The code
|
||
|
is the same and the corresponding conversion code and defines are in
|
||
|
support.c and kernel32.h The exact win9x sources are in heap.c and lmem.c.
|
||
|
All the heap functions come in heap.c and the local/global functions come
|
||
|
in lmem.c.
|
||
|
|
||
|
The SHIM code comes in EmulateHeap.cpp. This hooks the heap calls and calls
|
||
|
the Win9x code to emulate the Win9x heap. After the heap management by the
|
||
|
Win9x heap, the underneath calls to the Virtual memory functions are handled
|
||
|
in support.c. The only difference comes in the way Win9x handles 'SHARED'
|
||
|
and "PRIVATE' heaps.Win9x creates the process default heap as a SHARED heap
|
||
|
and uses it in kernel mode too. We also create it as a SHARED heap but do
|
||
|
not share it with the kernel. Win9x links all the PRIVATE heaps for the
|
||
|
process in the PDB data structure. We fake this structure with only the
|
||
|
required elements and allow the Win9x code to handle this structure.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
None.
|
||
|
|
||
|
History:
|
||
|
|
||
|
11/16/2000 prashkud & linstev Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _KERNEL32_H_
|
||
|
#define _KERNEL32_H_
|
||
|
|
||
|
#include "windows.h"
|
||
|
|
||
|
#define INTERNAL
|
||
|
#define EXTERNAL
|
||
|
#define KERNENTRY WINAPI
|
||
|
|
||
|
#define PAGESHIFT 12
|
||
|
#define PAGESIZE (1 << PAGESHIFT)
|
||
|
#define PAGEMASK (PAGESIZE - 1)
|
||
|
|
||
|
#define CRST CRITICAL_SECTION
|
||
|
|
||
|
//BUGBUG - did this to prevent build error, but should make no difference
|
||
|
#define typObj LockCount
|
||
|
#define typObjCrst 0
|
||
|
|
||
|
#define InitCrst(_x_) InitializeCriticalSection(_x_)
|
||
|
#define DestroyCrst(_x_) DeleteCriticalSection(_x_)
|
||
|
#define EnterCrst(_x_) EnterCriticalSection(_x_)
|
||
|
#define LeaveCrst(_x_) LeaveCriticalSection(_x_)
|
||
|
#define Assert(_x_)
|
||
|
|
||
|
/* PageReserve flags */
|
||
|
#define PR_FIXED 0x00000008 /* don't move during PageReAllocate */
|
||
|
#define PR_4MEG 0x00000001 /* allocate on 4mb boundary */
|
||
|
#define PR_STATIC 0x00000010 /* see PageReserve documentation */
|
||
|
|
||
|
/* PageCommit default pager handle values */
|
||
|
#define PD_ZEROINIT 0x00000001 /* swappable zero-initialized pages */
|
||
|
#define PD_NOINIT 0x00000002 /* swappable uninitialized pages */
|
||
|
#define PD_FIXEDZERO 0x00000003 /* fixed zero-initialized pages */
|
||
|
#define PD_FIXED 0x00000004 /* fixed uninitialized pages */
|
||
|
|
||
|
/* PageCommit flags */
|
||
|
#define PC_FIXED 0x00000008 /* pages are permanently locked */
|
||
|
#define PC_LOCKED 0x00000080 /* pages are made present and locked*/
|
||
|
#define PC_LOCKEDIFDP 0x00000100 /* pages are locked if swap via DOS */
|
||
|
#define PC_WRITEABLE 0x00020000 /* make the pages writeable */
|
||
|
#define PC_USER 0x00040000 /* make the pages ring 3 accessible */
|
||
|
#define PC_INCR 0x40000000 /* increment "pagerdata" each page */
|
||
|
#define PC_PRESENT 0x80000000 /* make pages initially present */
|
||
|
#define PC_STATIC 0x20000000 /* allow commit in PR_STATIC object */
|
||
|
#define PC_DIRTY 0x08000000 /* make pages initially dirty */
|
||
|
#define PC_CACHEDIS 0x00100000 /* Allocate uncached pages - new for WDM */
|
||
|
#define PC_CACHEWT 0x00080000 /* Allocate write through cache pages - new for WDM */
|
||
|
#define PC_PAGEFLUSH 0x00008000 /* Touch device mapped pages on alloc - new for WDM */
|
||
|
|
||
|
/* PageReserve arena values */
|
||
|
#define PR_PRIVATE 0x80000400 /* anywhere in private arena */
|
||
|
#define PR_SHARED 0x80060000 /* anywhere in shared arena */
|
||
|
#define PR_SYSTEM 0x80080000 /* anywhere in system arena */
|
||
|
|
||
|
// This can be anything since it only affects flags which are ignored
|
||
|
#define MINSHAREDLADDR 1
|
||
|
// This is used for validation, which is identical on NT - no allocation can be at > 0x7fffffff
|
||
|
#define MAXSHAREDLADDR 0x7fffffff
|
||
|
// This is used for validation, old value was 0x00400000, but now just make it 1
|
||
|
#define MINPRIVATELADDR 1
|
||
|
// Used to determine if a heap is private, was 0x3fffffff, but now make it 0x7fffffff
|
||
|
#define MAXPRIVATELADDR 0x7fffffff
|
||
|
|
||
|
extern ULONG PageCommit(ULONG page, ULONG npages, ULONG hpd, ULONG pagerdata, ULONG flags);
|
||
|
extern ULONG PageDecommit(ULONG page, ULONG npages, ULONG flags);
|
||
|
extern ULONG PageReserve(ULONG page, ULONG npages, ULONG flags);
|
||
|
#define PageFree(_x_, _y_) VirtualFree((LPVOID) _x_, 0, MEM_RELEASE)
|
||
|
|
||
|
#define PvKernelAlloc0(_x_) VirtualAlloc(0, _x_, MEM_COMMIT, PAGE_READWRITE)
|
||
|
#define FKernelFree(_x_) VirtualFree((LPVOID) _x_, 0, MEM_RELEASE)
|
||
|
|
||
|
extern CRITICAL_SECTION *NewCrst();
|
||
|
extern VOID DisposeCrst(CRITICAL_SECTION *lpcs);
|
||
|
|
||
|
#define FillBytes(a, b, c) memset(a, c, b)
|
||
|
|
||
|
#define SetError(_x_) SetLastError(_x_)
|
||
|
#define dprintf(_x_) OutputDebugStringA(_x_)
|
||
|
#define DebugOut(_x_)
|
||
|
#define DEB_WARN 0
|
||
|
#define DEB_ERR 1
|
||
|
|
||
|
#include "EmulateHeap_heap.h"
|
||
|
|
||
|
#define HeapSize _HeapSize
|
||
|
#define HeapCreate _HeapCreate
|
||
|
#define HeapDestroy _HeapDestroy
|
||
|
#define HeapReAlloc _HeapReAlloc
|
||
|
#define HeapAlloc _HeapAlloc
|
||
|
#define HeapFree _HeapFree
|
||
|
#define HeapFreeInternal _HeapFree
|
||
|
#define LocalReAlloc _LocalReAlloc
|
||
|
#define LocalAllocNG _LocalAlloc
|
||
|
#define LocalFreeNG _LocalFree
|
||
|
#define LocalLock _LocalLock
|
||
|
#define LocalCompact _LocalCompact
|
||
|
#define LocalShrink _LocalShrink
|
||
|
#define LocalUnlock _LocalUnlock
|
||
|
#define LocalSize _LocalSize
|
||
|
#define LocalHandle _LocalHandle
|
||
|
#define LocalFlags _LocalFlags
|
||
|
|
||
|
//BUGBUG: don't think we need these - looks like they're required for kernel heap support
|
||
|
#define EnterMustComplete()
|
||
|
#define LeaveMustComplete()
|
||
|
|
||
|
// For lmem.c
|
||
|
typedef struct _pdb {
|
||
|
struct heapinfo_s *hheapLocal; // DON'T MOVE THIS!!! handle to heap in private memeory
|
||
|
struct lhandle_s *plhFree; // Local heap free handle list head ptr
|
||
|
struct heapinfo_s *hhi_procfirst; // linked list of heaps for this process
|
||
|
struct lharray_s *plhBlock; // local heap lhandle blocks
|
||
|
} PDB, *PPDB;
|
||
|
|
||
|
extern PDB **pppdbCur;
|
||
|
#define GetCurrentPdb() (*pppdbCur)
|
||
|
|
||
|
extern HANDLE hheapKernel;
|
||
|
extern HANDLE HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);
|
||
|
extern DWORD APIENTRY HeapSize(HHEAP hheap, DWORD flags, LPSTR lpMem);
|
||
|
extern BOOL APIENTRY HeapFreeInternal(HHEAP hheap, DWORD flags, LPSTR lpMem);
|
||
|
|
||
|
#define HEAP_SHARED 0x04000000 // put heap in shared memory
|
||
|
#define HEAP_LOCKED 0x00000080 // put heap in locked memory
|
||
|
|
||
|
#ifdef WINBASEAPI
|
||
|
#undef WINBASEAPI
|
||
|
#define WINBASEAPI
|
||
|
#endif
|
||
|
|
||
|
#endif // _KERNEL32_H_
|