[NTDLL/CSR/SM]
[reactos.git] / 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 VOID
117 ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
118 {
119 EX_PUSH_LOCK OldValue;
120
121 /* Unlock the pushlock */
122 OldValue.Value = InterlockedExchangeAddSizeT((PSIZE_T)PushLock,
123 -(SSIZE_T)EX_PUSH_LOCK_LOCK);
124 /* Check if anyone is waiting on it and it's not already waking */
125 if ((OldValue.Waiting) && !(OldValue.Waking))
126 {
127 /* Wake it up */
128 ExfTryToWakePushLock(PushLock);
129 }
130 }
131
132 FORCEINLINE
133 VOID
134 _ExInitializePushLock(PEX_PUSH_LOCK Lock)
135 {
136 *(PULONG_PTR)Lock = 0;
137 }
138 #define ExInitializePushLock _ExInitializePushLock
139
140 NTSTATUS FASTCALL
141 IntSafeCopyUnicodeString(PUNICODE_STRING Dest,
142 PUNICODE_STRING Source);
143
144 NTSTATUS FASTCALL
145 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest,
146 PUNICODE_STRING Source);
147
148 HBITMAP NTAPI UserLoadImage(PCWSTR);
149
150 BOOL NTAPI W32kDosPathNameToNtPathName(PCWSTR, PUNICODE_STRING);
151
152 #define ROUND_DOWN(n, align) \
153 (((ULONG)n) & ~((align) - 1l))
154
155 #define ROUND_UP(n, align) \
156 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
157
158 #define LIST_FOR_EACH(elem, list, type, field) \
159 for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \
160 &(elem)->field != (list) && ((&((elem)->field)) != NULL); \
161 (elem) = CONTAINING_RECORD((elem)->field.Flink, type, field))
162
163 #define LIST_FOR_EACH_SAFE(cursor, cursor2, list, type, field) \
164 for ((cursor) = CONTAINING_RECORD((list)->Flink, type, field), \
165 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field); \
166 &(cursor)->field != (list) && ((&((cursor)->field)) != NULL); \
167 (cursor) = (cursor2), \
168 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field))