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
93 typedef struct WINPR_PROC_THREAD_ATTRIBUTE_LIST* LPPROC_THREAD_ATTRIBUTE_LIST;
94
100#define PROC_THREAD_ATTRIBUTE_HANDLE_LIST 0x00020002
101
102 typedef struct
103 {
104 STARTUPINFOA StartupInfo;
105 LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;
107
108 typedef struct
109 {
110 STARTUPINFOW StartupInfo;
111 LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;
113
114#ifdef UNICODE
117#else
120#endif
121
126 WINPR_ATTR_NODISCARD
127 WINPR_API BOOL InitializeProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
128 DWORD dwAttributeCount, DWORD dwFlags,
129 PSIZE_T lpSize);
130
132 WINPR_ATTR_NODISCARD
133 WINPR_API BOOL UpdateProcThreadAttribute(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
134 DWORD dwFlags, DWORD_PTR Attribute, PVOID lpValue,
135 SIZE_T cbSize, PVOID lpPreviousValue,
136 PSIZE_T lpReturnSize);
137
139 WINPR_API VOID DeleteProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList);
140
141#define STARTF_USESHOWWINDOW 0x00000001
142#define STARTF_USESIZE 0x00000002
143#define STARTF_USEPOSITION 0x00000004
144#define STARTF_USECOUNTCHARS 0x00000008
145#define STARTF_USEFILLATTRIBUTE 0x00000010
146#define STARTF_RUNFULLSCREEN 0x00000020
147#define STARTF_FORCEONFEEDBACK 0x00000040
148#define STARTF_FORCEOFFFEEDBACK 0x00000080
149#define STARTF_USESTDHANDLES 0x00000100
150#define STARTF_USEHOTKEY 0x00000200
151#define STARTF_TITLEISLINKNAME 0x00000800
152#define STARTF_TITLEISAPPID 0x00001000
153#define STARTF_PREVENTPINNING 0x00002000
154
155 /* Process */
156
157#define LOGON_WITH_PROFILE 0x00000001
158#define LOGON_NETCREDENTIALS_ONLY 0x00000002
159#define LOGON_ZERO_PASSWORD_BUFFER 0x80000000
160
163#define EXTENDED_STARTUPINFO_PRESENT 0x00080000
164
165 WINPR_ATTR_NODISCARD
166 WINPR_API BOOL CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine,
167 LPSECURITY_ATTRIBUTES lpProcessAttributes,
168 LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles,
169 DWORD dwCreationFlags, LPVOID lpEnvironment,
170 LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
171 LPPROCESS_INFORMATION lpProcessInformation);
172
173 WINPR_ATTR_NODISCARD
174 WINPR_API BOOL CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine,
175 LPSECURITY_ATTRIBUTES lpProcessAttributes,
176 LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles,
177 DWORD dwCreationFlags, LPVOID lpEnvironment,
178 LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo,
179 LPPROCESS_INFORMATION lpProcessInformation);
180
181 WINPR_ATTR_NODISCARD
182 WINPR_API BOOL CreateProcessAsUserA(HANDLE hToken, LPCSTR lpApplicationName,
183 LPSTR lpCommandLine,
184 LPSECURITY_ATTRIBUTES lpProcessAttributes,
185 LPSECURITY_ATTRIBUTES lpThreadAttributes,
186 BOOL bInheritHandles, DWORD dwCreationFlags,
187 LPVOID lpEnvironment, LPCSTR lpCurrentDirectory,
188 LPSTARTUPINFOA lpStartupInfo,
189 LPPROCESS_INFORMATION lpProcessInformation);
190
191 WINPR_ATTR_NODISCARD
192 WINPR_API BOOL CreateProcessAsUserW(HANDLE hToken, LPCWSTR lpApplicationName,
193 LPWSTR lpCommandLine,
194 LPSECURITY_ATTRIBUTES lpProcessAttributes,
195 LPSECURITY_ATTRIBUTES lpThreadAttributes,
196 BOOL bInheritHandles, DWORD dwCreationFlags,
197 LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory,
198 LPSTARTUPINFOW lpStartupInfo,
199 LPPROCESS_INFORMATION lpProcessInformation);
200
201 WINPR_ATTR_NODISCARD
202 WINPR_API BOOL CreateProcessWithLogonA(LPCSTR lpUsername, LPCSTR lpDomain, LPCSTR lpPassword,
203 DWORD dwLogonFlags, LPCSTR lpApplicationName,
204 LPSTR lpCommandLine, DWORD dwCreationFlags,
205 LPVOID lpEnvironment, LPCSTR lpCurrentDirectory,
206 LPSTARTUPINFOA lpStartupInfo,
207 LPPROCESS_INFORMATION lpProcessInformation);
208
209 WINPR_ATTR_NODISCARD
210 WINPR_API BOOL CreateProcessWithLogonW(LPCWSTR lpUsername, LPCWSTR lpDomain, LPCWSTR lpPassword,
211 DWORD dwLogonFlags, LPCWSTR lpApplicationName,
212 LPWSTR lpCommandLine, DWORD dwCreationFlags,
213 LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory,
214 LPSTARTUPINFOW lpStartupInfo,
215 LPPROCESS_INFORMATION lpProcessInformation);
216
217 WINPR_ATTR_NODISCARD
218 WINPR_API BOOL CreateProcessWithTokenA(HANDLE hToken, DWORD dwLogonFlags,
219 LPCSTR lpApplicationName, LPSTR lpCommandLine,
220 DWORD dwCreationFlags, LPVOID lpEnvironment,
221 LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
222 LPPROCESS_INFORMATION lpProcessInformation);
223
224 WINPR_ATTR_NODISCARD
225 WINPR_API BOOL CreateProcessWithTokenW(HANDLE hToken, DWORD dwLogonFlags,
226 LPCWSTR lpApplicationName, LPWSTR lpCommandLine,
227 DWORD dwCreationFlags, LPVOID lpEnvironment,
228 LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo,
229 LPPROCESS_INFORMATION lpProcessInformation);
230
231#ifdef UNICODE
232#define CreateProcess CreateProcessW
233#define CreateProcessAsUser CreateProcessAsUserW
234#define CreateProcessWithLogon CreateProcessWithLogonW
235#define CreateProcessWithToken CreateProcessWithTokenW
236#else
237#define CreateProcess CreateProcessA
238#define CreateProcessAsUser CreateProcessAsUserA
239#define CreateProcessWithLogon CreateProcessWithLogonA
240#define CreateProcessWithToken CreateProcessWithTokenA
241#endif
242
243 DECLSPEC_NORETURN WINPR_API VOID ExitProcess(UINT uExitCode);
244 WINPR_ATTR_NODISCARD
245 WINPR_API BOOL GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode);
246
247 WINPR_PRAGMA_DIAG_PUSH
248 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
249
250 // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
251 WINPR_ATTR_NODISCARD
252 WINPR_API HANDLE _GetCurrentProcess(void);
253
254 WINPR_PRAGMA_DIAG_POP
255
256 WINPR_ATTR_NODISCARD
257 WINPR_API DWORD GetCurrentProcessId(void);
258
259 WINPR_API BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);
260
261 /* Process Argument Vector Parsing */
262
263 WINPR_ATTR_NODISCARD
264 WINPR_API LPWSTR* CommandLineToArgvW(LPCWSTR lpCmdLine, int* pNumArgs);
265
266#ifdef UNICODE
267#define CommandLineToArgv CommandLineToArgvW
268#else
269#define CommandLineToArgv CommandLineToArgvA
270#endif
271
272 /* Thread */
273#define THREAD_MODE_BACKGROUND_BEGIN 0x00010000
274#define THREAD_MODE_BACKGROUND_END 0x00020000
281#define THREAD_PRIORITY_ABOVE_NORMAL 1
282#define THREAD_PRIORITY_BELOW_NORMAL -1
283#define THREAD_PRIORITY_HIGHEST 2
284#define THREAD_PRIORITY_IDLE -15
285#define THREAD_PRIORITY_LOWEST -2
286#define THREAD_PRIORITY_NORMAL 0
287#define THREAD_PRIORITY_TIME_CRITICAL 15
298 WINPR_ATTR_NODISCARD
299 WINPR_API BOOL SetThreadPriority(HANDLE hThread, int nPriority);
300
301#define CREATE_SUSPENDED 0x00000004
302#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000
303
304 WINPR_ATTR_MALLOC(CloseHandle, 1)
305 WINPR_ATTR_NODISCARD
306 WINPR_API HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, size_t dwStackSize,
307 LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
308 DWORD dwCreationFlags, LPDWORD lpThreadId);
309
310 WINPR_ATTR_MALLOC(CloseHandle, 1)
311 WINPR_ATTR_NODISCARD
312 WINPR_API HANDLE CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes,
313 size_t dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,
314 LPVOID lpParameter, DWORD dwCreationFlags,
315 LPDWORD lpThreadId);
316
317 WINPR_API VOID ExitThread(DWORD dwExitCode);
318 WINPR_ATTR_NODISCARD
319 WINPR_API BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
320
321 WINPR_PRAGMA_DIAG_PUSH
322 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
323 // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
324 WINPR_ATTR_NODISCARD
325 WINPR_API HANDLE _GetCurrentThread(void);
326 WINPR_PRAGMA_DIAG_POP
327
328 WINPR_ATTR_NODISCARD
329 WINPR_API DWORD GetCurrentThreadId(void);
330
331 typedef void (*PAPCFUNC)(ULONG_PTR Parameter);
332 WINPR_ATTR_NODISCARD
333 WINPR_API DWORD QueueUserAPC(PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData);
334
335 WINPR_API DWORD ResumeThread(HANDLE hThread);
336
337 WINPR_ATTR_NODISCARD
338 WINPR_API DWORD SuspendThread(HANDLE hThread);
339
340 WINPR_API BOOL SwitchToThread(void);
341
342 WINPR_API BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
343
344 /* Processor */
345
346 WINPR_ATTR_NODISCARD
347 WINPR_API DWORD GetCurrentProcessorNumber(void);
348
349 /* Thread-Local Storage */
350
351#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
352#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
353
354 WINPR_DEPRECATED_VAR("[since 3.31.0]", WINPR_ATTR_NODISCARD WINPR_API DWORD TlsAlloc(void));
355
356 WINPR_DEPRECATED_VAR("[since 3.31.0]",
357 WINPR_ATTR_NODISCARD WINPR_API LPVOID TlsGetValue(DWORD dwTlsIndex));
358
359 WINPR_DEPRECATED_VAR("[since 3.31.0]",
360 WINPR_ATTR_NODISCARD WINPR_API BOOL TlsSetValue(DWORD dwTlsIndex,
361 LPVOID lpTlsValue));
362
363 WINPR_DEPRECATED_VAR("[since 3.31.0]",
364 WINPR_ATTR_NODISCARD WINPR_API BOOL TlsFree(DWORD dwTlsIndex));
365#endif
366
367#else
368
369/*
370 * GetCurrentProcess / GetCurrentThread cause a conflict on Mac OS X
371 */
372WINPR_PRAGMA_DIAG_PUSH
373WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
374
375#define _GetCurrentProcess GetCurrentProcess
376#define _GetCurrentThread GetCurrentThread
377
378WINPR_PRAGMA_DIAG_POP
379
380#endif
381
382 /* CommandLineToArgvA is not present in the original Windows API, WinPR always exports it */
383
384 WINPR_ATTR_NODISCARD
385 WINPR_API LPSTR* CommandLineToArgvA(LPCSTR lpCmdLine, int* pNumArgs);
386
387 WINPR_API VOID DumpThreadHandles(void);
388
389#ifdef __cplusplus
390}
391#endif
392
393#endif /* WINPR_THREAD_H */
opaque attribute list built by InitializeProcThreadAttributeList() / UpdateProcThreadAttribute(),...