[WIN32K]
[reactos.git] / reactos / win32ss / gdi / ntgdi / misc.h
1 #pragma once
2
3 typedef struct INTENG_ENTER_LEAVE_TAG
4 {
5 /* Contents is private to EngEnter/EngLeave */
6 SURFOBJ *DestObj;
7 SURFOBJ *OutputObj;
8 HBITMAP OutputBitmap;
9 CLIPOBJ *TrivialClipObj;
10 RECTL DestRect;
11 BOOL ReadOnly;
12 } INTENG_ENTER_LEAVE, *PINTENG_ENTER_LEAVE;
13
14 extern BOOL APIENTRY IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
15 SURFOBJ *DestObj,
16 RECTL *DestRect,
17 BOOL ReadOnly,
18 POINTL *Translate,
19 SURFOBJ **OutputObj);
20
21 extern BOOL APIENTRY IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave);
22
23 extern HGDIOBJ StockObjects[];
24 extern SHORT gusLanguageID;
25
26 SHORT FASTCALL UserGetLanguageID(VOID);
27 VOID FASTCALL IntUserManualGuiCheck(LONG Check);
28 PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *);
29 VOID APIENTRY HackUnsecureVirtualMemory(IN PVOID);
30
31 NTSTATUS
32 NTAPI
33 RegOpenKey(
34 LPCWSTR pwszKeyName,
35 PHKEY phkey);
36
37 NTSTATUS
38 NTAPI
39 RegQueryValue(
40 IN HKEY hkey,
41 IN PCWSTR pwszValueName,
42 IN ULONG ulType,
43 OUT PVOID pvData,
44 IN OUT PULONG pcbValue);
45
46 VOID
47 NTAPI
48 RegWriteSZ(HKEY hkey, PWSTR pwszValue, PWSTR pwszData);
49
50 VOID
51 NTAPI
52 RegWriteDWORD(HKEY hkey, PWSTR pwszValue, DWORD dwData);
53
54 BOOL
55 NTAPI
56 RegReadDWORD(HKEY hkey, PWSTR pwszValue, PDWORD pdwData);
57
58 BOOL
59 NTAPI
60 RegReadUserSetting(
61 IN PCWSTR pwszKeyName,
62 IN PCWSTR pwszValueName,
63 IN ULONG ulType,
64 OUT PVOID pvData,
65 IN ULONG cbDataSize);
66
67 BOOL
68 NTAPI
69 RegWriteUserSetting(
70 IN PCWSTR pwszKeyName,
71 IN PCWSTR pwszValueName,
72 IN ULONG ulType,
73 OUT PVOID pvData,
74 IN ULONG cbDataSize);
75
76 VOID FASTCALL
77 SetLastNtError(
78 NTSTATUS Status);
79
80 typedef struct _GDI_POOL *PGDI_POOL;
81
82 PGDI_POOL
83 NTAPI
84 GdiPoolCreate(
85 ULONG cjAllocSize,
86 ULONG ulTag);
87
88 VOID
89 NTAPI
90 GdiPoolDestroy(PGDI_POOL pPool);
91
92 PVOID
93 NTAPI
94 GdiPoolAllocate(
95 PGDI_POOL pPool);
96
97 VOID
98 NTAPI
99 GdiPoolFree(
100 PGDI_POOL pPool,
101 PVOID pvAlloc);
102
103 FORCEINLINE
104 VOID
105 ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
106 {
107 /* Try acquiring the lock */
108 if (InterlockedBitTestAndSet((PLONG)PushLock, EX_PUSH_LOCK_LOCK_V))
109 {
110 /* Someone changed it, use the slow path */
111 ExfAcquirePushLockExclusive(PushLock);
112 }
113 }
114
115 FORCEINLINE
116 BOOLEAN
117 ExTryAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
118 {
119 /* Try acquiring the lock */
120 return !InterlockedBitTestAndSet((PLONG)PushLock, EX_PUSH_LOCK_LOCK_V);
121 }
122
123 FORCEINLINE
124 VOID
125 ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
126 {
127 EX_PUSH_LOCK OldValue;
128
129 /* Unlock the pushlock */
130 OldValue.Value = InterlockedExchangeAddSizeT((PSIZE_T)PushLock,
131 -(SSIZE_T)EX_PUSH_LOCK_LOCK);
132 /* Check if anyone is waiting on it and it's not already waking */
133 if ((OldValue.Waiting) && !(OldValue.Waking))
134 {
135 /* Wake it up */
136 ExfTryToWakePushLock(PushLock);
137 }
138 }
139
140 FORCEINLINE
141 VOID
142 _ExInitializePushLock(PEX_PUSH_LOCK Lock)
143 {
144 *(PULONG_PTR)Lock = 0;
145 }
146 #define ExInitializePushLock _ExInitializePushLock
147
148 NTSTATUS FASTCALL
149 IntSafeCopyUnicodeString(PUNICODE_STRING Dest,
150 PUNICODE_STRING Source);
151
152 NTSTATUS FASTCALL
153 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest,
154 PUNICODE_STRING Source);
155
156 HBITMAP NTAPI UserLoadImage(PCWSTR);
157
158 BOOL NTAPI W32kDosPathNameToNtPathName(PCWSTR, PUNICODE_STRING);
159
160 #define ROUND_DOWN(n, align) \
161 (((ULONG)n) & ~((align) - 1l))
162
163 #define ROUND_UP(n, align) \
164 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
165
166 #define LIST_FOR_EACH(elem, list, type, field) \
167 for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \
168 &(elem)->field != (list) && ((&((elem)->field)) != NULL); \
169 (elem) = CONTAINING_RECORD((elem)->field.Flink, type, field))
170
171 #define LIST_FOR_EACH_SAFE(cursor, cursor2, list, type, field) \
172 for ((cursor) = CONTAINING_RECORD((list)->Flink, type, field), \
173 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field); \
174 &(cursor)->field != (list); \
175 (cursor) = (cursor2), \
176 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field))