1 // Copyright © 2015-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms
7 //! ApiSet Contract for api-ms-win-core-processthreads-l1
8 use ctypes::{c_int, c_void};
9 use shared::basetsd::{DWORD_PTR, PSIZE_T, PULONG_PTR, SIZE_T, ULONG_PTR};
10 use shared::guiddef::LPCGUID;
11 use shared::minwindef::{
12     BOOL, DWORD, LPBYTE, LPCVOID, LPDWORD, LPFILETIME, LPVOID, PBOOL, PDWORD, PULONG, UINT, WORD
13 };
14 use um::minwinbase::{LPCONTEXT, LPSECURITY_ATTRIBUTES, LPTHREAD_START_ROUTINE};
15 use um::winnt::{
16     CONTEXT, HANDLE, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PAPCFUNC, PHANDLE, PPROCESSOR_NUMBER,
17     PROCESS_MITIGATION_POLICY, PVOID
18 };
19 STRUCT!{struct PROCESS_INFORMATION {
20     hProcess: HANDLE,
21     hThread: HANDLE,
22     dwProcessId: DWORD,
23     dwThreadId: DWORD,
24 }}
25 pub type PPROCESS_INFORMATION = *mut PROCESS_INFORMATION;
26 pub type LPPROCESS_INFORMATION = *mut PROCESS_INFORMATION;
27 STRUCT!{struct STARTUPINFOA {
28     cb: DWORD,
29     lpReserved: LPSTR,
30     lpDesktop: LPSTR,
31     lpTitle: LPSTR,
32     dwX: DWORD,
33     dwY: DWORD,
34     dwXSize: DWORD,
35     dwYSize: DWORD,
36     dwXCountChars: DWORD,
37     dwYCountChars: DWORD,
38     dwFillAttribute: DWORD,
39     dwFlags: DWORD,
40     wShowWindow: WORD,
41     cbReserved2: WORD,
42     lpReserved2: LPBYTE,
43     hStdInput: HANDLE,
44     hStdOutput: HANDLE,
45     hStdError: HANDLE,
46 }}
47 pub type LPSTARTUPINFOA = *mut STARTUPINFOA;
48 STRUCT!{struct STARTUPINFOW {
49     cb: DWORD,
50     lpReserved: LPWSTR,
51     lpDesktop: LPWSTR,
52     lpTitle: LPWSTR,
53     dwX: DWORD,
54     dwY: DWORD,
55     dwXSize: DWORD,
56     dwYSize: DWORD,
57     dwXCountChars: DWORD,
58     dwYCountChars: DWORD,
59     dwFillAttribute: DWORD,
60     dwFlags: DWORD,
61     wShowWindow: WORD,
62     cbReserved2: WORD,
63     lpReserved2: LPBYTE,
64     hStdInput: HANDLE,
65     hStdOutput: HANDLE,
66     hStdError: HANDLE,
67 }}
68 pub type LPSTARTUPINFOW = *mut STARTUPINFOW;
69 extern "system" {
QueueUserAPC( pfnAPC: PAPCFUNC, hThread: HANDLE, dwData: ULONG_PTR, ) -> DWORD70     pub fn QueueUserAPC(
71         pfnAPC: PAPCFUNC,
72         hThread: HANDLE,
73         dwData: ULONG_PTR,
74     ) -> DWORD;
GetProcessTimes( hProcess: HANDLE, lpCreationTime: LPFILETIME, lpExitTime: LPFILETIME, lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME, ) -> BOOL75     pub fn GetProcessTimes(
76         hProcess: HANDLE,
77         lpCreationTime: LPFILETIME,
78         lpExitTime: LPFILETIME,
79         lpKernelTime: LPFILETIME,
80         lpUserTime: LPFILETIME,
81     ) -> BOOL;
GetCurrentProcess() -> HANDLE82     pub fn GetCurrentProcess() -> HANDLE;
GetCurrentProcessId() -> DWORD83     pub fn GetCurrentProcessId() -> DWORD;
ExitProcess( uExitCode: UINT, )84     pub fn ExitProcess(
85         uExitCode: UINT,
86     );
TerminateProcess( hProcess: HANDLE, uExitCode: UINT, ) -> BOOL87     pub fn TerminateProcess(
88         hProcess: HANDLE,
89         uExitCode: UINT,
90     ) -> BOOL;
GetExitCodeProcess( hProcess: HANDLE, lpExitCode: LPDWORD, ) -> BOOL91     pub fn GetExitCodeProcess(
92         hProcess: HANDLE,
93         lpExitCode: LPDWORD,
94     ) -> BOOL;
SwitchToThread() -> BOOL95     pub fn SwitchToThread() -> BOOL;
CreateThread( lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD, lpThreadId: LPDWORD, ) -> HANDLE96     pub fn CreateThread(
97         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
98         dwStackSize: SIZE_T,
99         lpStartAddress: LPTHREAD_START_ROUTINE,
100         lpParameter: LPVOID,
101         dwCreationFlags: DWORD,
102         lpThreadId: LPDWORD,
103     ) -> HANDLE;
CreateRemoteThread( hProcess: HANDLE, lpThreadAttributes: LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: LPVOID, dwCreationFlags: DWORD, lpThreadId: LPDWORD, ) -> HANDLE104     pub fn CreateRemoteThread(
105         hProcess: HANDLE,
106         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
107         dwStackSize: SIZE_T,
108         lpStartAddress: LPTHREAD_START_ROUTINE,
109         lpParameter: LPVOID,
110         dwCreationFlags: DWORD,
111         lpThreadId: LPDWORD,
112     ) -> HANDLE;
GetCurrentThread() -> HANDLE113     pub fn GetCurrentThread() -> HANDLE;
GetCurrentThreadId() -> DWORD114     pub fn GetCurrentThreadId() -> DWORD;
OpenThread( dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD, ) -> HANDLE115     pub fn OpenThread(
116         dwDesiredAccess: DWORD,
117         bInheritHandle: BOOL,
118         dwThreadId: DWORD,
119     ) -> HANDLE;
SetThreadPriority( hThread: HANDLE, nPriority: c_int, ) -> BOOL120     pub fn SetThreadPriority(
121         hThread: HANDLE,
122         nPriority: c_int,
123     ) -> BOOL;
SetThreadPriorityBoost( hThread: HANDLE, bDisablePriorityBoost: BOOL, ) -> BOOL124     pub fn SetThreadPriorityBoost(
125         hThread: HANDLE,
126         bDisablePriorityBoost: BOOL,
127     ) -> BOOL;
GetThreadPriorityBoost( hThread: HANDLE, pDisablePriorityBoost: PBOOL, ) -> BOOL128     pub fn GetThreadPriorityBoost(
129         hThread: HANDLE,
130         pDisablePriorityBoost: PBOOL,
131     ) -> BOOL;
GetThreadPriority( hThread: HANDLE, ) -> c_int132     pub fn GetThreadPriority(
133         hThread: HANDLE,
134     ) -> c_int;
ExitThread( dwExitCode: DWORD, )135     pub fn ExitThread(
136         dwExitCode: DWORD,
137     );
TerminateThread( hThread: HANDLE, dwExitCode: DWORD, ) -> BOOL138     pub fn TerminateThread(
139         hThread: HANDLE,
140         dwExitCode: DWORD,
141     ) -> BOOL;
GetExitCodeThread( hThread: HANDLE, lpExitCode: LPDWORD, ) -> BOOL142     pub fn GetExitCodeThread(
143         hThread: HANDLE,
144         lpExitCode: LPDWORD,
145     ) -> BOOL;
SuspendThread( hThread: HANDLE, ) -> DWORD146     pub fn SuspendThread(
147         hThread: HANDLE,
148     ) -> DWORD;
ResumeThread( hThread: HANDLE, ) -> DWORD149     pub fn ResumeThread(
150         hThread: HANDLE,
151     ) -> DWORD;
152 }
153 pub const TLS_OUT_OF_INDEXES: DWORD = 0xFFFFFFFF;
154 extern "system" {
TlsAlloc() -> DWORD155     pub fn TlsAlloc() -> DWORD;
TlsGetValue( dwTlsIndex: DWORD, ) -> LPVOID156     pub fn TlsGetValue(
157         dwTlsIndex: DWORD,
158     ) -> LPVOID;
TlsSetValue( dwTlsIndex: DWORD, lpTlsValue: LPVOID, ) -> BOOL159     pub fn TlsSetValue(
160         dwTlsIndex: DWORD,
161         lpTlsValue: LPVOID,
162     ) -> BOOL;
TlsFree( dwTlsIndex: DWORD, ) -> BOOL163     pub fn TlsFree(
164         dwTlsIndex: DWORD,
165     ) -> 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, ) -> BOOL166     pub fn CreateProcessA(
167         lpApplicationName: LPCSTR,
168         lpCommandLine: LPSTR,
169         lpProcessAttributes: LPSECURITY_ATTRIBUTES,
170         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
171         bInheritHandles: BOOL,
172         dwCreationFlags: DWORD,
173         lpEnvironment: LPVOID,
174         lpCurrentDirectory: LPCSTR,
175         lpStartupInfo: LPSTARTUPINFOA,
176         lpProcessInformation: LPPROCESS_INFORMATION,
177     ) -> 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, ) -> BOOL178     pub fn CreateProcessW(
179         lpApplicationName: LPCWSTR,
180         lpCommandLine: LPWSTR,
181         lpProcessAttributes: LPSECURITY_ATTRIBUTES,
182         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
183         bInheritHandles: BOOL,
184         dwCreationFlags: DWORD,
185         lpEnvironment: LPVOID,
186         lpCurrentDirectory: LPCWSTR,
187         lpStartupInfo: LPSTARTUPINFOW,
188         lpProcessInformation: LPPROCESS_INFORMATION,
189     ) -> BOOL;
SetProcessShutdownParameters( dwLevel: DWORD, dwFlags: DWORD, ) -> BOOL190     pub fn SetProcessShutdownParameters(
191         dwLevel: DWORD,
192         dwFlags: DWORD,
193     ) -> BOOL;
GetProcessVersion( ProcessId: DWORD, ) -> DWORD194     pub fn GetProcessVersion(
195         ProcessId: DWORD,
196     ) -> DWORD;
GetStartupInfoW( lpStartupInfo: LPSTARTUPINFOW, )197     pub fn GetStartupInfoW(
198         lpStartupInfo: LPSTARTUPINFOW,
199     );
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, ) -> BOOL200     pub fn CreateProcessAsUserW(
201         hToken: HANDLE,
202         lpApplicationName: LPCWSTR,
203         lpCommandLine: LPWSTR,
204         lpProcessAttributes: LPSECURITY_ATTRIBUTES,
205         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
206         bInheritHandles: BOOL,
207         dwCreationFlags: DWORD,
208         lpEnvironment: LPVOID,
209         lpCurrentDirectory: LPCWSTR,
210         lpStartupInfo: LPSTARTUPINFOW,
211         lpProcessInformation: LPPROCESS_INFORMATION,
212     ) -> BOOL;
213     // pub fn GetCurrentProcessToken();
214     // pub fn GetCurrentThreadToken();
215     // pub fn GetCurrentThreadEffectiveToken();
SetThreadToken( Thread: PHANDLE, Token: HANDLE, ) -> BOOL216     pub fn SetThreadToken(
217         Thread: PHANDLE,
218         Token: HANDLE,
219     ) -> BOOL;
OpenProcessToken( ProcessHandle: HANDLE, DesiredAccess: DWORD, TokenHandle: PHANDLE, ) -> BOOL220     pub fn OpenProcessToken(
221         ProcessHandle: HANDLE,
222         DesiredAccess: DWORD,
223         TokenHandle: PHANDLE,
224     ) -> BOOL;
OpenThreadToken( ThreadHandle: HANDLE, DesiredAccess: DWORD, OpenAsSelf: BOOL, TokenHandle: PHANDLE, ) -> BOOL225     pub fn OpenThreadToken(
226         ThreadHandle: HANDLE,
227         DesiredAccess: DWORD,
228         OpenAsSelf: BOOL,
229         TokenHandle: PHANDLE,
230     ) -> BOOL;
SetPriorityClass( hProcess: HANDLE, dwPriorityClass: DWORD, ) -> BOOL231     pub fn SetPriorityClass(
232         hProcess: HANDLE,
233         dwPriorityClass: DWORD,
234     ) -> BOOL;
SetThreadStackGuarantee( StackSizeInBytes: PULONG, ) -> BOOL235     pub fn SetThreadStackGuarantee(
236         StackSizeInBytes: PULONG,
237     ) -> BOOL;
GetPriorityClass( hProcess: HANDLE, ) -> DWORD238     pub fn GetPriorityClass(
239         hProcess: HANDLE,
240     ) -> DWORD;
ProcessIdToSessionId( dwProcessId: DWORD, pSessionId: *mut DWORD, ) -> BOOL241     pub fn ProcessIdToSessionId(
242         dwProcessId: DWORD,
243         pSessionId: *mut DWORD,
244     ) -> BOOL;
GetProcessId( Process: HANDLE, ) -> DWORD245     pub fn GetProcessId(
246         Process: HANDLE,
247     ) -> DWORD;
248 }
249 STRUCT!{struct PROC_THREAD_ATTRIBUTE_LIST {
250     dummy: *mut c_void,
251 }}
252 pub type PPROC_THREAD_ATTRIBUTE_LIST = *mut PROC_THREAD_ATTRIBUTE_LIST;
253 pub type LPPROC_THREAD_ATTRIBUTE_LIST = *mut PROC_THREAD_ATTRIBUTE_LIST;
254 extern "system" {
GetThreadId( Thread: HANDLE, ) -> DWORD255     pub fn GetThreadId(
256         Thread: HANDLE,
257     ) -> DWORD;
FlushProcessWriteBuffers()258     pub fn FlushProcessWriteBuffers();
GetProcessIdOfThread( Thread: HANDLE, ) -> DWORD259     pub fn GetProcessIdOfThread(
260         Thread: HANDLE,
261     ) -> DWORD;
InitializeProcThreadAttributeList( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwAttributeCount: DWORD, dwFlags: DWORD, lpSize: PSIZE_T, ) -> BOOL262     pub fn InitializeProcThreadAttributeList(
263         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
264         dwAttributeCount: DWORD,
265         dwFlags: DWORD,
266         lpSize: PSIZE_T,
267     ) -> BOOL;
DeleteProcThreadAttributeList( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, )268     pub fn DeleteProcThreadAttributeList(
269         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
270     );
SetProcessAffinityUpdateMode( hProcess: HANDLE, dwFlags: DWORD, ) -> BOOL271     pub fn SetProcessAffinityUpdateMode(
272         hProcess: HANDLE,
273         dwFlags: DWORD,
274     ) -> BOOL;
QueryProcessAffinityUpdateMode( hProcess: HANDLE, lpdwFlags: LPDWORD, ) -> BOOL275     pub fn QueryProcessAffinityUpdateMode(
276         hProcess: HANDLE,
277         lpdwFlags: LPDWORD,
278     ) -> BOOL;
UpdateProcThreadAttribute( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwFlags: DWORD, Attribute: DWORD_PTR, lpValue: PVOID, cbSize: SIZE_T, lpPreviousValue: PVOID, lpReturnSize: PSIZE_T, ) -> BOOL279     pub fn UpdateProcThreadAttribute(
280         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
281         dwFlags: DWORD,
282         Attribute: DWORD_PTR,
283         lpValue: PVOID,
284         cbSize: SIZE_T,
285         lpPreviousValue: PVOID,
286         lpReturnSize: PSIZE_T,
287     ) -> 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, ) -> HANDLE288     pub fn CreateRemoteThreadEx(
289         hProcess: HANDLE,
290         lpThreadAttributes: LPSECURITY_ATTRIBUTES,
291         dwStackSize: SIZE_T,
292         lpStartAddress: LPTHREAD_START_ROUTINE,
293         lpParameter: LPVOID,
294         dwCreationFlags: DWORD,
295         lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
296         lpThreadId: LPDWORD,
297     ) -> HANDLE;
GetCurrentThreadStackLimits( LowLimit: PULONG_PTR, HighLimit: PULONG_PTR, )298     pub fn GetCurrentThreadStackLimits(
299         LowLimit: PULONG_PTR,
300         HighLimit: PULONG_PTR,
301     );
GetThreadContext( hThread: HANDLE, lpContext: LPCONTEXT, ) -> BOOL302     pub fn GetThreadContext(
303         hThread: HANDLE,
304         lpContext: LPCONTEXT,
305     ) -> BOOL;
SetThreadContext( hThread: HANDLE, lpContext: *const CONTEXT, ) -> BOOL306     pub fn SetThreadContext(
307         hThread: HANDLE,
308         lpContext: *const CONTEXT,
309     ) -> BOOL;
SetProcessMitigationPolicy( MitigationPolicy: PROCESS_MITIGATION_POLICY, lpBuffer: PVOID, dwLength: SIZE_T, ) -> BOOL310     pub fn SetProcessMitigationPolicy(
311         MitigationPolicy: PROCESS_MITIGATION_POLICY,
312         lpBuffer: PVOID,
313         dwLength: SIZE_T,
314     ) -> BOOL;
GetProcessMitigationPolicy( hProcess: HANDLE, MitigationPolicy: PROCESS_MITIGATION_POLICY, lpBuffer: PVOID, dwLength: SIZE_T, ) -> BOOL315     pub fn GetProcessMitigationPolicy(
316         hProcess: HANDLE,
317         MitigationPolicy: PROCESS_MITIGATION_POLICY,
318         lpBuffer: PVOID,
319         dwLength: SIZE_T,
320     ) -> BOOL;
FlushInstructionCache( hProcess: HANDLE, lpBaseAddress: LPCVOID, dwSize: SIZE_T, ) -> BOOL321     pub fn FlushInstructionCache(
322         hProcess: HANDLE,
323         lpBaseAddress: LPCVOID,
324         dwSize: SIZE_T,
325     ) -> BOOL;
GetThreadTimes( hThread: HANDLE, lpCreationTime: LPFILETIME, lpExitTime: LPFILETIME, lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME, ) -> BOOL326     pub fn GetThreadTimes(
327         hThread: HANDLE,
328         lpCreationTime: LPFILETIME,
329         lpExitTime: LPFILETIME,
330         lpKernelTime: LPFILETIME,
331         lpUserTime: LPFILETIME,
332     ) -> BOOL;
OpenProcess( dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD, ) -> HANDLE333     pub fn OpenProcess(
334         dwDesiredAccess: DWORD,
335         bInheritHandle: BOOL,
336         dwProcessId: DWORD,
337     ) -> HANDLE;
IsProcessorFeaturePresent( ProcessorFeature: DWORD, ) -> BOOL338     pub fn IsProcessorFeaturePresent(
339         ProcessorFeature: DWORD,
340     ) -> BOOL;
GetProcessHandleCount( hProcess: HANDLE, pdwHandleCount: PDWORD, ) -> BOOL341     pub fn GetProcessHandleCount(
342         hProcess: HANDLE,
343         pdwHandleCount: PDWORD,
344     ) -> BOOL;
GetCurrentProcessorNumber() -> DWORD345     pub fn GetCurrentProcessorNumber() -> DWORD;
SetThreadIdealProcessorEx( hThread: HANDLE, lpIdealProcessor: PPROCESSOR_NUMBER, lpPreviousIdealProcessor: PPROCESSOR_NUMBER, ) -> BOOL346     pub fn SetThreadIdealProcessorEx(
347         hThread: HANDLE,
348         lpIdealProcessor: PPROCESSOR_NUMBER,
349         lpPreviousIdealProcessor: PPROCESSOR_NUMBER,
350     ) -> BOOL;
GetThreadIdealProcessorEx( hThread: HANDLE, lpIdealProcessor: PPROCESSOR_NUMBER, ) -> BOOL351     pub fn GetThreadIdealProcessorEx(
352         hThread: HANDLE,
353         lpIdealProcessor: PPROCESSOR_NUMBER,
354     ) -> BOOL;
GetCurrentProcessorNumberEx( ProcNumber: PPROCESSOR_NUMBER, )355     pub fn GetCurrentProcessorNumberEx(
356         ProcNumber: PPROCESSOR_NUMBER,
357     );
GetProcessPriorityBoost( hProcess: HANDLE, pDisablePriorityBoost: PBOOL, ) -> BOOL358     pub fn GetProcessPriorityBoost(
359         hProcess: HANDLE,
360         pDisablePriorityBoost: PBOOL,
361     ) -> BOOL;
SetProcessPriorityBoost( hProcess: HANDLE, bDisablePriorityBoost: BOOL, ) -> BOOL362     pub fn SetProcessPriorityBoost(
363         hProcess: HANDLE,
364         bDisablePriorityBoost: BOOL,
365     ) -> BOOL;
GetThreadIOPendingFlag( hThread: HANDLE, lpIOIsPending: PBOOL, ) -> BOOL366     pub fn GetThreadIOPendingFlag(
367         hThread: HANDLE,
368         lpIOIsPending: PBOOL,
369     ) -> BOOL;
GetSystemTimes( lpIdleTime: LPFILETIME, lpKernelTime: LPFILETIME, lpUserTime: LPFILETIME, ) -> BOOL370     pub fn GetSystemTimes(
371         lpIdleTime: LPFILETIME,
372         lpKernelTime: LPFILETIME,
373         lpUserTime: LPFILETIME,
374     ) -> BOOL;
375 }
376 ENUM!{enum THREAD_INFORMATION_CLASS {
377     ThreadMemoryPriority,
378     ThreadAbsoluteCpuPriority,
379     ThreadInformationClassMax,
380 }}
381 // MEMORY_PRIORITY_INFORMATION
382 extern "system" {
GetThreadInformation( hThread: HANDLE, ThreadInformationClass: THREAD_INFORMATION_CLASS, ThreadInformation: LPVOID, ThreadInformationSize: DWORD, ) -> BOOL383     pub fn GetThreadInformation(
384         hThread: HANDLE,
385         ThreadInformationClass: THREAD_INFORMATION_CLASS,
386         ThreadInformation: LPVOID,
387         ThreadInformationSize: DWORD,
388     ) -> BOOL;
SetThreadInformation( hThread: HANDLE, ThreadInformationClass: THREAD_INFORMATION_CLASS, ThreadInformation: LPVOID, ThreadInformationSize: DWORD, ) -> BOOL389     pub fn SetThreadInformation(
390         hThread: HANDLE,
391         ThreadInformationClass: THREAD_INFORMATION_CLASS,
392         ThreadInformation: LPVOID,
393         ThreadInformationSize: DWORD,
394     ) -> BOOL;
IsProcessCritical( hProcess: HANDLE, Critical: PBOOL, ) -> BOOL395     pub fn IsProcessCritical(
396         hProcess: HANDLE,
397         Critical: PBOOL,
398     ) -> BOOL;
SetProtectedPolicy( PolicyGuid: LPCGUID, PolicyValue: ULONG_PTR, OldPolicyValue: PULONG_PTR, ) -> BOOL399     pub fn SetProtectedPolicy(
400         PolicyGuid: LPCGUID,
401         PolicyValue: ULONG_PTR,
402         OldPolicyValue: PULONG_PTR,
403     ) -> BOOL;
QueryProtectedPolicy( PolicyGuid: LPCGUID, PolicyValue: PULONG_PTR, ) -> BOOL404     pub fn QueryProtectedPolicy(
405         PolicyGuid: LPCGUID,
406         PolicyValue: PULONG_PTR,
407     ) -> BOOL;
SetThreadIdealProcessor( hThread: HANDLE, dwIdealProcessor: DWORD, ) -> DWORD408     pub fn SetThreadIdealProcessor(
409         hThread: HANDLE,
410         dwIdealProcessor: DWORD,
411     ) -> DWORD;
412 }
413 ENUM!{enum PROCESS_INFORMATION_CLASS {
414     ProcessMemoryPriority,
415     ProcessInformationClassMax,
416 }}
417 extern "system" {
SetProcessInformation( hProcess: HANDLE, ProcessInformationClass: PROCESS_INFORMATION_CLASS, ProcessInformation: LPVOID, ProcessInformationSize: DWORD, ) -> BOOL418     pub fn SetProcessInformation(
419         hProcess: HANDLE,
420         ProcessInformationClass: PROCESS_INFORMATION_CLASS,
421         ProcessInformation: LPVOID,
422         ProcessInformationSize: DWORD,
423     ) -> BOOL;
GetProcessInformation( hProcess: HANDLE, ProcessInformationClass: PROCESS_INFORMATION_CLASS, ProcessInformation: LPVOID, ProcessInformationSize: DWORD, ) -> BOOL424     pub fn GetProcessInformation(
425         hProcess: HANDLE,
426         ProcessInformationClass: PROCESS_INFORMATION_CLASS,
427         ProcessInformation: LPVOID,
428         ProcessInformationSize: DWORD,
429     ) -> BOOL;
430     // pub fn GetSystemCpuSetInformation();
431     // pub fn GetProcessDefaultCpuSets();
432     // pub fn SetProcessDefaultCpuSets();
433     // pub fn GetThreadSelectedCpuSets();
434     // pub fn SetThreadSelectedCpuSets();
435     // pub fn CreateProcessAsUserA();
GetProcessShutdownParameters( lpdwLevel: LPDWORD, lpdwFlags: LPDWORD, ) -> BOOL436     pub fn GetProcessShutdownParameters(
437         lpdwLevel: LPDWORD,
438         lpdwFlags: LPDWORD,
439     ) -> BOOL;
440     // pub fn SetThreadDescription();
441     // pub fn GetThreadDescription();
442 }
443