2010-02-26 11:43:19 +00:00
|
|
|
#pragma once
|
2006-11-08 11:47:44 +00:00
|
|
|
|
|
|
|
#define DECLARE_RETURN(type) type _ret_
|
|
|
|
#define RETURN(value) { _ret_ = value; goto _cleanup_; }
|
|
|
|
#define CLEANUP /*unreachable*/ ASSERT(FALSE); _cleanup_
|
|
|
|
#define END_CLEANUP return _ret_;
|
|
|
|
|
|
|
|
|
2007-02-28 13:21:48 +00:00
|
|
|
#define UserEnterCo UserEnterExclusive
|
|
|
|
#define UserLeaveCo UserLeave
|
2006-11-08 11:47:44 +00:00
|
|
|
|
2012-02-06 12:30:59 +00:00
|
|
|
extern BOOL gbInitialized;
|
2008-05-30 06:13:52 +00:00
|
|
|
extern PSERVERINFO gpsi;
|
2011-08-22 19:58:32 +00:00
|
|
|
extern PTHREADINFO gptiCurrent;
|
2012-10-27 16:39:18 +00:00
|
|
|
extern PPROCESSINFO gppiList;
|
2012-02-05 20:21:22 +00:00
|
|
|
extern PPROCESSINFO ppiScrnSaver;
|
2012-04-21 18:18:59 +00:00
|
|
|
extern PPROCESSINFO gppiInputProvider;
|
2012-11-02 13:50:31 +00:00
|
|
|
extern PEPROCESS gpepCSRSS;
|
2006-11-08 11:47:44 +00:00
|
|
|
|
2010-11-03 00:51:19 +00:00
|
|
|
INIT_FUNCTION NTSTATUS NTAPI InitUserImpl(VOID);
|
2007-02-28 13:21:48 +00:00
|
|
|
VOID FASTCALL CleanupUserImpl(VOID);
|
|
|
|
VOID FASTCALL UserEnterShared(VOID);
|
|
|
|
VOID FASTCALL UserEnterExclusive(VOID);
|
|
|
|
VOID FASTCALL UserLeave(VOID);
|
2009-08-24 20:09:58 +00:00
|
|
|
BOOL FASTCALL UserIsEntered(VOID);
|
|
|
|
BOOL FASTCALL UserIsEnteredExclusive(VOID);
|
2006-11-08 11:47:44 +00:00
|
|
|
|
2011-08-27 18:26:37 +00:00
|
|
|
/* User heap */
|
|
|
|
extern HANDLE GlobalUserHeap;
|
|
|
|
|
|
|
|
PWIN32HEAP
|
|
|
|
UserCreateHeap(OUT PSECTION_OBJECT *SectionObject,
|
|
|
|
IN OUT PVOID *SystemBase,
|
|
|
|
IN SIZE_T HeapSize);
|
|
|
|
|
|
|
|
static __inline PVOID
|
|
|
|
UserHeapAlloc(SIZE_T Bytes)
|
|
|
|
{
|
|
|
|
return RtlAllocateHeap(GlobalUserHeap,
|
|
|
|
HEAP_NO_SERIALIZE,
|
|
|
|
Bytes);
|
|
|
|
}
|
|
|
|
|
|
|
|
static __inline BOOL
|
|
|
|
UserHeapFree(PVOID lpMem)
|
|
|
|
{
|
|
|
|
return RtlFreeHeap(GlobalUserHeap,
|
|
|
|
HEAP_NO_SERIALIZE,
|
|
|
|
lpMem);
|
|
|
|
}
|
|
|
|
|
|
|
|
static __inline PVOID
|
|
|
|
UserHeapReAlloc(PVOID lpMem,
|
|
|
|
SIZE_T Bytes)
|
|
|
|
{
|
|
|
|
#if 0
|
|
|
|
/* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
|
|
|
|
return RtlReAllocateHeap(GlobalUserHeap,
|
|
|
|
HEAP_NO_SERIALIZE,
|
|
|
|
lpMem,
|
|
|
|
Bytes);
|
|
|
|
#else
|
|
|
|
SIZE_T PrevSize;
|
|
|
|
PVOID pNew;
|
|
|
|
|
|
|
|
PrevSize = RtlSizeHeap(GlobalUserHeap,
|
|
|
|
HEAP_NO_SERIALIZE,
|
|
|
|
lpMem);
|
|
|
|
|
|
|
|
if (PrevSize == Bytes)
|
|
|
|
return lpMem;
|
|
|
|
|
|
|
|
pNew = RtlAllocateHeap(GlobalUserHeap,
|
|
|
|
HEAP_NO_SERIALIZE,
|
|
|
|
Bytes);
|
|
|
|
if (pNew != NULL)
|
|
|
|
{
|
|
|
|
if (PrevSize < Bytes)
|
|
|
|
Bytes = PrevSize;
|
|
|
|
|
|
|
|
RtlCopyMemory(pNew,
|
|
|
|
lpMem,
|
|
|
|
Bytes);
|
|
|
|
|
|
|
|
RtlFreeHeap(GlobalUserHeap,
|
|
|
|
HEAP_NO_SERIALIZE,
|
|
|
|
lpMem);
|
|
|
|
}
|
|
|
|
|
|
|
|
return pNew;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
static __inline PVOID
|
|
|
|
UserHeapAddressToUser(PVOID lpMem)
|
|
|
|
{
|
|
|
|
PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process();
|
|
|
|
return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)GlobalUserHeap) +
|
|
|
|
(ULONG_PTR)W32Process->HeapMappings.UserMapping);
|
|
|
|
}
|
|
|
|
|
2006-11-08 11:47:44 +00:00
|
|
|
/* EOF */
|