FreeRDP
Loading...
Searching...
No Matches
include/winpr/thread.h
1
20#ifndef WINPR_THREAD_H
21#define WINPR_THREAD_H
22
23#include <winpr/winpr.h>
24#include <winpr/wtypes.h>
25
26#include <winpr/spec.h>
27#include <winpr/handle.h>
28
29#ifdef __cplusplus
30extern "C"
31{
32#endif
33
34#ifndef _WIN32
35
36 typedef struct
37 {
38 DWORD cb;
39 LPSTR lpReserved;
40 LPSTR lpDesktop;
41 LPSTR lpTitle;
42 DWORD dwX;
43 DWORD dwY;
44 DWORD dwXSize;
45 DWORD dwYSize;
46 DWORD dwXCountChars;
47 DWORD dwYCountChars;
48 DWORD dwFillAttribute;
49 DWORD dwFlags;
50 WORD wShowWindow;
51 WORD cbReserved2;
52 LPBYTE lpReserved2;
53 HANDLE hStdInput;
54 HANDLE hStdOutput;
55 HANDLE hStdError;
57
58 typedef struct
59 {
60 DWORD cb;
61 LPWSTR lpReserved;
62 LPWSTR lpDesktop;
63 LPWSTR lpTitle;
64 DWORD dwX;
65 DWORD dwY;
66 DWORD dwXSize;
67 DWORD dwYSize;
68 DWORD dwXCountChars;
69 DWORD dwYCountChars;
70 DWORD dwFillAttribute;
71 DWORD dwFlags;
72 WORD wShowWindow;
73 WORD cbReserved2;
74 LPBYTE lpReserved2;
75 HANDLE hStdInput;
76 HANDLE hStdOutput;
77 HANDLE hStdError;
79
80#ifdef UNICODE
83#else
86#endif
87
88#define STARTF_USESHOWWINDOW 0x00000001
89#define STARTF_USESIZE 0x00000002
90#define STARTF_USEPOSITION 0x00000004
91#define STARTF_USECOUNTCHARS 0x00000008
92#define STARTF_USEFILLATTRIBUTE 0x00000010
93#define STARTF_RUNFULLSCREEN 0x00000020
94#define STARTF_FORCEONFEEDBACK 0x00000040
95#define STARTF_FORCEOFFFEEDBACK 0x00000080
96#define STARTF_USESTDHANDLES 0x00000100
97#define STARTF_USEHOTKEY 0x00000200
98#define STARTF_TITLEISLINKNAME 0x00000800
99#define STARTF_TITLEISAPPID 0x00001000
100#define STARTF_PREVENTPINNING 0x00002000
101
102 /* Process */
103
104#define LOGON_WITH_PROFILE 0x00000001
105#define LOGON_NETCREDENTIALS_ONLY 0x00000002
106#define LOGON_ZERO_PASSWORD_BUFFER 0x80000000
107
108 WINPR_ATTR_NODISCARD
109 WINPR_API BOOL CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine,
110 LPSECURITY_ATTRIBUTES lpProcessAttributes,
111 LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles,
112 DWORD dwCreationFlags, LPVOID lpEnvironment,
113 LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
114 LPPROCESS_INFORMATION lpProcessInformation);
115
116 WINPR_ATTR_NODISCARD
117 WINPR_API BOOL CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine,
118 LPSECURITY_ATTRIBUTES lpProcessAttributes,
119 LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles,
120 DWORD dwCreationFlags, LPVOID lpEnvironment,
121 LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo,
122 LPPROCESS_INFORMATION lpProcessInformation);
123
124 WINPR_ATTR_NODISCARD
125 WINPR_API BOOL CreateProcessAsUserA(HANDLE hToken, LPCSTR lpApplicationName,
126 LPSTR lpCommandLine,
127 LPSECURITY_ATTRIBUTES lpProcessAttributes,
128 LPSECURITY_ATTRIBUTES lpThreadAttributes,
129 BOOL bInheritHandles, DWORD dwCreationFlags,
130 LPVOID lpEnvironment, LPCSTR lpCurrentDirectory,
131 LPSTARTUPINFOA lpStartupInfo,
132 LPPROCESS_INFORMATION lpProcessInformation);
133
134 WINPR_ATTR_NODISCARD
135 WINPR_API BOOL CreateProcessAsUserW(HANDLE hToken, LPCWSTR lpApplicationName,
136 LPWSTR lpCommandLine,
137 LPSECURITY_ATTRIBUTES lpProcessAttributes,
138 LPSECURITY_ATTRIBUTES lpThreadAttributes,
139 BOOL bInheritHandles, DWORD dwCreationFlags,
140 LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory,
141 LPSTARTUPINFOW lpStartupInfo,
142 LPPROCESS_INFORMATION lpProcessInformation);
143
144 WINPR_ATTR_NODISCARD
145 WINPR_API BOOL CreateProcessWithLogonA(LPCSTR lpUsername, LPCSTR lpDomain, LPCSTR lpPassword,
146 DWORD dwLogonFlags, LPCSTR lpApplicationName,
147 LPSTR lpCommandLine, DWORD dwCreationFlags,
148 LPVOID lpEnvironment, LPCSTR lpCurrentDirectory,
149 LPSTARTUPINFOA lpStartupInfo,
150 LPPROCESS_INFORMATION lpProcessInformation);
151
152 WINPR_ATTR_NODISCARD
153 WINPR_API BOOL CreateProcessWithLogonW(LPCWSTR lpUsername, LPCWSTR lpDomain, LPCWSTR lpPassword,
154 DWORD dwLogonFlags, LPCWSTR lpApplicationName,
155 LPWSTR lpCommandLine, DWORD dwCreationFlags,
156 LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory,
157 LPSTARTUPINFOW lpStartupInfo,
158 LPPROCESS_INFORMATION lpProcessInformation);
159
160 WINPR_ATTR_NODISCARD
161 WINPR_API BOOL CreateProcessWithTokenA(HANDLE hToken, DWORD dwLogonFlags,
162 LPCSTR lpApplicationName, LPSTR lpCommandLine,
163 DWORD dwCreationFlags, LPVOID lpEnvironment,
164 LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
165 LPPROCESS_INFORMATION lpProcessInformation);
166
167 WINPR_ATTR_NODISCARD
168 WINPR_API BOOL CreateProcessWithTokenW(HANDLE hToken, DWORD dwLogonFlags,
169 LPCWSTR lpApplicationName, LPWSTR lpCommandLine,
170 DWORD dwCreationFlags, LPVOID lpEnvironment,
171 LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo,
172 LPPROCESS_INFORMATION lpProcessInformation);
173
174#ifdef UNICODE
175#define CreateProcess CreateProcessW
176#define CreateProcessAsUser CreateProcessAsUserW
177#define CreateProcessWithLogon CreateProcessWithLogonW
178#define CreateProcessWithToken CreateProcessWithTokenW
179#else
180#define CreateProcess CreateProcessA
181#define CreateProcessAsUser CreateProcessAsUserA
182#define CreateProcessWithLogon CreateProcessWithLogonA
183#define CreateProcessWithToken CreateProcessWithTokenA
184#endif
185
186 DECLSPEC_NORETURN WINPR_API VOID ExitProcess(UINT uExitCode);
187 WINPR_ATTR_NODISCARD
188 WINPR_API BOOL GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode);
189
190 WINPR_PRAGMA_DIAG_PUSH
191 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
192
193 // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
194 WINPR_ATTR_NODISCARD
195 WINPR_API HANDLE _GetCurrentProcess(void);
196
197 WINPR_PRAGMA_DIAG_POP
198
199 WINPR_ATTR_NODISCARD
200 WINPR_API DWORD GetCurrentProcessId(void);
201
202 WINPR_API BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);
203
204 /* Process Argument Vector Parsing */
205
206 WINPR_ATTR_NODISCARD
207 WINPR_API LPWSTR* CommandLineToArgvW(LPCWSTR lpCmdLine, int* pNumArgs);
208
209#ifdef UNICODE
210#define CommandLineToArgv CommandLineToArgvW
211#else
212#define CommandLineToArgv CommandLineToArgvA
213#endif
214
215 /* Thread */
216#define THREAD_MODE_BACKGROUND_BEGIN 0x00010000
217#define THREAD_MODE_BACKGROUND_END 0x00020000
224#define THREAD_PRIORITY_ABOVE_NORMAL 1
225#define THREAD_PRIORITY_BELOW_NORMAL -1
226#define THREAD_PRIORITY_HIGHEST 2
227#define THREAD_PRIORITY_IDLE -15
228#define THREAD_PRIORITY_LOWEST -2
229#define THREAD_PRIORITY_NORMAL 0
230#define THREAD_PRIORITY_TIME_CRITICAL 15
241 WINPR_ATTR_NODISCARD
242 WINPR_API BOOL SetThreadPriority(HANDLE hThread, int nPriority);
243
244#define CREATE_SUSPENDED 0x00000004
245#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000
246
247 WINPR_ATTR_MALLOC(CloseHandle, 1)
248 WINPR_ATTR_NODISCARD
249 WINPR_API HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, size_t dwStackSize,
250 LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
251 DWORD dwCreationFlags, LPDWORD lpThreadId);
252
253 WINPR_ATTR_MALLOC(CloseHandle, 1)
254 WINPR_ATTR_NODISCARD
255 WINPR_API HANDLE CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes,
256 size_t dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,
257 LPVOID lpParameter, DWORD dwCreationFlags,
258 LPDWORD lpThreadId);
259
260 WINPR_API VOID ExitThread(DWORD dwExitCode);
261 WINPR_ATTR_NODISCARD
262 WINPR_API BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
263
264 WINPR_PRAGMA_DIAG_PUSH
265 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
266 // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
267 WINPR_ATTR_NODISCARD
268 WINPR_API HANDLE _GetCurrentThread(void);
269 WINPR_PRAGMA_DIAG_POP
270
271 WINPR_ATTR_NODISCARD
272 WINPR_API DWORD GetCurrentThreadId(void);
273
274 typedef void (*PAPCFUNC)(ULONG_PTR Parameter);
275 WINPR_ATTR_NODISCARD
276 WINPR_API DWORD QueueUserAPC(PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData);
277
278 WINPR_API DWORD ResumeThread(HANDLE hThread);
279
280 WINPR_ATTR_NODISCARD
281 WINPR_API DWORD SuspendThread(HANDLE hThread);
282
283 WINPR_API BOOL SwitchToThread(void);
284
285 WINPR_API BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
286
287 /* Processor */
288
289 WINPR_ATTR_NODISCARD
290 WINPR_API DWORD GetCurrentProcessorNumber(void);
291
292 /* Thread-Local Storage */
293
294#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
295
296 WINPR_ATTR_NODISCARD
297 WINPR_API DWORD TlsAlloc(void);
298
299 WINPR_ATTR_NODISCARD
300 WINPR_API LPVOID TlsGetValue(DWORD dwTlsIndex);
301
302 WINPR_ATTR_NODISCARD
303 WINPR_API BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue);
304
305 WINPR_ATTR_NODISCARD
306 WINPR_API BOOL TlsFree(DWORD dwTlsIndex);
307
308#else
309
310/*
311 * GetCurrentProcess / GetCurrentThread cause a conflict on Mac OS X
312 */
313WINPR_PRAGMA_DIAG_PUSH
314WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
315
316#define _GetCurrentProcess GetCurrentProcess
317#define _GetCurrentThread GetCurrentThread
318
319WINPR_PRAGMA_DIAG_POP
320
321#endif
322
323 /* CommandLineToArgvA is not present in the original Windows API, WinPR always exports it */
324
325 WINPR_ATTR_NODISCARD
326 WINPR_API LPSTR* CommandLineToArgvA(LPCSTR lpCmdLine, int* pNumArgs);
327
328 WINPR_API VOID DumpThreadHandles(void);
329
330#ifdef __cplusplus
331}
332#endif
333
334#endif /* WINPR_THREAD_H */