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 USHORT gusLanguageID;
25
26 BOOL InitializeGreCSRSS(VOID);
27 USHORT FASTCALL UserGetLanguageID(VOID);
28
29 PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *);
30 VOID APIENTRY HackUnsecureVirtualMemory(IN PVOID);
31
32 NTSTATUS
33 NTAPI
34 RegOpenKey(
35 LPCWSTR pwszKeyName,
36 PHKEY phkey);
37
38 NTSTATUS
39 NTAPI
40 RegQueryValue(
41 IN HKEY hkey,
42 IN PCWSTR pwszValueName,
43 IN ULONG ulType,
44 OUT PVOID pvData,
45 IN OUT PULONG pcbValue);
46
47 VOID
48 NTAPI
49 RegWriteSZ(HKEY hkey, PCWSTR pwszValue, PWSTR pwszData);
50
51 VOID
52 NTAPI
53 RegWriteDWORD(HKEY hkey, PCWSTR pwszValue, DWORD dwData);
54
55 BOOL
56 NTAPI
57 RegReadDWORD(HKEY hkey, PCWSTR pwszValue, PDWORD pdwData);
58
59 DWORD
60 NTAPI
61 RegGetSectionDWORD(LPCWSTR pszSection, PCWSTR pszValue, DWORD dwDefault);
62
63 VOID
64 FASTCALL
65 SetLastNtError(_In_ NTSTATUS Status);
66
67 typedef struct _GDI_POOL *PGDI_POOL;
68
69 PGDI_POOL
70 NTAPI
71 GdiPoolCreate(
72 ULONG cjAllocSize,
73 ULONG ulTag);
74
75 VOID
76 NTAPI
77 GdiPoolDestroy(PGDI_POOL pPool);
78
79 PVOID
80 NTAPI
81 GdiPoolAllocate(
82 PGDI_POOL pPool);
83
84 VOID
85 NTAPI
86 GdiPoolFree(
87 PGDI_POOL pPool,
88 PVOID pvAlloc);
89
90 FORCEINLINE
91 VOID
ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)92 ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
93 {
94 /* Try acquiring the lock */
95 if (InterlockedBitTestAndSet((PLONG)PushLock, EX_PUSH_LOCK_LOCK_V))
96 {
97 /* Someone changed it, use the slow path */
98 ExfAcquirePushLockExclusive(PushLock);
99 }
100 }
101
102 FORCEINLINE
103 BOOLEAN
ExTryAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)104 ExTryAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
105 {
106 /* Try acquiring the lock */
107 return !InterlockedBitTestAndSet((PLONG)PushLock, EX_PUSH_LOCK_LOCK_V);
108 }
109
110 FORCEINLINE
111 VOID
ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)112 ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
113 {
114 EX_PUSH_LOCK OldValue;
115
116 /* Unlock the pushlock */
117 OldValue.Value = InterlockedExchangeAddSizeT((PSIZE_T)PushLock,
118 -(SSIZE_T)EX_PUSH_LOCK_LOCK);
119 /* Check if anyone is waiting on it and it's not already waking */
120 if ((OldValue.Waiting) && !(OldValue.Waking))
121 {
122 /* Wake it up */
123 ExfTryToWakePushLock(PushLock);
124 }
125 }
126
127 FORCEINLINE
128 VOID
_ExInitializePushLock(PEX_PUSH_LOCK Lock)129 _ExInitializePushLock(PEX_PUSH_LOCK Lock)
130 {
131 *(PULONG_PTR)Lock = 0;
132 }
133 #define ExInitializePushLock _ExInitializePushLock
134
135 NTSTATUS FASTCALL
136 IntSafeCopyUnicodeString(PUNICODE_STRING Dest,
137 PUNICODE_STRING Source);
138
139 NTSTATUS FASTCALL
140 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest,
141 PUNICODE_STRING Source);
142
143 HBITMAP NTAPI UserLoadImage(PCWSTR);
144
145 BOOL NTAPI W32kDosPathNameToNtPathName(PCWSTR, PUNICODE_STRING);
146
147