xref: /reactos/win32ss/user/ntuser/win32.h (revision 9eca7c52)
1 #pragma once
2 
3 /* W32PROCESS flags */
4 #define W32PF_CONSOLEAPPLICATION      0x00000001
5 #define W32PF_FORCEOFFFEEDBACK        0x00000002
6 #define W32PF_STARTGLASS              0x00000004
7 #define W32PF_WOW                     0x00000008
8 #define W32PF_READSCREENACCESSGRANTED 0x00000010
9 #define W32PF_INITIALIZED             0x00000020
10 #define W32PF_APPSTARTING             0x00000040
11 #define W32PF_WOW64                   0x00000080
12 #define W32PF_ALLOWFOREGROUNDACTIVATE 0x00000100
13 #define W32PF_OWNDCCLEANUP            0x00000200
14 #define W32PF_SHOWSTARTGLASSCALLED    0x00000400
15 #define W32PF_FORCEBACKGROUNDPRIORITY 0x00000800
16 #define W32PF_TERMINATED              0x00001000
17 #define W32PF_CLASSESREGISTERED       0x00002000
18 #define W32PF_THREADCONNECTED         0x00004000
19 #define W32PF_PROCESSCONNECTED        0x00008000
20 #define W32PF_SETFOREGROUNDALLOWED    0x00008000
21 #define W32PF_WAKEWOWEXEC             0x00010000
22 #define W32PF_WAITFORINPUTIDLE        0x00020000
23 #define W32PF_IOWINSTA                0x00040000
24 #define W32PF_CONSOLEFOREGROUND       0x00080000
25 #define W32PF_OLELOADED               0x00100000
26 #define W32PF_SCREENSAVER             0x00200000
27 #define W32PF_IDLESCREENSAVER         0x00400000
28 #define W32PF_DISABLEIME              0x00800000
29 #define W32PF_ICONTITLEREGISTERED     0x10000000
30 #define W32PF_DPIAWARE                0x20000000
31 // ReactOS
32 #define W32PF_NOWINDOWGHOSTING       (0x01000000)
33 #define W32PF_MANUALGUICHECK         (0x02000000)
34 #define W32PF_CREATEDWINORDC         (0x04000000)
35 #define W32PF_APIHOOKLOADED          (0x08000000)
36 
37 #define QSIDCOUNTS 7
38 
39 typedef enum _QS_ROS_TYPES
40 {
41     QSRosKey = 0,
42     QSRosMouseMove,
43     QSRosMouseButton,
44     QSRosPostMessage,
45     QSRosSendMessage,
46     QSRosHotKey,
47     QSRosEvent,
48 } QS_ROS_TYPES, *PQS_ROS_TYPES;
49 
50 extern BOOL ClientPfnInit;
51 extern HINSTANCE hModClient;
52 extern HANDLE hModuleWin;    // This Win32k Instance.
53 extern struct _CLS *SystemClassList;
54 extern BOOL RegisteredSysClasses;
55 
56 struct _TL;
57 typedef struct _TL *PTL;
58 
59 typedef struct _W32THREAD
60 {
61     PETHREAD pEThread;
62     LONG RefCount;
63     PTL ptlW32;
64     PVOID pgdiDcattr;
65     PVOID pgdiBrushAttr;
66     PVOID pUMPDObjs;
67     PVOID pUMPDHeap;
68     DWORD dwEngAcquireCount;
69     PVOID pSemTable;
70     PVOID pUMPDObj;
71 } W32THREAD, *PW32THREAD;
72 
73 struct tagIMC;
74 
75 /*
76  * THREADINFO structure.
77  * See also: https://reactos.org/wiki/Techwiki:Win32k/THREADINFO
78  */
79 #ifdef __cplusplus
80 typedef struct _THREADINFO : _W32THREAD
81 {
82 #else
83 typedef struct _THREADINFO
84 {
85     W32THREAD;
86 #endif
87     PTL                 ptl;
88     PPROCESSINFO        ppi;
89     struct _USER_MESSAGE_QUEUE* MessageQueue;
90     struct tagKL*       KeyboardLayout;
91     struct _CLIENTTHREADINFO  * pcti;
92     struct _DESKTOP*    rpdesk;
93     struct _DESKTOPINFO  *  pDeskInfo;
94     struct _CLIENTINFO * pClientInfo;
95     FLONG               TIF_flags;
96     PUNICODE_STRING     pstrAppName;
97     struct _USER_SENT_MESSAGE *pusmSent;
98     struct _USER_SENT_MESSAGE *pusmCurrent;
99     /* Queue of messages sent to the queue. */
100     LIST_ENTRY          SentMessagesListHead;    // psmsReceiveList
101     /* Last message time and ID */
102     LONG                timeLast;
103     ULONG_PTR           idLast;
104     /* True if a WM_QUIT message is pending. */
105     BOOLEAN             QuitPosted;
106     /* The quit exit code. */
107     INT                 exitCode;
108     HDESK               hdesk;
109     UINT                cPaintsReady; /* Count of paints pending. */
110     UINT                cTimersReady; /* Count of timers pending. */
111     struct tagMENUSTATE* pMenuState;
112     DWORD               dwExpWinVer;
113     DWORD               dwCompatFlags;
114     DWORD               dwCompatFlags2;
115     struct _USER_MESSAGE_QUEUE* pqAttach;
116     PTHREADINFO         ptiSibling;
117     ULONG               fsHooks;
118     struct tagHOOK *    sphkCurrent;
119     LPARAM              lParamHkCurrent;
120     WPARAM              wParamHkCurrent;
121     struct tagSBTRACK*  pSBTrack;
122     /* Set if there are new messages specified by WakeMask in any of the queues. */
123     HANDLE              hEventQueueClient;
124     /* Handle for the above event (in the context of the process owning the queue). */
125     PKEVENT             pEventQueueServer;
126     LIST_ENTRY          PtiLink;
127     INT                 iCursorLevel;
128     /* Last message cursor position */
129     POINT               ptLast;
130     /* Input context-related */
131     struct _WND*        spwndDefaultIme;
132     struct tagIMC*      spDefaultImc;
133     HKL                 hklPrev;
134 
135     INT                 cEnterCount;
136     /* Queue of messages posted to the queue. */
137     LIST_ENTRY          PostedMessagesListHead; // mlPost
138     WORD                fsChangeBitsRemoved;
139     WCHAR               wchInjected;
140     UINT                cWindows;
141     UINT                cVisWindows;
142 #ifndef __cplusplus /// FIXME!
143     LIST_ENTRY          aphkStart[NB_HOOKS];
144     CLIENTTHREADINFO    cti;  // Used only when no Desktop or pcti NULL.
145 
146     /* ReactOS */
147 
148     /* Thread Queue state tracking */
149     // Send list QS_SENDMESSAGE
150     // Post list QS_POSTMESSAGE|QS_HOTKEY|QS_PAINT|QS_TIMER|QS_KEY
151     // Hard list QS_MOUSE|QS_KEY only
152     // Accounting of queue bit sets, the rest are flags. QS_TIMER QS_PAINT counts are handled in thread information.
153     DWORD nCntsQBits[QSIDCOUNTS]; // QS_KEY QS_MOUSEMOVE QS_MOUSEBUTTON QS_POSTMESSAGE QS_SENDMESSAGE QS_HOTKEY
154 
155     LIST_ENTRY WindowListHead;
156     LIST_ENTRY W32CallbackListHead;
157     SINGLE_LIST_ENTRY  ReferencesList;
158     ULONG cExclusiveLocks;
159 #if DBG
160     USHORT acExclusiveLockCount[GDIObjTypeTotal + 1];
161     UINT cRefObjectCo;
162 #endif
163 #endif // __cplusplus
164 } THREADINFO;
165 
166 
167 #define IntReferenceThreadInfo(pti) \
168     InterlockedIncrement(&(pti)->RefCount)
169 
170 VOID UserDeleteW32Thread(PTHREADINFO);
171 
172 #define IntDereferenceThreadInfo(pti) \
173 do { \
174     if (InterlockedDecrement(&(pti)->RefCount) == 0) \
175     { \
176         ASSERT(((pti)->TIF_flags & (TIF_INCLEANUP|TIF_DONTATTACHQUEUE)) == (TIF_INCLEANUP|TIF_DONTATTACHQUEUE)); \
177         UserDeleteW32Thread(pti); \
178     } \
179 } while(0)
180 
181 
182 #define IntReferenceProcessInfo(ppi) \
183     InterlockedIncrement((volatile LONG*)(&(ppi)->RefCount))
184 
185 VOID UserDeleteW32Process(_Pre_notnull_ __drv_freesMem(Mem) PPROCESSINFO);
186 
187 #define IntDereferenceProcessInfo(ppi) \
188 do { \
189     if (InterlockedDecrement((volatile LONG*)(&(ppi)->RefCount)) == 0) \
190     { \
191         ASSERT(((ppi)->W32PF_flags & W32PF_TERMINATED) != 0); \
192         UserDeleteW32Process(ppi); \
193     } \
194 } while(0)
195 
196 
197 typedef struct _W32HEAP_USER_MAPPING
198 {
199     struct _W32HEAP_USER_MAPPING* Next;
200     PVOID KernelMapping;
201     PVOID UserMapping;
202     ULONG_PTR Limit;
203     ULONG Count;
204 } W32HEAP_USER_MAPPING, *PW32HEAP_USER_MAPPING;
205 
206 
207 /*
208  * Information from STARTUPINFOW, psdk/winbase.h.
209  * Set from PsGetCurrentProcess()->Peb->ProcessParameters.
210  * See also: https://reactos.org/wiki/Techwiki:Win32k/PROCESSINFO
211 */
212 typedef struct tagUSERSTARTUPINFO
213 {
214     ULONG cb;
215     DWORD dwX;        // STARTF_USEPOSITION StartupInfo->dwX/Y
216     DWORD dwY;
217     DWORD dwXSize;    // STARTF_USESIZE StartupInfo->dwX/YSize
218     DWORD dwYSize;
219     DWORD dwFlags;    // STARTF_ StartupInfo->dwFlags
220     WORD wShowWindow; // StartupInfo->wShowWindow
221     USHORT cbReserved2;
222 } USERSTARTUPINFO, *PUSERSTARTUPINFO;
223 
224 typedef struct _W32PROCESS
225 {
226     PEPROCESS     peProcess;
227     DWORD         RefCount;
228     ULONG         W32PF_flags;
229     PKEVENT       InputIdleEvent;
230     DWORD         StartCursorHideTime;
231     struct _W32PROCESS* NextStart;
232     PVOID         pDCAttrList;
233     PVOID         pBrushAttrList;
234     DWORD         W32Pid;
235     LONG          GDIHandleCount;
236     LONG          UserHandleCount;
237     PEX_PUSH_LOCK GDIPushLock;  /* Locking Process during access to structure. */
238     RTL_AVL_TABLE GDIEngUserMemAllocTable;  /* Process AVL Table. */
239     LIST_ENTRY    GDIDcAttrFreeList;
240     LIST_ENTRY    GDIBrushAttrFreeList;
241 } W32PROCESS, *PW32PROCESS;
242 
243 #define CLIBS 32
244 
245 /*
246  * PROCESSINFO structure.
247  * See also: https://reactos.org/wiki/Techwiki:Win32k/PROCESSINFO
248  */
249 #ifdef __cplusplus
250 typedef struct _PROCESSINFO : _W32PROCESS
251 {
252 #else
253 typedef struct _PROCESSINFO
254 {
255     W32PROCESS;
256 #endif
257     PTHREADINFO ptiList;
258     PTHREADINFO ptiMainThread;
259     struct _DESKTOP* rpdeskStartup;
260     struct _CLS *pclsPrivateList;
261     struct _CLS *pclsPublicList;
262     PPROCESSINFO ppiNext;
263     INT cThreads;
264     HDESK hdeskStartup;
265     DWORD dwhmodLibLoadedMask;
266     HANDLE ahmodLibLoaded[CLIBS];
267     struct _WINSTATION_OBJECT* prpwinsta;
268     HWINSTA hwinsta;
269     ACCESS_MASK amwinsta;
270     DWORD dwHotkey;
271     HMONITOR hMonitor;
272     UINT iClipSerialNumber;
273     struct _CURICON_OBJECT* pCursorCache;
274     PVOID pClientBase;
275     DWORD dwLpkEntryPoints;
276     PVOID pW32Job;
277     DWORD dwImeCompatFlags;
278     LUID luidSession;
279     USERSTARTUPINFO usi;
280     DWORD dwLayout;
281     DWORD dwRegisteredClasses;
282 
283     /* ReactOS */
284     FAST_MUTEX PrivateFontListLock;
285     LIST_ENTRY PrivateFontListHead;
286     LIST_ENTRY PrivateMemFontListHead;
287     UINT PrivateMemFontHandleCount;
288 
289     FAST_MUTEX DriverObjListLock;
290     LIST_ENTRY DriverObjListHead;
291     W32HEAP_USER_MAPPING HeapMappings;
292     struct _GDI_POOL* pPoolDcAttr;
293     struct _GDI_POOL* pPoolBrushAttr;
294     struct _GDI_POOL* pPoolRgnAttr;
295 
296 #if DBG
297     BYTE DbgChannelLevel[DbgChCount];
298 #ifndef __cplusplus
299     DWORD DbgHandleCount[TYPE_CTYPES];
300 #endif // __cplusplus
301 #endif // DBG
302 } PROCESSINFO;
303 
304 #if DBG
305 void NTAPI UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments);
306 ULONG_PTR NTAPI UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult);
307 #endif
308 
309 /* Helper function used by some wine code */
310 
311 __forceinline
312 int
lstrlenW(_In_ LPCWSTR lpString)313 lstrlenW(
314     _In_ LPCWSTR lpString)
315 {
316     size_t size = wcslen(lpString);
317     if (size > ULONG_MAX) __fastfail(FAST_FAIL_RANGE_CHECK_FAILURE);
318     return (int)size;
319 }
320 
321 #define strlenW lstrlenW
322