1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms
6 //! ApiSet Contract for api-ms-win-core-processthreads-l1
7 use ctypes::{c_int, c_void};
8 use shared::basetsd::{DWORD_PTR, PSIZE_T, PULONG_PTR, SIZE_T, ULONG_PTR};
9 use shared::guiddef::LPCGUID;
10 use shared::minwindef::{
11     BOOL, DWORD, LPBYTE, LPCVOID, LPDWORD, LPFILETIME, LPVOID, PBOOL, PDWORD, PULONG, UINT, WORD
12 };
13 use um::minwinbase::{LPCONTEXT, LPSECURITY_ATTRIBUTES, LPTHREAD_START_ROUTINE};
14 use um::winnt::{
15     CONTEXT, HANDLE, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PAPCFUNC, PHANDLE, PPROCESSOR_NUMBER,
16     PROCESS_MITIGATION_POLICY, PVOID
17 };
18 STRUCT!{struct PROCESS_INFORMATION {
19     hProcess: HANDLE,
20     hThread: HANDLE,
21     dwProcessId: DWORD,
22     dwThreadId: DWORD,
23 }}
24 pub type PPROCESS_INFORMATION = *mut PROCESS_INFORMATION;
25 pub type LPPROCESS_INFORMATION = *mut PROCESS_INFORMATION;
26 STRUCT!{struct STARTUPINFOA {
27     cb: DWORD,
28     lpReserved: LPSTR,
29     lpDesktop: LPSTR,
30     lpTitle: LPSTR,
31     dwX: DWORD,
32     dwY: DWORD,
33     dwXSize: DWORD,
34     dwYSize: DWORD,
35     dwXCountChars: DWORD,
36     dwYCountChars: DWORD,
37     dwFillAttribute: DWORD,
38     dwFlags: DWORD,
39     wShowWindow: WORD,
40     cbReserved2: WORD,
41     lpReserved2: LPBYTE,
42     hStdInput: HANDLE,
43     hStdOutput: HANDLE,
44     hStdError: HANDLE,
45 }}
46 pub type LPSTARTUPINFOA = *mut STARTUPINFOA;
47 STRUCT!{struct STARTUPINFOW {
48     cb: DWORD,
49     lpReserved: LPWSTR,
50     lpDesktop: LPWSTR,
51     lpTitle: LPWSTR,
52     dwX: DWORD,
53     dwY: DWORD,
54     dwXSize: DWORD,
55     dwYSize: DWORD,
56     dwXCountChars: DWORD,
57     dwYCountChars: DWORD,
58     dwFillAttribute: DWORD,
59     dwFlags: DWORD,
60     wShowWindow: WORD,
61     cbReserved2: WORD,
62     lpReserved2: LPBYTE,
63     hStdInput: HANDLE,
64     hStdOutput: HANDLE,
65     hStdError: HANDLE,
66 }}
67 pub type LPSTARTUPINFOW = *mut STARTUPINFOW;
68 extern "system" {
QueueUserAPC( pfnAPC: PAPCFUNC, hThread: HANDLE, dwData: ULONG_PTR, ) -> DWORD69     pub fn QueueUserAPC(
70         pfnAPC: PAPCFUNC,
71         hThread: HANDLE,
72         dwData: ULONG_PTR,
73     ) -> DWORD;
GetProcessTimes( hProcess: HANDLE, lpCreationTime: LPFILETIME, lpExitTime: LPFILETIME, lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME, ) -> BOOL74     pub fn GetProcessTimes(
75         hProcess: HANDLE,
76         lpCreationTime: LPFILETIME,
77         lpExitTime: LPFILETIME,
78         lpKernelTime: LPFILETIME,
79         lpUserTime: LPFILETIME,
80     ) -> BOOL;
GetCurrentProcess() -> HANDLE81     pub fn GetCurrentProcess() -> HANDLE;
GetCurrentProcessId() -> DWORD82     pub fn GetCurrentProcessId() -> DWORD;
ExitProcess( uExitCode: UINT, )83     pub fn ExitProcess(
84         uExitCode: UINT,
85     );
TerminateProcess( hProcess: HANDLE, uExitCode: UINT, ) -> BOOL86     pub fn TerminateProcess(
87         hProcess: HANDLE,
88         uExitCode: UINT,
89     ) -> BOOL;
GetExitCodeProcess( hProcess: HANDLE, lpExitCode: LPDWORD, ) -> BOOL90     pub fn GetExitCodeProcess(
91         hProcess: HANDLE,
92         lpExitCode: LPDWORD,
93     ) -> BOOL;
SwitchToThread() -> BOOL94     pub fn SwitchToThread() -> BOOL;
CreateThread( lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD, lpThreadId: LPDWORD, ) -> HANDLE95     pub fn CreateThread(
96         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
97         dwStackSize: SIZE_T,
98         lpStartAddress: LPTHREAD_START_ROUTINE,
99         lpParameter: LPVOID,
100         dwCreationFlags: DWORD,
101         lpThreadId: LPDWORD,
102     ) -> HANDLE;
CreateRemoteThread( hProcess: HANDLE, lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD, lpThreadId: LPDWORD, ) -> HANDLE103     pub fn CreateRemoteThread(
104         hProcess: HANDLE,
105         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
106         dwStackSize: SIZE_T,
107         lpStartAddress: LPTHREAD_START_ROUTINE,
108         lpParameter: LPVOID,
109         dwCreationFlags: DWORD,
110         lpThreadId: LPDWORD,
111     ) -> HANDLE;
GetCurrentThread() -> HANDLE112     pub fn GetCurrentThread() -> HANDLE;
GetCurrentThreadId() -> DWORD113     pub fn GetCurrentThreadId() -> DWORD;
OpenThread( dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD, ) -> HANDLE114     pub fn OpenThread(
115         dwDesiredAccess: DWORD,
116         bInheritHandle: BOOL,
117         dwThreadId: DWORD,
118     ) -> HANDLE;
SetThreadPriority( hThread: HANDLE, nPriority: c_int, ) -> BOOL119     pub fn SetThreadPriority(
120         hThread: HANDLE,
121         nPriority: c_int,
122     ) -> BOOL;
SetThreadPriorityBoost( hThread: HANDLE, bDisablePriorityBoost: BOOL, ) -> BOOL123     pub fn SetThreadPriorityBoost(
124         hThread: HANDLE,
125         bDisablePriorityBoost: BOOL,
126     ) -> BOOL;
GetThreadPriorityBoost( hThread: HANDLE, pDisablePriorityBoost: PBOOL, ) -> BOOL127     pub fn GetThreadPriorityBoost(
128         hThread: HANDLE,
129         pDisablePriorityBoost: PBOOL,
130     ) -> BOOL;
GetThreadPriority( hThread: HANDLE, ) -> c_int131     pub fn GetThreadPriority(
132         hThread: HANDLE,
133     ) -> c_int;
ExitThread( dwExitCode: DWORD, )134     pub fn ExitThread(
135         dwExitCode: DWORD,
136     );
TerminateThread( hThread: HANDLE, dwExitCode: DWORD, ) -> BOOL137     pub fn TerminateThread(
138         hThread: HANDLE,
139         dwExitCode: DWORD,
140     ) -> BOOL;
GetExitCodeThread( hThread: HANDLE, lpExitCode: LPDWORD, ) -> BOOL141     pub fn GetExitCodeThread(
142         hThread: HANDLE,
143         lpExitCode: LPDWORD,
144     ) -> BOOL;
SuspendThread( hThread: HANDLE, ) -> DWORD145     pub fn SuspendThread(
146         hThread: HANDLE,
147     ) -> DWORD;
ResumeThread( hThread: HANDLE, ) -> DWORD148     pub fn ResumeThread(
149         hThread: HANDLE,
150     ) -> DWORD;
151 }
152 pub const TLS_OUT_OF_INDEXES: DWORD = 0xFFFFFFFF;
153 extern "system" {
TlsAlloc() -> DWORD154     pub fn TlsAlloc() -> DWORD;
TlsGetValue( dwTlsIndex: DWORD, ) -> LPVOID155     pub fn TlsGetValue(
156         dwTlsIndex: DWORD,
157     ) -> LPVOID;
TlsSetValue( dwTlsIndex: DWORD, lpTlsValue: LPVOID, ) -> BOOL158     pub fn TlsSetValue(
159         dwTlsIndex: DWORD,
160         lpTlsValue: LPVOID,
161     ) -> BOOL;
TlsFree( dwTlsIndex: DWORD, ) -> BOOL162     pub fn TlsFree(
163         dwTlsIndex: DWORD,
164     ) -> BOOL;
CreateProcessA( lpApplicationName: LPCSTR, lpCommandLine: LPSTR, lpProcessAttributes: LPSECURITY_ATTRIBUTES, lpThreadAttributes: LPSECURITY_ATTRIBUTES, bInheritHandles: BOOL, dwCreationFlags: DWORD, lpEnvironment: LPVOID, lpCurrentDirectory: LPCSTR, lpStartupInfo: LPSTARTUPINFOA, lpProcessInformation: LPPROCESS_INFORMATION, ) -> BOOL165     pub fn CreateProcessA(
166         lpApplicationName: LPCSTR,
167         lpCommandLine: LPSTR,
168         lpProcessAttributes: LPSECURITY_ATTRIBUTES,
169         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
170         bInheritHandles: BOOL,
171         dwCreationFlags: DWORD,
172         lpEnvironment: LPVOID,
173         lpCurrentDirectory: LPCSTR,
174         lpStartupInfo: LPSTARTUPINFOA,
175         lpProcessInformation: LPPROCESS_INFORMATION,
176     ) -> BOOL;
CreateProcessW( lpApplicationName: LPCWSTR, lpCommandLine: LPWSTR, lpProcessAttributes: LPSECURITY_ATTRIBUTES, lpThreadAttributes: LPSECURITY_ATTRIBUTES, bInheritHandles: BOOL, dwCreationFlags: DWORD, lpEnvironment: LPVOID, lpCurrentDirectory: LPCWSTR, lpStartupInfo: LPSTARTUPINFOW, lpProcessInformation: LPPROCESS_INFORMATION, ) -> BOOL177     pub fn CreateProcessW(
178         lpApplicationName: LPCWSTR,
179         lpCommandLine: LPWSTR,
180         lpProcessAttributes: LPSECURITY_ATTRIBUTES,
181         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
182         bInheritHandles: BOOL,
183         dwCreationFlags: DWORD,
184         lpEnvironment: LPVOID,
185         lpCurrentDirectory: LPCWSTR,
186         lpStartupInfo: LPSTARTUPINFOW,
187         lpProcessInformation: LPPROCESS_INFORMATION,
188     ) -> BOOL;
SetProcessShutdownParameters( dwLevel: DWORD, dwFlags: DWORD, ) -> BOOL189     pub fn SetProcessShutdownParameters(
190         dwLevel: DWORD,
191         dwFlags: DWORD,
192     ) -> BOOL;
GetProcessVersion( ProcessId: DWORD, ) -> DWORD193     pub fn GetProcessVersion(
194         ProcessId: DWORD,
195     ) -> DWORD;
GetStartupInfoW( lpStartupInfo: LPSTARTUPINFOW, )196     pub fn GetStartupInfoW(
197         lpStartupInfo: LPSTARTUPINFOW,
198     );
CreateProcessAsUserW( hToken: HANDLE, lpApplicationName: LPCWSTR, lpCommandLine: LPWSTR, lpProcessAttributes: LPSECURITY_ATTRIBUTES, lpThreadAttributes: LPSECURITY_ATTRIBUTES, bInheritHandles: BOOL, dwCreationFlags: DWORD, lpEnvironment: LPVOID, lpCurrentDirectory: LPCWSTR, lpStartupInfo: LPSTARTUPINFOW, lpProcessInformation: LPPROCESS_INFORMATION, ) -> BOOL199     pub fn CreateProcessAsUserW(
200         hToken: HANDLE,
201         lpApplicationName: LPCWSTR,
202         lpCommandLine: LPWSTR,
203         lpProcessAttributes: LPSECURITY_ATTRIBUTES,
204         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
205         bInheritHandles: BOOL,
206         dwCreationFlags: DWORD,
207         lpEnvironment: LPVOID,
208         lpCurrentDirectory: LPCWSTR,
209         lpStartupInfo: LPSTARTUPINFOW,
210         lpProcessInformation: LPPROCESS_INFORMATION,
211     ) -> BOOL;
212     // pub fn GetCurrentProcessToken();
213     // pub fn GetCurrentThreadToken();
214     // pub fn GetCurrentThreadEffectiveToken();
SetThreadToken( Thread: PHANDLE, Token: HANDLE, ) -> BOOL215     pub fn SetThreadToken(
216         Thread: PHANDLE,
217         Token: HANDLE,
218     ) -> BOOL;
OpenProcessToken( ProcessHandle: HANDLE, DesiredAccess: DWORD, TokenHandle: PHANDLE, ) -> BOOL219     pub fn OpenProcessToken(
220         ProcessHandle: HANDLE,
221         DesiredAccess: DWORD,
222         TokenHandle: PHANDLE,
223     ) -> BOOL;
OpenThreadToken( ThreadHandle: HANDLE, DesiredAccess: DWORD, OpenAsSelf: BOOL, TokenHandle: PHANDLE, ) -> BOOL224     pub fn OpenThreadToken(
225         ThreadHandle: HANDLE,
226         DesiredAccess: DWORD,
227         OpenAsSelf: BOOL,
228         TokenHandle: PHANDLE,
229     ) -> BOOL;
SetPriorityClass( hProcess: HANDLE, dwPriorityClass: DWORD, ) -> BOOL230     pub fn SetPriorityClass(
231         hProcess: HANDLE,
232         dwPriorityClass: DWORD,
233     ) -> BOOL;
SetThreadStackGuarantee( StackSizeInBytes: PULONG, ) -> BOOL234     pub fn SetThreadStackGuarantee(
235         StackSizeInBytes: PULONG,
236     ) -> BOOL;
GetPriorityClass( hProcess: HANDLE, ) -> DWORD237     pub fn GetPriorityClass(
238         hProcess: HANDLE,
239     ) -> DWORD;
ProcessIdToSessionId( dwProcessId: DWORD, pSessionId: *mut DWORD, ) -> BOOL240     pub fn ProcessIdToSessionId(
241         dwProcessId: DWORD,
242         pSessionId: *mut DWORD,
243     ) -> BOOL;
GetProcessId( Process: HANDLE, ) -> DWORD244     pub fn GetProcessId(
245         Process: HANDLE,
246     ) -> DWORD;
247 }
248 STRUCT!{struct PROC_THREAD_ATTRIBUTE_LIST {
249     dummy: *mut c_void,
250 }}
251 pub type PPROC_THREAD_ATTRIBUTE_LIST = *mut PROC_THREAD_ATTRIBUTE_LIST;
252 pub type LPPROC_THREAD_ATTRIBUTE_LIST = *mut PROC_THREAD_ATTRIBUTE_LIST;
253 extern "system" {
GetThreadId( Thread: HANDLE, ) -> DWORD254     pub fn GetThreadId(
255         Thread: HANDLE,
256     ) -> DWORD;
FlushProcessWriteBuffers()257     pub fn FlushProcessWriteBuffers();
GetProcessIdOfThread( Thread: HANDLE, ) -> DWORD258     pub fn GetProcessIdOfThread(
259         Thread: HANDLE,
260     ) -> DWORD;
InitializeProcThreadAttributeList( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwAttributeCount: DWORD, dwFlags: DWORD, lpSize: PSIZE_T, ) -> BOOL261     pub fn InitializeProcThreadAttributeList(
262         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
263         dwAttributeCount: DWORD,
264         dwFlags: DWORD,
265         lpSize: PSIZE_T,
266     ) -> BOOL;
DeleteProcThreadAttributeList( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, )267     pub fn DeleteProcThreadAttributeList(
268         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
269     );
SetProcessAffinityUpdateMode( hProcess: HANDLE, dwFlags: DWORD, ) -> BOOL270     pub fn SetProcessAffinityUpdateMode(
271         hProcess: HANDLE,
272         dwFlags: DWORD,
273     ) -> BOOL;
QueryProcessAffinityUpdateMode( hProcess: HANDLE, lpdwFlags: LPDWORD, ) -> BOOL274     pub fn QueryProcessAffinityUpdateMode(
275         hProcess: HANDLE,
276         lpdwFlags: LPDWORD,
277     ) -> BOOL;
UpdateProcThreadAttribute( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwFlags: DWORD, Attribute: DWORD_PTR, lpValue: PVOID, cbSize: SIZE_T, lpPreviousValue: PVOID, lpReturnSize: PSIZE_T, ) -> BOOL278     pub fn UpdateProcThreadAttribute(
279         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
280         dwFlags: DWORD,
281         Attribute: DWORD_PTR,
282         lpValue: PVOID,
283         cbSize: SIZE_T,
284         lpPreviousValue: PVOID,
285         lpReturnSize: PSIZE_T,
286     ) -> BOOL;
CreateRemoteThreadEx( hProcess: HANDLE, lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD, lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, lpThreadId: LPDWORD, ) -> HANDLE287     pub fn CreateRemoteThreadEx(
288         hProcess: HANDLE,
289         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
290         dwStackSize: SIZE_T,
291         lpStartAddress: LPTHREAD_START_ROUTINE,
292         lpParameter: LPVOID,
293         dwCreationFlags: DWORD,
294         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
295         lpThreadId: LPDWORD,
296     ) -> HANDLE;
GetCurrentThreadStackLimits( LowLimit: PULONG_PTR, HighLimit: PULONG_PTR, )297     pub fn GetCurrentThreadStackLimits(
298         LowLimit: PULONG_PTR,
299         HighLimit: PULONG_PTR,
300     );
GetThreadContext( hThread: HANDLE, lpContext: LPCONTEXT, ) -> BOOL301     pub fn GetThreadContext(
302         hThread: HANDLE,
303         lpContext: LPCONTEXT,
304     ) -> BOOL;
SetThreadContext( hThread: HANDLE, lpContext: *const CONTEXT, ) -> BOOL305     pub fn SetThreadContext(
306         hThread: HANDLE,
307         lpContext: *const CONTEXT,
308     ) -> BOOL;
SetProcessMitigationPolicy( MitigationPolicy: PROCESS_MITIGATION_POLICY, lpBuffer: PVOID, dwLength: SIZE_T, ) -> BOOL309     pub fn SetProcessMitigationPolicy(
310         MitigationPolicy: PROCESS_MITIGATION_POLICY,
311         lpBuffer: PVOID,
312         dwLength: SIZE_T,
313     ) -> BOOL;
GetProcessMitigationPolicy( hProcess: HANDLE, MitigationPolicy: PROCESS_MITIGATION_POLICY, lpBuffer: PVOID, dwLength: SIZE_T, ) -> BOOL314     pub fn GetProcessMitigationPolicy(
315         hProcess: HANDLE,
316         MitigationPolicy: PROCESS_MITIGATION_POLICY,
317         lpBuffer: PVOID,
318         dwLength: SIZE_T,
319     ) -> BOOL;
FlushInstructionCache( hProcess: HANDLE, lpBaseAddress: LPCVOID, dwSize: SIZE_T, ) -> BOOL320     pub fn FlushInstructionCache(
321         hProcess: HANDLE,
322         lpBaseAddress: LPCVOID,
323         dwSize: SIZE_T,
324     ) -> BOOL;
GetThreadTimes( hThread: HANDLE, lpCreationTime: LPFILETIME, lpExitTime: LPFILETIME, lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME, ) -> BOOL325     pub fn GetThreadTimes(
326         hThread: HANDLE,
327         lpCreationTime: LPFILETIME,
328         lpExitTime: LPFILETIME,
329         lpKernelTime: LPFILETIME,
330         lpUserTime: LPFILETIME,
331     ) -> BOOL;
OpenProcess( dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD, ) -> HANDLE332     pub fn OpenProcess(
333         dwDesiredAccess: DWORD,
334         bInheritHandle: BOOL,
335         dwProcessId: DWORD,
336     ) -> HANDLE;
IsProcessorFeaturePresent( ProcessorFeature: DWORD, ) -> BOOL337     pub fn IsProcessorFeaturePresent(
338         ProcessorFeature: DWORD,
339     ) -> BOOL;
GetProcessHandleCount( hProcess: HANDLE, pdwHandleCount: PDWORD, ) -> BOOL340     pub fn GetProcessHandleCount(
341         hProcess: HANDLE,
342         pdwHandleCount: PDWORD,
343     ) -> BOOL;
GetCurrentProcessorNumber() -> DWORD344     pub fn GetCurrentProcessorNumber() -> DWORD;
SetThreadIdealProcessorEx( hThread: HANDLE, lpIdealProcessor: PPROCESSOR_NUMBER, lpPreviousIdealProcessor: PPROCESSOR_NUMBER, ) -> BOOL345     pub fn SetThreadIdealProcessorEx(
346         hThread: HANDLE,
347         lpIdealProcessor: PPROCESSOR_NUMBER,
348         lpPreviousIdealProcessor: PPROCESSOR_NUMBER,
349     ) -> BOOL;
GetThreadIdealProcessorEx( hThread: HANDLE, lpIdealProcessor: PPROCESSOR_NUMBER, ) -> BOOL350     pub fn GetThreadIdealProcessorEx(
351         hThread: HANDLE,
352         lpIdealProcessor: PPROCESSOR_NUMBER,
353     ) -> BOOL;
GetCurrentProcessorNumberEx( ProcNumber: PPROCESSOR_NUMBER, )354     pub fn GetCurrentProcessorNumberEx(
355         ProcNumber: PPROCESSOR_NUMBER,
356     );
GetProcessPriorityBoost( hProcess: HANDLE, pDisablePriorityBoost: PBOOL, ) -> BOOL357     pub fn GetProcessPriorityBoost(
358         hProcess: HANDLE,
359         pDisablePriorityBoost: PBOOL,
360     ) -> BOOL;
SetProcessPriorityBoost( hProcess: HANDLE, bDisablePriorityBoost: BOOL, ) -> BOOL361     pub fn SetProcessPriorityBoost(
362         hProcess: HANDLE,
363         bDisablePriorityBoost: BOOL,
364     ) -> BOOL;
GetThreadIOPendingFlag( hThread: HANDLE, lpIOIsPending: PBOOL, ) -> BOOL365     pub fn GetThreadIOPendingFlag(
366         hThread: HANDLE,
367         lpIOIsPending: PBOOL,
368     ) -> BOOL;
GetSystemTimes( lpIdleTime: LPFILETIME, lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME, ) -> BOOL369     pub fn GetSystemTimes(
370         lpIdleTime: LPFILETIME,
371         lpKernelTime: LPFILETIME,
372         lpUserTime: LPFILETIME,
373     ) -> BOOL;
374 }
375 ENUM!{enum THREAD_INFORMATION_CLASS {
376     ThreadMemoryPriority,
377     ThreadAbsoluteCpuPriority,
378     ThreadInformationClassMax,
379 }}
380 // MEMORY_PRIORITY_INFORMATION
381 extern "system" {
GetThreadInformation( hThread: HANDLE, ThreadInformationClass: THREAD_INFORMATION_CLASS, ThreadInformation: LPVOID, ThreadInformationSize: DWORD, ) -> BOOL382     pub fn GetThreadInformation(
383         hThread: HANDLE,
384         ThreadInformationClass: THREAD_INFORMATION_CLASS,
385         ThreadInformation: LPVOID,
386         ThreadInformationSize: DWORD,
387     ) -> BOOL;
SetThreadInformation( hThread: HANDLE, ThreadInformationClass: THREAD_INFORMATION_CLASS, ThreadInformation: LPVOID, ThreadInformationSize: DWORD, ) -> BOOL388     pub fn SetThreadInformation(
389         hThread: HANDLE,
390         ThreadInformationClass: THREAD_INFORMATION_CLASS,
391         ThreadInformation: LPVOID,
392         ThreadInformationSize: DWORD,
393     ) -> BOOL;
IsProcessCritical( hProcess: HANDLE, Critical: PBOOL, ) -> BOOL394     pub fn IsProcessCritical(
395         hProcess: HANDLE,
396         Critical: PBOOL,
397     ) -> BOOL;
SetProtectedPolicy( PolicyGuid: LPCGUID, PolicyValue: ULONG_PTR, OldPolicyValue: PULONG_PTR, ) -> BOOL398     pub fn SetProtectedPolicy(
399         PolicyGuid: LPCGUID,
400         PolicyValue: ULONG_PTR,
401         OldPolicyValue: PULONG_PTR,
402     ) -> BOOL;
QueryProtectedPolicy( PolicyGuid: LPCGUID, PolicyValue: PULONG_PTR, ) -> BOOL403     pub fn QueryProtectedPolicy(
404         PolicyGuid: LPCGUID,
405         PolicyValue: PULONG_PTR,
406     ) -> BOOL;
SetThreadIdealProcessor( hThread: HANDLE, dwIdealProcessor: DWORD, ) -> DWORD407     pub fn SetThreadIdealProcessor(
408         hThread: HANDLE,
409         dwIdealProcessor: DWORD,
410     ) -> DWORD;
411 }
412 ENUM!{enum PROCESS_INFORMATION_CLASS {
413     ProcessMemoryPriority,
414     ProcessInformationClassMax,
415 }}
416 extern "system" {
SetProcessInformation( hProcess: HANDLE, ProcessInformationClass: PROCESS_INFORMATION_CLASS, ProcessInformation: LPVOID, ProcessInformationSize: DWORD, ) -> BOOL417     pub fn SetProcessInformation(
418         hProcess: HANDLE,
419         ProcessInformationClass: PROCESS_INFORMATION_CLASS,
420         ProcessInformation: LPVOID,
421         ProcessInformationSize: DWORD,
422     ) -> BOOL;
GetProcessInformation( hProcess: HANDLE, ProcessInformationClass: PROCESS_INFORMATION_CLASS, ProcessInformation: LPVOID, ProcessInformationSize: DWORD, ) -> BOOL423     pub fn GetProcessInformation(
424         hProcess: HANDLE,
425         ProcessInformationClass: PROCESS_INFORMATION_CLASS,
426         ProcessInformation: LPVOID,
427         ProcessInformationSize: DWORD,
428     ) -> BOOL;
429     // pub fn GetSystemCpuSetInformation();
430     // pub fn GetProcessDefaultCpuSets();
431     // pub fn SetProcessDefaultCpuSets();
432     // pub fn GetThreadSelectedCpuSets();
433     // pub fn SetThreadSelectedCpuSets();
434     // pub fn CreateProcessAsUserA();
GetProcessShutdownParameters( lpdwLevel: LPDWORD, lpdwFlags: LPDWORD, ) -> BOOL435     pub fn GetProcessShutdownParameters(
436         lpdwLevel: LPDWORD,
437         lpdwFlags: LPDWORD,
438     ) -> BOOL;
439     // pub fn SetThreadDescription();
440     // pub fn GetThreadDescription();
441 }
442