1 /**
2  * This file is part of the mingw-w64 runtime package.
3  * No warranty is given; refer to the file DISCLAIMER within this package.
4  */
5 #ifndef _PROCESSTHREADSAPI_H_
6 #define _PROCESSTHREADSAPI_H_
7 
8 #include <apiset.h>
9 #include <apisetcconv.h>
10 #include <minwindef.h>
11 #include <minwinbase.h>
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 #ifndef FLS_OUT_OF_INDEXES
18 #define FLS_OUT_OF_INDEXES ((DWORD)0xffffffff)
19 #endif
20 
21 #define TLS_OUT_OF_INDEXES ((DWORD)0xffffffff)
22 
23 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) || _WIN32_WINNT >= _WIN32_WINNT_WIN10
24   WINBASEAPI HANDLE WINAPI OpenProcess (DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwProcessId);
25 
26   WINBASEAPI DWORD WINAPI QueueUserAPC (PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData);
27   WINBASEAPI WINBOOL WINAPI GetProcessTimes (HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime);
28   WINBASEAPI DECLSPEC_NORETURN VOID WINAPI ExitProcess (UINT uExitCode);
29   WINBASEAPI WINBOOL WINAPI GetExitCodeProcess (HANDLE hProcess, LPDWORD lpExitCode);
30   WINBASEAPI WINBOOL WINAPI SwitchToThread (VOID);
31   WINBASEAPI HANDLE WINAPI OpenThread (DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwThreadId);
32   WINBASEAPI WINBOOL WINAPI SetThreadPriorityBoost (HANDLE hThread, WINBOOL bDisablePriorityBoost);
33   WINBASEAPI WINBOOL WINAPI GetThreadPriorityBoost (HANDLE hThread, PBOOL pDisablePriorityBoost);
34   WINADVAPI WINBOOL APIENTRY SetThreadToken (PHANDLE Thread, HANDLE Token);
35   WINADVAPI WINBOOL WINAPI OpenProcessToken (HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
36   WINADVAPI WINBOOL WINAPI OpenThreadToken (HANDLE ThreadHandle, DWORD DesiredAccess, WINBOOL OpenAsSelf, PHANDLE TokenHandle);
37   WINBASEAPI WINBOOL WINAPI SetPriorityClass (HANDLE hProcess, DWORD dwPriorityClass);
38   WINBASEAPI DWORD WINAPI GetPriorityClass (HANDLE hProcess);
39   WINBASEAPI DWORD WINAPI GetProcessId (HANDLE Process);
40   WINBASEAPI DWORD WINAPI GetThreadId (HANDLE Thread);
41   WINBASEAPI WINBOOL WINAPI GetThreadContext (HANDLE hThread, LPCONTEXT lpContext);
42   WINBASEAPI WINBOOL WINAPI FlushInstructionCache (HANDLE hProcess, LPCVOID lpBaseAddress, SIZE_T dwSize);
43   WINBASEAPI WINBOOL WINAPI GetThreadTimes (HANDLE hThread, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime);
44   WINBASEAPI DWORD WINAPI GetCurrentProcessorNumber (VOID);
45 
46 #endif
47 
48 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
49   WINBASEAPI WINBOOL WINAPI TerminateProcess (HANDLE hProcess, UINT uExitCode);
50 
51   typedef struct _STARTUPINFOA {
52     DWORD cb;
53     LPSTR lpReserved;
54     LPSTR lpDesktop;
55     LPSTR lpTitle;
56     DWORD dwX;
57     DWORD dwY;
58     DWORD dwXSize;
59     DWORD dwYSize;
60     DWORD dwXCountChars;
61     DWORD dwYCountChars;
62     DWORD dwFillAttribute;
63     DWORD dwFlags;
64     WORD wShowWindow;
65     WORD cbReserved2;
66     LPBYTE lpReserved2;
67     HANDLE hStdInput;
68     HANDLE hStdOutput;
69     HANDLE hStdError;
70   } STARTUPINFOA, *LPSTARTUPINFOA;
71 
72   typedef struct _STARTUPINFOW {
73     DWORD cb;
74     LPWSTR lpReserved;
75     LPWSTR lpDesktop;
76     LPWSTR lpTitle;
77     DWORD dwX;
78     DWORD dwY;
79     DWORD dwXSize;
80     DWORD dwYSize;
81     DWORD dwXCountChars;
82     DWORD dwYCountChars;
83     DWORD dwFillAttribute;
84     DWORD dwFlags;
85     WORD wShowWindow;
86     WORD cbReserved2;
87     LPBYTE lpReserved2;
88     HANDLE hStdInput;
89     HANDLE hStdOutput;
90     HANDLE hStdError;
91   } STARTUPINFOW, *LPSTARTUPINFOW;
92 
93   __MINGW_TYPEDEF_AW(STARTUPINFO)
94   __MINGW_TYPEDEF_AW(LPSTARTUPINFO)
95 
96   typedef struct _PROCESS_INFORMATION {
97     HANDLE hProcess;
98     HANDLE hThread;
99     DWORD dwProcessId;
100     DWORD dwThreadId;
101   } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
102 #endif
103 
104 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
105 
106   typedef struct _PROC_THREAD_ATTRIBUTE_LIST *PPROC_THREAD_ATTRIBUTE_LIST, *LPPROC_THREAD_ATTRIBUTE_LIST;
107 
108   WINBASEAPI HANDLE WINAPI CreateRemoteThread (HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
109   WINBASEAPI WINBOOL WINAPI TerminateThread (HANDLE hThread, DWORD dwExitCode);
110   WINBASEAPI WINBOOL WINAPI SetProcessShutdownParameters (DWORD dwLevel, DWORD dwFlags);
111   WINBASEAPI DWORD WINAPI GetProcessVersion (DWORD ProcessId);
112   WINBASEAPI VOID WINAPI GetStartupInfoW (LPSTARTUPINFOW lpStartupInfo);
113   WINBASEAPI WINBOOL WINAPI SetThreadStackGuarantee (PULONG StackSizeInBytes);
114   WINBASEAPI WINBOOL WINAPI ProcessIdToSessionId (DWORD dwProcessId, DWORD *pSessionId);
115   WINBASEAPI HANDLE WINAPI CreateRemoteThreadEx (HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, LPDWORD lpThreadId);
116   WINBASEAPI WINBOOL WINAPI SetThreadContext (HANDLE hThread, CONST CONTEXT *lpContext);
117   WINBASEAPI WINBOOL WINAPI GetProcessHandleCount (HANDLE hProcess, PDWORD pdwHandleCount);
118 
119 #ifdef UNICODE
120 #define GetStartupInfo GetStartupInfoW
121 #endif
122 
123 #ifndef _APISET_EXPORTS_FILTER
124   WINADVAPI WINBOOL WINAPI CreateProcessAsUserW (HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
125 
126 #ifdef UNICODE
127 #define CreateProcessAsUser CreateProcessAsUserW
128 #endif
129 #endif
130 
131 #if _WIN32_WINNT >= 0x0600
132 #define PROCESS_AFFINITY_ENABLE_AUTO_UPDATE __MSABI_LONG(0x1U)
133 #define PROC_THREAD_ATTRIBUTE_REPLACE_VALUE 0x00000001
134 
135   WINBASEAPI DWORD WINAPI GetProcessIdOfThread (HANDLE Thread);
136   WINBASEAPI WINBOOL WINAPI InitializeProcThreadAttributeList (LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, DWORD dwAttributeCount, DWORD dwFlags, PSIZE_T lpSize);
137   WINBASEAPI VOID WINAPI DeleteProcThreadAttributeList (LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList);
138   WINBASEAPI WINBOOL WINAPI SetProcessAffinityUpdateMode (HANDLE hProcess, DWORD dwFlags);
139   WINBASEAPI WINBOOL WINAPI QueryProcessAffinityUpdateMode (HANDLE hProcess, LPDWORD lpdwFlags);
140   WINBASEAPI WINBOOL WINAPI UpdateProcThreadAttribute (LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, DWORD dwFlags, DWORD_PTR Attribute, PVOID lpValue, SIZE_T cbSize, PVOID lpPreviousValue, PSIZE_T lpReturnSize);
141 #endif
142 #if _WIN32_WINNT >= 0x0602
143   WINBASEAPI WINBOOL WINAPI SetProcessMitigationPolicy (PROCESS_MITIGATION_POLICY MitigationPolicy, PVOID lpBuffer, SIZE_T dwLength);
144 
GetCurrentProcessToken(VOID)145   FORCEINLINE HANDLE GetCurrentProcessToken (VOID)
146   {
147     return (HANDLE)(LONG_PTR) (-4);
148   }
GetCurrentThreadToken(VOID)149   FORCEINLINE HANDLE GetCurrentThreadToken (VOID)
150   {
151     return (HANDLE)(LONG_PTR) (-5);
152   }
GetCurrentThreadEffectiveToken(VOID)153   FORCEINLINE HANDLE GetCurrentThreadEffectiveToken (VOID)
154   {
155     return (HANDLE)(LONG_PTR) (-6);
156   }
157 
158   typedef struct _MEMORY_PRIORITY_INFORMATION {
159     ULONG MemoryPriority;
160   } MEMORY_PRIORITY_INFORMATION, *PMEMORY_PRIORITY_INFORMATION;
161 #endif
162 
163 #define MEMORY_PRIORITY_VERY_LOW      1
164 #define MEMORY_PRIORITY_LOW           2
165 #define MEMORY_PRIORITY_MEDIUM        3
166 #define MEMORY_PRIORITY_BELOW_NORMAL  4
167 #define MEMORY_PRIORITY_NORMAL        5
168 
169 #endif
170 
171 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)
172 #ifndef _APISET_EXPORTS_FILTER
173   WINBASEAPI WINBOOL WINAPI CreateProcessA (LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
174   WINBASEAPI WINBOOL WINAPI CreateProcessW (LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
175 #define CreateProcess __MINGW_NAME_AW(CreateProcess)
176 
177   #if _WIN32_WINNT >= 0x0601
178   WINBASEAPI WINBOOL WINAPI GetThreadIdealProcessorEx (HANDLE hThread, PPROCESSOR_NUMBER lpIdealProcessor);
179   WINBASEAPI VOID WINAPI GetCurrentProcessorNumberEx (PPROCESSOR_NUMBER ProcNumber);
180 #endif
181 #if _WIN32_WINNT >= 0x0602
182   WINBASEAPI VOID WINAPI GetCurrentThreadStackLimits (PULONG_PTR LowLimit, PULONG_PTR HighLimit);
183   WINBASEAPI WINBOOL WINAPI GetProcessMitigationPolicy (HANDLE hProcess, PROCESS_MITIGATION_POLICY MitigationPolicy, PVOID lpBuffer, SIZE_T dwLength);
184 #endif
185 #endif
186 
187   WINBASEAPI HANDLE WINAPI GetCurrentProcess (VOID);
188   WINBASEAPI DWORD WINAPI GetCurrentProcessId (VOID);
189   WINBASEAPI HANDLE WINAPI GetCurrentThread (VOID);
190   WINBASEAPI DWORD WINAPI GetCurrentThreadId (VOID);
191   WINBOOL WINAPI IsProcessorFeaturePresent (DWORD ProcessorFeature);
192 #if _WIN32_WINNT >= 0x0600
193   WINBASEAPI VOID WINAPI FlushProcessWriteBuffers (VOID);
194 #endif
195   WINBASEAPI HANDLE WINAPI CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
196   WINBASEAPI WINBOOL WINAPI SetThreadPriority (HANDLE hThread, int nPriority);
197   WINBASEAPI int WINAPI GetThreadPriority (HANDLE hThread);
198   WINBASEAPI DECLSPEC_NORETURN VOID WINAPI ExitThread (DWORD dwExitCode);
199   WINBASEAPI WINBOOL WINAPI GetExitCodeThread (HANDLE hThread, LPDWORD lpExitCode);
200 #if _WIN32_WINNT >= 0x0A00
201   WINBASEAPI DWORD WINAPI QueueUserAPC (PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData);
202   WINBASEAPI WINBOOL WINAPI SwitchToThread (VOID);
203 #endif
204   WINBASEAPI DWORD WINAPI SuspendThread (HANDLE hThread);
205   WINBASEAPI DWORD WINAPI ResumeThread (HANDLE hThread);
206   WINBASEAPI DWORD WINAPI TlsAlloc (VOID);
207   WINBASEAPI LPVOID WINAPI TlsGetValue (DWORD dwTlsIndex);
208   WINBASEAPI WINBOOL WINAPI TlsSetValue (DWORD dwTlsIndex, LPVOID lpTlsValue);
209   WINBASEAPI WINBOOL WINAPI TlsFree (DWORD dwTlsIndex);
210 #if _WIN32_WINNT >= 0x0601
211   WINBASEAPI WINBOOL WINAPI SetThreadIdealProcessorEx (HANDLE hThread, PPROCESSOR_NUMBER lpIdealProcessor, PPROCESSOR_NUMBER lpPreviousIdealProcessor);
212 #endif
213 
214 #endif
215 
216 #ifdef __cplusplus
217 }
218 #endif
219 #endif
220