blob: 9629ee865d122635f2ce9ae52238d5d1bbf73729 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms
//! ApiSet Contract for api-ms-win-core-processthreads-l1
use ctypes::{c_int, c_void};
use shared::basetsd::{DWORD_PTR, PSIZE_T, PULONG_PTR, SIZE_T, ULONG_PTR};
use shared::guiddef::LPCGUID;
use shared::minwindef::{
BOOL, DWORD, LPBYTE, LPCVOID, LPDWORD, LPFILETIME, LPVOID, PBOOL, PDWORD, PULONG, UINT, WORD
};
use um::minwinbase::{LPCONTEXT, LPSECURITY_ATTRIBUTES, LPTHREAD_START_ROUTINE};
use um::winnt::{
CONTEXT, HANDLE, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PAPCFUNC, PHANDLE, PPROCESSOR_NUMBER,
PROCESS_MITIGATION_POLICY, PVOID
};
STRUCT!{struct PROCESS_INFORMATION {
hProcess: HANDLE,
hThread: HANDLE,
dwProcessId: DWORD,
dwThreadId: DWORD,
}}
pub type PPROCESS_INFORMATION = *mut PROCESS_INFORMATION;
pub type LPPROCESS_INFORMATION = *mut PROCESS_INFORMATION;
STRUCT!{struct STARTUPINFOA {
cb: DWORD,
lpReserved: LPSTR,
lpDesktop: LPSTR,
lpTitle: LPSTR,
dwX: DWORD,
dwY: DWORD,
dwXSize: DWORD,
dwYSize: DWORD,
dwXCountChars: DWORD,
dwYCountChars: DWORD,
dwFillAttribute: DWORD,
dwFlags: DWORD,
wShowWindow: WORD,
cbReserved2: WORD,
lpReserved2: LPBYTE,
hStdInput: HANDLE,
hStdOutput: HANDLE,
hStdError: HANDLE,
}}
pub type LPSTARTUPINFOA = *mut STARTUPINFOA;
STRUCT!{struct STARTUPINFOW {
cb: DWORD,
lpReserved: LPWSTR,
lpDesktop: LPWSTR,
lpTitle: LPWSTR,
dwX: DWORD,
dwY: DWORD,
dwXSize: DWORD,
dwYSize: DWORD,
dwXCountChars: DWORD,
dwYCountChars: DWORD,
dwFillAttribute: DWORD,
dwFlags: DWORD,
wShowWindow: WORD,
cbReserved2: WORD,
lpReserved2: LPBYTE,
hStdInput: HANDLE,
hStdOutput: HANDLE,
hStdError: HANDLE,
}}
pub type LPSTARTUPINFOW = *mut STARTUPINFOW;
extern "system" {
pub fn QueueUserAPC(
pfnAPC: PAPCFUNC,
hThread: HANDLE,
dwData: ULONG_PTR,
) -> DWORD;
pub fn GetProcessTimes(
hProcess: HANDLE,
lpCreationTime: LPFILETIME,
lpExitTime: LPFILETIME,
lpKernelTime: LPFILETIME,
lpUserTime: LPFILETIME,
) -> BOOL;
pub fn GetCurrentProcess() -> HANDLE;
pub fn GetCurrentProcessId() -> DWORD;
pub fn ExitProcess(
uExitCode: UINT,
);
pub fn TerminateProcess(
hProcess: HANDLE,
uExitCode: UINT,
) -> BOOL;
pub fn GetExitCodeProcess(
hProcess: HANDLE,
lpExitCode: LPDWORD,
) -> BOOL;
pub fn SwitchToThread() -> BOOL;
pub fn CreateThread(
lpThreadAttributes: LPSECURITY_ATTRIBUTES,
dwStackSize: SIZE_T,
lpStartAddress: LPTHREAD_START_ROUTINE,
lpParameter: LPVOID,
dwCreationFlags: DWORD,
lpThreadId: LPDWORD,
) -> HANDLE;
pub fn CreateRemoteThread(
hProcess: HANDLE,
lpThreadAttributes: LPSECURITY_ATTRIBUTES,
dwStackSize: SIZE_T,
lpStartAddress: LPTHREAD_START_ROUTINE,
lpParameter: LPVOID,
dwCreationFlags: DWORD,
lpThreadId: LPDWORD,
) -> HANDLE;
pub fn GetCurrentThread() -> HANDLE;
pub fn GetCurrentThreadId() -> DWORD;
pub fn OpenThread(
dwDesiredAccess: DWORD,
bInheritHandle: BOOL,
dwThreadId: DWORD,
) -> HANDLE;
pub fn SetThreadPriority(
hThread: HANDLE,
nPriority: c_int,
) -> BOOL;
pub fn SetThreadPriorityBoost(
hThread: HANDLE,
bDisablePriorityBoost: BOOL,
) -> BOOL;
pub fn GetThreadPriorityBoost(
hThread: HANDLE,
pDisablePriorityBoost: PBOOL,
) -> BOOL;
pub fn GetThreadPriority(
hThread: HANDLE,
) -> c_int;
pub fn ExitThread(
dwExitCode: DWORD,
);
pub fn TerminateThread(
hThread: HANDLE,
dwExitCode: DWORD,
) -> BOOL;
pub fn GetExitCodeThread(
hThread: HANDLE,
lpExitCode: LPDWORD,
) -> BOOL;
pub fn SuspendThread(
hThread: HANDLE,
) -> DWORD;
pub fn ResumeThread(
hThread: HANDLE,
) -> DWORD;
}
pub const TLS_OUT_OF_INDEXES: DWORD = 0xFFFFFFFF;
extern "system" {
pub fn TlsAlloc() -> DWORD;
pub fn TlsGetValue(
dwTlsIndex: DWORD,
) -> LPVOID;
pub fn TlsSetValue(
dwTlsIndex: DWORD,
lpTlsValue: LPVOID,
) -> BOOL;
pub fn TlsFree(
dwTlsIndex: DWORD,
) -> BOOL;
pub fn CreateProcessA(
lpApplicationName: LPCSTR,
lpCommandLine: LPSTR,
lpProcessAttributes: LPSECURITY_ATTRIBUTES,
lpThreadAttributes: LPSECURITY_ATTRIBUTES,
bInheritHandles: BOOL,
dwCreationFlags: DWORD,
lpEnvironment: LPVOID,
lpCurrentDirectory: LPCSTR,
lpStartupInfo: LPSTARTUPINFOA,
lpProcessInformation: LPPROCESS_INFORMATION,
) -> BOOL;
pub fn CreateProcessW(
lpApplicationName: LPCWSTR,
lpCommandLine: LPWSTR,
lpProcessAttributes: LPSECURITY_ATTRIBUTES,
lpThreadAttributes: LPSECURITY_ATTRIBUTES,
bInheritHandles: BOOL,
dwCreationFlags: DWORD,
lpEnvironment: LPVOID,
lpCurrentDirectory: LPCWSTR,
lpStartupInfo: LPSTARTUPINFOW,
lpProcessInformation: LPPROCESS_INFORMATION,
) -> BOOL;
pub fn SetProcessShutdownParameters(
dwLevel: DWORD,
dwFlags: DWORD,
) -> BOOL;
pub fn GetProcessVersion(
ProcessId: DWORD,
) -> DWORD;
pub fn GetStartupInfoW(
lpStartupInfo: LPSTARTUPINFOW,
);
pub fn 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,
) -> BOOL;
// pub fn GetCurrentProcessToken();
// pub fn GetCurrentThreadToken();
// pub fn GetCurrentThreadEffectiveToken();
pub fn SetThreadToken(
Thread: PHANDLE,
Token: HANDLE,
) -> BOOL;
pub fn OpenProcessToken(
ProcessHandle: HANDLE,
DesiredAccess: DWORD,
TokenHandle: PHANDLE,
) -> BOOL;
pub fn OpenThreadToken(
ThreadHandle: HANDLE,
DesiredAccess: DWORD,
OpenAsSelf: BOOL,
TokenHandle: PHANDLE,
) -> BOOL;
pub fn SetPriorityClass(
hProcess: HANDLE,
dwPriorityClass: DWORD,
) -> BOOL;
pub fn SetThreadStackGuarantee(
StackSizeInBytes: PULONG,
) -> BOOL;
pub fn GetPriorityClass(
hProcess: HANDLE,
) -> DWORD;
pub fn ProcessIdToSessionId(
dwProcessId: DWORD,
pSessionId: *mut DWORD,
) -> BOOL;
pub fn GetProcessId(
Process: HANDLE,
) -> DWORD;
}
STRUCT!{struct PROC_THREAD_ATTRIBUTE_LIST {
dummy: *mut c_void,
}}
pub type PPROC_THREAD_ATTRIBUTE_LIST = *mut PROC_THREAD_ATTRIBUTE_LIST;
pub type LPPROC_THREAD_ATTRIBUTE_LIST = *mut PROC_THREAD_ATTRIBUTE_LIST;
extern "system" {
pub fn GetThreadId(
Thread: HANDLE,
) -> DWORD;
pub fn FlushProcessWriteBuffers();
pub fn GetProcessIdOfThread(
Thread: HANDLE,
) -> DWORD;
pub fn InitializeProcThreadAttributeList(
lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
dwAttributeCount: DWORD,
dwFlags: DWORD,
lpSize: PSIZE_T,
) -> BOOL;
pub fn DeleteProcThreadAttributeList(
lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
);
pub fn SetProcessAffinityUpdateMode(
hProcess: HANDLE,
dwFlags: DWORD,
) -> BOOL;
pub fn QueryProcessAffinityUpdateMode(
hProcess: HANDLE,
lpdwFlags: LPDWORD,
) -> BOOL;
pub fn UpdateProcThreadAttribute(
lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
dwFlags: DWORD,
Attribute: DWORD_PTR,
lpValue: PVOID,
cbSize: SIZE_T,
lpPreviousValue: PVOID,
lpReturnSize: PSIZE_T,
) -> BOOL;
pub fn CreateRemoteThreadEx(
hProcess: HANDLE,
lpThreadAttributes: LPSECURITY_ATTRIBUTES,
dwStackSize: SIZE_T,
lpStartAddress: LPTHREAD_START_ROUTINE,
lpParameter: LPVOID,
dwCreationFlags: DWORD,
lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST,
lpThreadId: LPDWORD,
) -> HANDLE;
pub fn GetCurrentThreadStackLimits(
LowLimit: PULONG_PTR,
HighLimit: PULONG_PTR,
);
pub fn GetThreadContext(
hThread: HANDLE,
lpContext: LPCONTEXT,
) -> BOOL;
pub fn SetThreadContext(
hThread: HANDLE,
lpContext: *const CONTEXT,
) -> BOOL;
pub fn SetProcessMitigationPolicy(
MitigationPolicy: PROCESS_MITIGATION_POLICY,
lpBuffer: PVOID,
dwLength: SIZE_T,
) -> BOOL;
pub fn GetProcessMitigationPolicy(
hProcess: HANDLE,
MitigationPolicy: PROCESS_MITIGATION_POLICY,
lpBuffer: PVOID,
dwLength: SIZE_T,
) -> BOOL;
pub fn FlushInstructionCache(
hProcess: HANDLE,
lpBaseAddress: LPCVOID,
dwSize: SIZE_T,
) -> BOOL;
pub fn GetThreadTimes(
hThread: HANDLE,
lpCreationTime: LPFILETIME,
lpExitTime: LPFILETIME,
lpKernelTime: LPFILETIME,
lpUserTime: LPFILETIME,
) -> BOOL;
pub fn OpenProcess(
dwDesiredAccess: DWORD,
bInheritHandle: BOOL,
dwProcessId: DWORD,
) -> HANDLE;
pub fn IsProcessorFeaturePresent(
ProcessorFeature: DWORD,
) -> BOOL;
pub fn GetProcessHandleCount(
hProcess: HANDLE,
pdwHandleCount: PDWORD,
) -> BOOL;
pub fn GetCurrentProcessorNumber() -> DWORD;
pub fn SetThreadIdealProcessorEx(
hThread: HANDLE,
lpIdealProcessor: PPROCESSOR_NUMBER,
lpPreviousIdealProcessor: PPROCESSOR_NUMBER,
) -> BOOL;
pub fn GetThreadIdealProcessorEx(
hThread: HANDLE,
lpIdealProcessor: PPROCESSOR_NUMBER,
) -> BOOL;
pub fn GetCurrentProcessorNumberEx(
ProcNumber: PPROCESSOR_NUMBER,
);
pub fn GetProcessPriorityBoost(
hProcess: HANDLE,
pDisablePriorityBoost: PBOOL,
) -> BOOL;
pub fn SetProcessPriorityBoost(
hProcess: HANDLE,
bDisablePriorityBoost: BOOL,
) -> BOOL;
pub fn GetThreadIOPendingFlag(
hThread: HANDLE,
lpIOIsPending: PBOOL,
) -> BOOL;
pub fn GetSystemTimes(
lpIdleTime: LPFILETIME,
lpKernelTime: LPFILETIME,
lpUserTime: LPFILETIME,
) -> BOOL;
}
ENUM!{enum THREAD_INFORMATION_CLASS {
ThreadMemoryPriority,
ThreadAbsoluteCpuPriority,
ThreadInformationClassMax,
}}
// MEMORY_PRIORITY_INFORMATION
extern "system" {
pub fn GetThreadInformation(
hThread: HANDLE,
ThreadInformationClass: THREAD_INFORMATION_CLASS,
ThreadInformation: LPVOID,
ThreadInformationSize: DWORD,
) -> BOOL;
pub fn SetThreadInformation(
hThread: HANDLE,
ThreadInformationClass: THREAD_INFORMATION_CLASS,
ThreadInformation: LPVOID,
ThreadInformationSize: DWORD,
) -> BOOL;
pub fn IsProcessCritical(
hProcess: HANDLE,
Critical: PBOOL,
) -> BOOL;
pub fn SetProtectedPolicy(
PolicyGuid: LPCGUID,
PolicyValue: ULONG_PTR,
OldPolicyValue: PULONG_PTR,
) -> BOOL;
pub fn QueryProtectedPolicy(
PolicyGuid: LPCGUID,
PolicyValue: PULONG_PTR,
) -> BOOL;
pub fn SetThreadIdealProcessor(
hThread: HANDLE,
dwIdealProcessor: DWORD,
) -> DWORD;
}
ENUM!{enum PROCESS_INFORMATION_CLASS {
ProcessMemoryPriority,
ProcessInformationClassMax,
}}
extern "system" {
pub fn SetProcessInformation(
hProcess: HANDLE,
ProcessInformationClass: PROCESS_INFORMATION_CLASS,
ProcessInformation: LPVOID,
ProcessInformationSize: DWORD,
) -> BOOL;
pub fn GetProcessInformation(
hProcess: HANDLE,
ProcessInformationClass: PROCESS_INFORMATION_CLASS,
ProcessInformation: LPVOID,
ProcessInformationSize: DWORD,
) -> BOOL;
// pub fn GetSystemCpuSetInformation();
// pub fn GetProcessDefaultCpuSets();
// pub fn SetProcessDefaultCpuSets();
// pub fn GetThreadSelectedCpuSets();
// pub fn SetThreadSelectedCpuSets();
// pub fn CreateProcessAsUserA();
pub fn GetProcessShutdownParameters(
lpdwLevel: LPDWORD,
lpdwFlags: LPDWORD,
) -> BOOL;
// pub fn SetThreadDescription();
// pub fn GetThreadDescription();
}