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