- Sync with trunk r58248 to bring the latest changes from Amine (headers) and others...
[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 gppiList;
16 extern PPROCESSINFO ppiScrnSaver;
17 extern PPROCESSINFO gppiInputProvider;
18 extern PEPROCESS gpepCSRSS;
19 extern ATOM gaGuiConsoleWndClass;
20 extern ATOM gaTuiConsoleWndClass;
21
22 INIT_FUNCTION NTSTATUS NTAPI InitUserImpl(VOID);
23 VOID FASTCALL CleanupUserImpl(VOID);
24 VOID FASTCALL UserEnterShared(VOID);
25 VOID FASTCALL UserEnterExclusive(VOID);
26 VOID FASTCALL UserLeave(VOID);
27 BOOL FASTCALL UserIsEntered(VOID);
28 BOOL FASTCALL UserIsEnteredExclusive(VOID);
29
30 /* User heap */
31 extern HANDLE GlobalUserHeap;
32
33 PWIN32HEAP
34 UserCreateHeap(OUT PSECTION_OBJECT *SectionObject,
35 IN OUT PVOID *SystemBase,
36 IN SIZE_T HeapSize);
37
38 static __inline PVOID
39 UserHeapAlloc(SIZE_T Bytes)
40 {
41 return RtlAllocateHeap(GlobalUserHeap,
42 HEAP_NO_SERIALIZE,
43 Bytes);
44 }
45
46 static __inline BOOL
47 UserHeapFree(PVOID lpMem)
48 {
49 return RtlFreeHeap(GlobalUserHeap,
50 HEAP_NO_SERIALIZE,
51 lpMem);
52 }
53
54 static __inline PVOID
55 UserHeapReAlloc(PVOID lpMem,
56 SIZE_T Bytes)
57 {
58 #if 0
59 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
60 return RtlReAllocateHeap(GlobalUserHeap,
61 HEAP_NO_SERIALIZE,
62 lpMem,
63 Bytes);
64 #else
65 SIZE_T PrevSize;
66 PVOID pNew;
67
68 PrevSize = RtlSizeHeap(GlobalUserHeap,
69 HEAP_NO_SERIALIZE,
70 lpMem);
71
72 if (PrevSize == Bytes)
73 return lpMem;
74
75 pNew = RtlAllocateHeap(GlobalUserHeap,
76 HEAP_NO_SERIALIZE,
77 Bytes);
78 if (pNew != NULL)
79 {
80 if (PrevSize < Bytes)
81 Bytes = PrevSize;
82
83 RtlCopyMemory(pNew,
84 lpMem,
85 Bytes);
86
87 RtlFreeHeap(GlobalUserHeap,
88 HEAP_NO_SERIALIZE,
89 lpMem);
90 }
91
92 return pNew;
93 #endif
94 }
95
96 static __inline PVOID
97 UserHeapAddressToUser(PVOID lpMem)
98 {
99 PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process();
100 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)GlobalUserHeap) +
101 (ULONG_PTR)W32Process->HeapMappings.UserMapping);
102 }
103
104 /* EOF */