[WIN32SS/USER32]
[reactos.git] / win32ss / user / ntuser / ntuser.h
1 #pragma once
2
3 #define DECLARE_RETURN(type) type _ret_
4 #define RETURN(value) { _ret_ = value; goto _cleanup_; }
5 #define CLEANUP /*unreachable*/ ASSERT(FALSE); _cleanup_
6 #define END_CLEANUP return _ret_;
7
8
9 #define UserEnterCo UserEnterExclusive
10 #define UserLeaveCo UserLeave
11
12 extern BOOL gbInitialized;
13 extern PSERVERINFO gpsi;
14 extern PTHREADINFO gptiCurrent;
15 extern PPROCESSINFO ppiScrnSaver;
16 extern PPROCESSINFO gppiInputProvider;
17
18 INIT_FUNCTION NTSTATUS NTAPI InitUserImpl(VOID);
19 VOID FASTCALL CleanupUserImpl(VOID);
20 VOID FASTCALL UserEnterShared(VOID);
21 VOID FASTCALL UserEnterExclusive(VOID);
22 VOID FASTCALL UserLeave(VOID);
23 BOOL FASTCALL UserIsEntered(VOID);
24 BOOL FASTCALL UserIsEnteredExclusive(VOID);
25
26 /* User heap */
27 extern HANDLE GlobalUserHeap;
28
29 PWIN32HEAP
30 UserCreateHeap(OUT PSECTION_OBJECT *SectionObject,
31 IN OUT PVOID *SystemBase,
32 IN SIZE_T HeapSize);
33
34 static __inline PVOID
35 UserHeapAlloc(SIZE_T Bytes)
36 {
37 return RtlAllocateHeap(GlobalUserHeap,
38 HEAP_NO_SERIALIZE,
39 Bytes);
40 }
41
42 static __inline BOOL
43 UserHeapFree(PVOID lpMem)
44 {
45 return RtlFreeHeap(GlobalUserHeap,
46 HEAP_NO_SERIALIZE,
47 lpMem);
48 }
49
50 static __inline PVOID
51 UserHeapReAlloc(PVOID lpMem,
52 SIZE_T Bytes)
53 {
54 #if 0
55 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
56 return RtlReAllocateHeap(GlobalUserHeap,
57 HEAP_NO_SERIALIZE,
58 lpMem,
59 Bytes);
60 #else
61 SIZE_T PrevSize;
62 PVOID pNew;
63
64 PrevSize = RtlSizeHeap(GlobalUserHeap,
65 HEAP_NO_SERIALIZE,
66 lpMem);
67
68 if (PrevSize == Bytes)
69 return lpMem;
70
71 pNew = RtlAllocateHeap(GlobalUserHeap,
72 HEAP_NO_SERIALIZE,
73 Bytes);
74 if (pNew != NULL)
75 {
76 if (PrevSize < Bytes)
77 Bytes = PrevSize;
78
79 RtlCopyMemory(pNew,
80 lpMem,
81 Bytes);
82
83 RtlFreeHeap(GlobalUserHeap,
84 HEAP_NO_SERIALIZE,
85 lpMem);
86 }
87
88 return pNew;
89 #endif
90 }
91
92 static __inline PVOID
93 UserHeapAddressToUser(PVOID lpMem)
94 {
95 PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process();
96 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)GlobalUserHeap) +
97 (ULONG_PTR)W32Process->HeapMappings.UserMapping);
98 }
99
100 /* EOF */