mirror of
https://github.com/MSxDOS/ntapi
synced 2026-06-08 11:37:18 +00:00
1469 lines
51 KiB
Rust
1469 lines
51 KiB
Rust
use crate::ntapi_base::{CLIENT_ID, KPRIORITY, PCLIENT_ID};
|
|
use crate::ntexapi::{PROCESS_DISK_COUNTERS, PROCESS_ENERGY_VALUES};
|
|
use crate::ntpebteb::{PPEB, PTEB};
|
|
use winapi::ctypes::c_void;
|
|
use winapi::shared::basetsd::{PSIZE_T, SIZE_T, ULONG64, ULONG_PTR};
|
|
use winapi::shared::ntdef::{
|
|
BOOLEAN, HANDLE, LARGE_INTEGER, LIST_ENTRY, LONG, LONGLONG, NTSTATUS, NT_PRODUCT_TYPE,
|
|
PHANDLE, PLARGE_INTEGER, POBJECT_ATTRIBUTES, PROCESSOR_NUMBER, PSINGLE_LIST_ENTRY, PULONG,
|
|
PVOID, SINGLE_LIST_ENTRY, UCHAR, ULONG, ULONGLONG, UNICODE_STRING, USHORT, WCHAR,
|
|
};
|
|
use winapi::um::winnt::{
|
|
ACCESS_MASK, CONTEXT, HARDWARE_COUNTER_TYPE, IO_COUNTERS, JOBOBJECTINFOCLASS,
|
|
JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, LDT_ENTRY, MAX_HW_COUNTERS, PCONTEXT, PJOB_SET_ARRAY,
|
|
PROCESS_MITIGATION_ASLR_POLICY, PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY,
|
|
PROCESS_MITIGATION_CHILD_PROCESS_POLICY, PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY,
|
|
PROCESS_MITIGATION_DYNAMIC_CODE_POLICY, PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY,
|
|
PROCESS_MITIGATION_FONT_DISABLE_POLICY, PROCESS_MITIGATION_IMAGE_LOAD_POLICY,
|
|
PROCESS_MITIGATION_PAYLOAD_RESTRICTION_POLICY, PROCESS_MITIGATION_POLICY,
|
|
PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY, PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY,
|
|
PROCESS_MITIGATION_SYSTEM_CALL_FILTER_POLICY, PSECURITY_QUALITY_OF_SERVICE,
|
|
};
|
|
#[cfg(feature = "nightly")]
|
|
use crate::winapi_local::um::winnt::NtCurrentTeb;
|
|
pub const GDI_HANDLE_BUFFER_SIZE32: usize = 34;
|
|
pub const GDI_HANDLE_BUFFER_SIZE64: usize = 60;
|
|
#[cfg(target_arch = "x86_64")]
|
|
pub const GDI_HANDLE_BUFFER_SIZE: usize = GDI_HANDLE_BUFFER_SIZE64;
|
|
#[cfg(target_arch = "x86")]
|
|
pub const GDI_HANDLE_BUFFER_SIZE: usize = GDI_HANDLE_BUFFER_SIZE32;
|
|
pub type GDI_HANDLE_BUFFER = [ULONG; GDI_HANDLE_BUFFER_SIZE];
|
|
pub type GDI_HANDLE_BUFFER32 = [ULONG; GDI_HANDLE_BUFFER_SIZE32];
|
|
pub type GDI_HANDLE_BUFFER64 = [ULONG; GDI_HANDLE_BUFFER_SIZE];
|
|
pub const TLS_EXPANSION_SLOTS: usize = 1024;
|
|
STRUCT!{struct PEB_LDR_DATA {
|
|
Length: ULONG,
|
|
Initialized: BOOLEAN,
|
|
SsHandle: HANDLE,
|
|
InLoadOrderModuleList: LIST_ENTRY,
|
|
InMemoryOrderModuleList: LIST_ENTRY,
|
|
InInitializationOrderModuleList: LIST_ENTRY,
|
|
EntryInProgress: PVOID,
|
|
ShutdownInProgress: BOOLEAN,
|
|
ShutdownThreadId: HANDLE,
|
|
}}
|
|
pub type PPEB_LDR_DATA = *mut PEB_LDR_DATA;
|
|
STRUCT!{struct INITIAL_TEB_OldInitialTeb {
|
|
OldStackBase: PVOID,
|
|
OldStackLimit: PVOID,
|
|
}}
|
|
STRUCT!{struct INITIAL_TEB {
|
|
OldInitialTeb: INITIAL_TEB_OldInitialTeb,
|
|
StackBase: PVOID,
|
|
StackLimit: PVOID,
|
|
StackAllocationBase: PVOID,
|
|
}}
|
|
pub type PINITIAL_TEB = *mut INITIAL_TEB;
|
|
STRUCT!{struct WOW64_PROCESS {
|
|
Wow64: PVOID,
|
|
}}
|
|
pub type PWOW64_PROCESS = *mut WOW64_PROCESS;
|
|
ENUM!{enum PROCESSINFOCLASS {
|
|
ProcessBasicInformation = 0,
|
|
ProcessQuotaLimits = 1,
|
|
ProcessIoCounters = 2,
|
|
ProcessVmCounters = 3,
|
|
ProcessTimes = 4,
|
|
ProcessBasePriority = 5,
|
|
ProcessRaisePriority = 6,
|
|
ProcessDebugPort = 7,
|
|
ProcessExceptionPort = 8,
|
|
ProcessAccessToken = 9,
|
|
ProcessLdtInformation = 10,
|
|
ProcessLdtSize = 11,
|
|
ProcessDefaultHardErrorMode = 12,
|
|
ProcessIoPortHandlers = 13,
|
|
ProcessPooledUsageAndLimits = 14,
|
|
ProcessWorkingSetWatch = 15,
|
|
ProcessUserModeIOPL = 16,
|
|
ProcessEnableAlignmentFaultFixup = 17,
|
|
ProcessPriorityClass = 18,
|
|
ProcessWx86Information = 19,
|
|
ProcessHandleCount = 20,
|
|
ProcessAffinityMask = 21,
|
|
ProcessPriorityBoost = 22,
|
|
ProcessDeviceMap = 23,
|
|
ProcessSessionInformation = 24,
|
|
ProcessForegroundInformation = 25,
|
|
ProcessWow64Information = 26,
|
|
ProcessImageFileName = 27,
|
|
ProcessLUIDDeviceMapsEnabled = 28,
|
|
ProcessBreakOnTermination = 29,
|
|
ProcessDebugObjectHandle = 30,
|
|
ProcessDebugFlags = 31,
|
|
ProcessHandleTracing = 32,
|
|
ProcessIoPriority = 33,
|
|
ProcessExecuteFlags = 34,
|
|
ProcessResourceManagement = 35,
|
|
ProcessCookie = 36,
|
|
ProcessImageInformation = 37,
|
|
ProcessCycleTime = 38,
|
|
ProcessPagePriority = 39,
|
|
ProcessInstrumentationCallback = 40,
|
|
ProcessThreadStackAllocation = 41,
|
|
ProcessWorkingSetWatchEx = 42,
|
|
ProcessImageFileNameWin32 = 43,
|
|
ProcessImageFileMapping = 44,
|
|
ProcessAffinityUpdateMode = 45,
|
|
ProcessMemoryAllocationMode = 46,
|
|
ProcessGroupInformation = 47,
|
|
ProcessTokenVirtualizationEnabled = 48,
|
|
ProcessConsoleHostProcess = 49,
|
|
ProcessWindowInformation = 50,
|
|
ProcessHandleInformation = 51,
|
|
ProcessMitigationPolicy = 52,
|
|
ProcessDynamicFunctionTableInformation = 53,
|
|
ProcessHandleCheckingMode = 54,
|
|
ProcessKeepAliveCount = 55,
|
|
ProcessRevokeFileHandles = 56,
|
|
ProcessWorkingSetControl = 57,
|
|
ProcessHandleTable = 58,
|
|
ProcessCheckStackExtentsMode = 59,
|
|
ProcessCommandLineInformation = 60,
|
|
ProcessProtectionInformation = 61,
|
|
ProcessMemoryExhaustion = 62,
|
|
ProcessFaultInformation = 63,
|
|
ProcessTelemetryIdInformation = 64,
|
|
ProcessCommitReleaseInformation = 65,
|
|
ProcessDefaultCpuSetsInformation = 66,
|
|
ProcessAllowedCpuSetsInformation = 67,
|
|
ProcessSubsystemProcess = 68,
|
|
ProcessJobMemoryInformation = 69,
|
|
ProcessInPrivate = 70,
|
|
ProcessRaiseUMExceptionOnInvalidHandleClose = 71,
|
|
ProcessIumChallengeResponse = 72,
|
|
ProcessChildProcessInformation = 73,
|
|
ProcessHighGraphicsPriorityInformation = 74,
|
|
ProcessSubsystemInformation = 75,
|
|
ProcessEnergyValues = 76,
|
|
ProcessActivityThrottleState = 77,
|
|
ProcessActivityThrottlePolicy = 78,
|
|
ProcessWin32kSyscallFilterInformation = 79,
|
|
ProcessDisableSystemAllowedCpuSets = 80,
|
|
ProcessWakeInformation = 81,
|
|
ProcessEnergyTrackingState = 82,
|
|
ProcessManageWritesToExecutableMemory = 83,
|
|
ProcessCaptureTrustletLiveDump = 84,
|
|
ProcessTelemetryCoverage = 85,
|
|
ProcessEnclaveInformation = 86,
|
|
ProcessEnableReadWriteVmLogging = 87,
|
|
ProcessUptimeInformation = 88,
|
|
ProcessImageSection = 89,
|
|
ProcessDebugAuthInformation = 90,
|
|
ProcessSystemResourceManagement = 91,
|
|
ProcessSequenceNumber = 92,
|
|
ProcessLoaderDetour = 93,
|
|
ProcessSecurityDomainInformation = 94,
|
|
ProcessCombineSecurityDomainsInformation = 95,
|
|
ProcessEnableLogging = 96,
|
|
ProcessLeapSecondInformation = 97,
|
|
MaxProcessInfoClass = 98,
|
|
}}
|
|
ENUM!{enum THREADINFOCLASS {
|
|
ThreadBasicInformation = 0,
|
|
ThreadTimes = 1,
|
|
ThreadPriority = 2,
|
|
ThreadBasePriority = 3,
|
|
ThreadAffinityMask = 4,
|
|
ThreadImpersonationToken = 5,
|
|
ThreadDescriptorTableEntry = 6,
|
|
ThreadEnableAlignmentFaultFixup = 7,
|
|
ThreadEventPair = 8,
|
|
ThreadQuerySetWin32StartAddress = 9,
|
|
ThreadZeroTlsCell = 10,
|
|
ThreadPerformanceCount = 11,
|
|
ThreadAmILastThread = 12,
|
|
ThreadIdealProcessor = 13,
|
|
ThreadPriorityBoost = 14,
|
|
ThreadSetTlsArrayAddress = 15,
|
|
ThreadIsIoPending = 16,
|
|
ThreadHideFromDebugger = 17,
|
|
ThreadBreakOnTermination = 18,
|
|
ThreadSwitchLegacyState = 19,
|
|
ThreadIsTerminated = 20,
|
|
ThreadLastSystemCall = 21,
|
|
ThreadIoPriority = 22,
|
|
ThreadCycleTime = 23,
|
|
ThreadPagePriority = 24,
|
|
ThreadActualBasePriority = 25,
|
|
ThreadTebInformation = 26,
|
|
ThreadCSwitchMon = 27,
|
|
ThreadCSwitchPmu = 28,
|
|
ThreadWow64Context = 29,
|
|
ThreadGroupInformation = 30,
|
|
ThreadUmsInformation = 31,
|
|
ThreadCounterProfiling = 32,
|
|
ThreadIdealProcessorEx = 33,
|
|
ThreadCpuAccountingInformation = 34,
|
|
ThreadSuspendCount = 35,
|
|
ThreadHeterogeneousCpuPolicy = 36,
|
|
ThreadContainerId = 37,
|
|
ThreadNameInformation = 38,
|
|
ThreadSelectedCpuSets = 39,
|
|
ThreadSystemThreadInformation = 40,
|
|
ThreadActualGroupAffinity = 41,
|
|
ThreadDynamicCodePolicyInfo = 42,
|
|
ThreadExplicitCaseSensitivity = 43,
|
|
ThreadWorkOnBehalfTicket = 44,
|
|
ThreadSubsystemInformation = 45,
|
|
ThreadDbgkWerReportActive = 46,
|
|
ThreadAttachContainer = 47,
|
|
ThreadManageWritesToExecutableMemory = 48,
|
|
ThreadPowerThrottlingState = 49,
|
|
ThreadWorkloadClass = 50,
|
|
MaxThreadInfoClass = 51,
|
|
}}
|
|
STRUCT!{struct PAGE_PRIORITY_INFORMATION {
|
|
PagePriority: ULONG,
|
|
}}
|
|
pub type PPAGE_PRIORITY_INFORMATION = *mut PAGE_PRIORITY_INFORMATION;
|
|
STRUCT!{struct PROCESS_BASIC_INFORMATION {
|
|
ExitStatus: NTSTATUS,
|
|
PebBaseAddress: PPEB,
|
|
AffinityMask: ULONG_PTR,
|
|
BasePriority: KPRIORITY,
|
|
UniqueProcessId: HANDLE,
|
|
InheritedFromUniqueProcessId: HANDLE,
|
|
}}
|
|
pub type PPROCESS_BASIC_INFORMATION = *mut PROCESS_BASIC_INFORMATION;
|
|
STRUCT!{struct PROCESS_EXTENDED_BASIC_INFORMATION {
|
|
Size: SIZE_T,
|
|
BasicInfo: PROCESS_BASIC_INFORMATION,
|
|
Flags: ULONG,
|
|
}}
|
|
BITFIELD!{PROCESS_EXTENDED_BASIC_INFORMATION Flags: ULONG [
|
|
IsProtectedProcess set_IsProtectedProcess[0..1],
|
|
IsWow64Process set_IsWow64Process[1..2],
|
|
IsProcessDeleting set_IsProcessDeleting[2..3],
|
|
IsCrossSessionCreate set_IsCrossSessionCreate[3..4],
|
|
IsFrozen set_IsFrozen[4..5],
|
|
IsBackground set_IsBackground[5..6],
|
|
IsStronglyNamed set_IsStronglyNamed[6..7],
|
|
IsSecureProcess set_IsSecureProcess[7..8],
|
|
IsSubsystemProcess set_IsSubsystemProcess[8..9],
|
|
SpareBits set_SpareBits[9..32],
|
|
]}
|
|
pub type PPROCESS_EXTENDED_BASIC_INFORMATION = *mut PROCESS_EXTENDED_BASIC_INFORMATION;
|
|
STRUCT!{struct VM_COUNTERS {
|
|
PeakVirtualSize: SIZE_T,
|
|
VirtualSize: SIZE_T,
|
|
PageFaultCount: ULONG,
|
|
PeakWorkingSetSize: SIZE_T,
|
|
WorkingSetSize: SIZE_T,
|
|
QuotaPeakPagedPoolUsage: SIZE_T,
|
|
QuotaPagedPoolUsage: SIZE_T,
|
|
QuotaPeakNonPagedPoolUsage: SIZE_T,
|
|
QuotaNonPagedPoolUsage: SIZE_T,
|
|
PagefileUsage: SIZE_T,
|
|
PeakPagefileUsage: SIZE_T,
|
|
}}
|
|
pub type PVM_COUNTERS = *mut VM_COUNTERS;
|
|
STRUCT!{struct VM_COUNTERS_EX {
|
|
PeakVirtualSize: SIZE_T,
|
|
VirtualSize: SIZE_T,
|
|
PageFaultCount: ULONG,
|
|
PeakWorkingSetSize: SIZE_T,
|
|
WorkingSetSize: SIZE_T,
|
|
QuotaPeakPagedPoolUsage: SIZE_T,
|
|
QuotaPagedPoolUsage: SIZE_T,
|
|
QuotaPeakNonPagedPoolUsage: SIZE_T,
|
|
QuotaNonPagedPoolUsage: SIZE_T,
|
|
PagefileUsage: SIZE_T,
|
|
PeakPagefileUsage: SIZE_T,
|
|
PrivateUsage: SIZE_T,
|
|
}}
|
|
pub type PVM_COUNTERS_EX = *mut VM_COUNTERS_EX;
|
|
STRUCT!{struct VM_COUNTERS_EX2 {
|
|
CountersEx: VM_COUNTERS_EX,
|
|
PrivateWorkingSetSize: SIZE_T,
|
|
SharedCommitUsage: SIZE_T,
|
|
}}
|
|
pub type PVM_COUNTERS_EX2 = *mut VM_COUNTERS_EX2;
|
|
STRUCT!{struct KERNEL_USER_TIMES {
|
|
CreateTime: LARGE_INTEGER,
|
|
ExitTime: LARGE_INTEGER,
|
|
KernelTime: LARGE_INTEGER,
|
|
UserTime: LARGE_INTEGER,
|
|
}}
|
|
pub type PKERNEL_USER_TIMES = *mut KERNEL_USER_TIMES;
|
|
STRUCT!{struct POOLED_USAGE_AND_LIMITS {
|
|
PeakPagedPoolUsage: SIZE_T,
|
|
PagedPoolUsage: SIZE_T,
|
|
PagedPoolLimit: SIZE_T,
|
|
PeakNonPagedPoolUsage: SIZE_T,
|
|
NonPagedPoolUsage: SIZE_T,
|
|
NonPagedPoolLimit: SIZE_T,
|
|
PeakPagefileUsage: SIZE_T,
|
|
PagefileUsage: SIZE_T,
|
|
PagefileLimit: SIZE_T,
|
|
}}
|
|
pub type PPOOLED_USAGE_AND_LIMITS = *mut POOLED_USAGE_AND_LIMITS;
|
|
pub const PROCESS_EXCEPTION_PORT_ALL_STATE_BITS: ULONG_PTR = 0x00000003;
|
|
pub const PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS: ULONG_PTR =
|
|
(1 << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1;
|
|
STRUCT!{struct PROCESS_EXCEPTION_PORT {
|
|
ExceptionPortHandle: HANDLE,
|
|
StateFlags: ULONG,
|
|
}}
|
|
pub type PPROCESS_EXCEPTION_PORT = *mut PROCESS_EXCEPTION_PORT;
|
|
STRUCT!{struct PROCESS_ACCESS_TOKEN {
|
|
Token: HANDLE,
|
|
Thread: HANDLE,
|
|
}}
|
|
pub type PPROCESS_ACCESS_TOKEN = *mut PROCESS_ACCESS_TOKEN;
|
|
STRUCT!{struct PROCESS_LDT_INFORMATION {
|
|
Start: ULONG,
|
|
Length: ULONG,
|
|
LdtEntries: [LDT_ENTRY; 1],
|
|
}}
|
|
pub type PPROCESS_LDT_INFORMATION = *mut PROCESS_LDT_INFORMATION;
|
|
STRUCT!{struct PROCESS_LDT_SIZE {
|
|
Length: ULONG,
|
|
}}
|
|
pub type PPROCESS_LDT_SIZE = *mut PROCESS_LDT_SIZE;
|
|
STRUCT!{struct PROCESS_WS_WATCH_INFORMATION {
|
|
FaultingPc: PVOID,
|
|
FaultingVa: PVOID,
|
|
}}
|
|
pub type PPROCESS_WS_WATCH_INFORMATION = *mut PROCESS_WS_WATCH_INFORMATION;
|
|
STRUCT!{struct PROCESS_WS_WATCH_INFORMATION_EX {
|
|
BasicInfo: PROCESS_WS_WATCH_INFORMATION,
|
|
FaultingThreadId: ULONG_PTR,
|
|
Flags: ULONG_PTR,
|
|
}}
|
|
pub type PPROCESS_WS_WATCH_INFORMATION_EX = *mut PROCESS_WS_WATCH_INFORMATION_EX;
|
|
pub const PROCESS_PRIORITY_CLASS_UNKNOWN: u32 = 0;
|
|
pub const PROCESS_PRIORITY_CLASS_IDLE: u32 = 1;
|
|
pub const PROCESS_PRIORITY_CLASS_NORMAL: u32 = 2;
|
|
pub const PROCESS_PRIORITY_CLASS_HIGH: u32 = 3;
|
|
pub const PROCESS_PRIORITY_CLASS_REALTIME: u32 = 4;
|
|
pub const PROCESS_PRIORITY_CLASS_BELOW_NORMAL: u32 = 5;
|
|
pub const PROCESS_PRIORITY_CLASS_ABOVE_NORMAL: u32 = 6;
|
|
STRUCT!{struct PROCESS_PRIORITY_CLASS {
|
|
Foreground: BOOLEAN,
|
|
PriorityClass: UCHAR,
|
|
}}
|
|
pub type PPROCESS_PRIORITY_CLASS = *mut PROCESS_PRIORITY_CLASS;
|
|
STRUCT!{struct PROCESS_FOREGROUND_BACKGROUND {
|
|
Foreground: BOOLEAN,
|
|
}}
|
|
pub type PPROCESS_FOREGROUND_BACKGROUND = *mut PROCESS_FOREGROUND_BACKGROUND;
|
|
STRUCT!{struct PROCESS_DEVICEMAP_INFORMATION_Set {
|
|
DirectoryHandle: HANDLE,
|
|
}}
|
|
STRUCT!{struct PROCESS_DEVICEMAP_INFORMATION_Query {
|
|
DriveMap: ULONG,
|
|
DriveType: [UCHAR; 32],
|
|
}}
|
|
UNION!{union PROCESS_DEVICEMAP_INFORMATION {
|
|
Set: PROCESS_DEVICEMAP_INFORMATION_Set,
|
|
Query: PROCESS_DEVICEMAP_INFORMATION_Query,
|
|
}}
|
|
pub type PPROCESS_DEVICEMAP_INFORMATION = *mut PROCESS_DEVICEMAP_INFORMATION;
|
|
pub const PROCESS_LUID_DOSDEVICES_ONLY: ULONG = 0x00000001;
|
|
STRUCT!{struct PROCESS_DEVICEMAP_INFORMATION_EX_u_Set {
|
|
DirectoryHandle: HANDLE,
|
|
}}
|
|
STRUCT!{struct PROCESS_DEVICEMAP_INFORMATION_EX_u_Query {
|
|
DriveMap: ULONG,
|
|
DriveType: [UCHAR; 32],
|
|
}}
|
|
UNION!{union PROCESS_DEVICEMAP_INFORMATION_EX_u {
|
|
Set: PROCESS_DEVICEMAP_INFORMATION_EX_u_Set,
|
|
Query: PROCESS_DEVICEMAP_INFORMATION_EX_u_Query,
|
|
}}
|
|
STRUCT!{struct PROCESS_DEVICEMAP_INFORMATION_EX {
|
|
u: PROCESS_DEVICEMAP_INFORMATION_EX_u,
|
|
Flags: ULONG,
|
|
}}
|
|
pub type PPROCESS_DEVICEMAP_INFORMATION_EX = *mut PROCESS_DEVICEMAP_INFORMATION_EX;
|
|
STRUCT!{struct PROCESS_SESSION_INFORMATION {
|
|
SessionId: ULONG,
|
|
}}
|
|
pub type PPROCESS_SESSION_INFORMATION = *mut PROCESS_SESSION_INFORMATION;
|
|
pub const PROCESS_HANDLE_EXCEPTIONS_ENABLED: ULONG = 0x00000001;
|
|
pub const PROCESS_HANDLE_RAISE_EXCEPTION_ON_INVALID_HANDLE_CLOSE_DISABLED: ULONG = 0x00000000;
|
|
pub const PROCESS_HANDLE_RAISE_EXCEPTION_ON_INVALID_HANDLE_CLOSE_ENABLED: ULONG = 0x00000001;
|
|
STRUCT!{struct PROCESS_HANDLE_TRACING_ENABLE {
|
|
Flags: ULONG,
|
|
}}
|
|
pub type PPROCESS_HANDLE_TRACING_ENABLE = *mut PROCESS_HANDLE_TRACING_ENABLE;
|
|
pub const PROCESS_HANDLE_TRACING_MAX_SLOTS: ULONG = 0x20000;
|
|
STRUCT!{struct PROCESS_HANDLE_TRACING_ENABLE_EX {
|
|
Flags: ULONG,
|
|
TotalSlots: ULONG,
|
|
}}
|
|
pub type PPROCESS_HANDLE_TRACING_ENABLE_EX = *mut PROCESS_HANDLE_TRACING_ENABLE_EX;
|
|
pub const PROCESS_HANDLE_TRACING_MAX_STACKS: usize = 16;
|
|
pub const PROCESS_HANDLE_TRACE_TYPE_OPEN: ULONG = 1;
|
|
pub const PROCESS_HANDLE_TRACE_TYPE_CLOSE: ULONG = 2;
|
|
pub const PROCESS_HANDLE_TRACE_TYPE_BADREF: ULONG = 3;
|
|
STRUCT!{struct PROCESS_HANDLE_TRACING_ENTRY {
|
|
Handle: HANDLE,
|
|
ClientId: CLIENT_ID,
|
|
Type: ULONG,
|
|
Stacks: [PVOID; PROCESS_HANDLE_TRACING_MAX_STACKS],
|
|
}}
|
|
pub type PPROCESS_HANDLE_TRACING_ENTRY = *mut PROCESS_HANDLE_TRACING_ENTRY;
|
|
STRUCT!{struct PROCESS_HANDLE_TRACING_QUERY {
|
|
Handle: HANDLE,
|
|
TotalTraces: ULONG,
|
|
HandleTrace: [PROCESS_HANDLE_TRACING_ENTRY; 1],
|
|
}}
|
|
pub type PPROCESS_HANDLE_TRACING_QUERY = *mut PROCESS_HANDLE_TRACING_QUERY;
|
|
STRUCT!{struct THREAD_TLS_INFORMATION {
|
|
Flags: ULONG,
|
|
NewTlsData: PVOID,
|
|
OldTlsData: PVOID,
|
|
ThreadId: HANDLE,
|
|
}}
|
|
pub type PTHREAD_TLS_INFORMATION = *mut THREAD_TLS_INFORMATION;
|
|
ENUM!{enum PROCESS_TLS_INFORMATION_TYPE {
|
|
ProcessTlsReplaceIndex = 0,
|
|
ProcessTlsReplaceVector = 1,
|
|
MaxProcessTlsOperation = 2,
|
|
}}
|
|
pub type PPROCESS_TLS_INFORMATION_TYPE = *mut PROCESS_TLS_INFORMATION_TYPE;
|
|
STRUCT!{struct PROCESS_TLS_INFORMATION {
|
|
Flags: ULONG,
|
|
OperationType: ULONG,
|
|
ThreadDataCount: ULONG,
|
|
TlsIndex: ULONG,
|
|
PreviousCount: ULONG,
|
|
ThreadData: [THREAD_TLS_INFORMATION; 1],
|
|
}}
|
|
pub type PPROCESS_TLS_INFORMATION = *mut PROCESS_TLS_INFORMATION;
|
|
STRUCT!{struct PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION {
|
|
Version: ULONG,
|
|
Reserved: ULONG,
|
|
Callback: PVOID,
|
|
}}
|
|
pub type PPROCESS_INSTRUMENTATION_CALLBACK_INFORMATION =
|
|
*mut PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION;
|
|
STRUCT!{struct PROCESS_STACK_ALLOCATION_INFORMATION {
|
|
ReserveSize: SIZE_T,
|
|
ZeroBits: SIZE_T,
|
|
StackBase: PVOID,
|
|
}}
|
|
pub type PPROCESS_STACK_ALLOCATION_INFORMATION = *mut PROCESS_STACK_ALLOCATION_INFORMATION;
|
|
STRUCT!{struct PROCESS_STACK_ALLOCATION_INFORMATION_EX {
|
|
PreferredNode: ULONG,
|
|
Reserved0: ULONG,
|
|
Reserved1: ULONG,
|
|
Reserved2: ULONG,
|
|
AllocInfo: PROCESS_STACK_ALLOCATION_INFORMATION,
|
|
}}
|
|
pub type PPROCESS_STACK_ALLOCATION_INFORMATION_EX = *mut PROCESS_STACK_ALLOCATION_INFORMATION_EX;
|
|
STRUCT!{struct PROCESS_AFFINITY_UPDATE_MODE {
|
|
Flags: ULONG,
|
|
}}
|
|
BITFIELD!{PROCESS_AFFINITY_UPDATE_MODE Flags: ULONG [
|
|
EnableAutoUpdate set_EnableAutoUpdate[0..1],
|
|
Permanent set_Permanent[1..2],
|
|
Reserved set_Reserved[2..32],
|
|
]}
|
|
pub type PPROCESS_AFFINITY_UPDATE_MODE = *mut PROCESS_AFFINITY_UPDATE_MODE;
|
|
STRUCT!{struct PROCESS_MEMORY_ALLOCATION_MODE {
|
|
Flags: ULONG,
|
|
}}
|
|
BITFIELD!{PROCESS_MEMORY_ALLOCATION_MODE Flags: ULONG [
|
|
TopDown set_TopDown[0..1],
|
|
Reserved set_Reserved[1..32],
|
|
]}
|
|
pub type PPROCESS_MEMORY_ALLOCATION_MODE = *mut PROCESS_MEMORY_ALLOCATION_MODE;
|
|
STRUCT!{struct PROCESS_HANDLE_INFORMATION {
|
|
HandleCount: ULONG,
|
|
HandleCountHighWatermark: ULONG,
|
|
}}
|
|
pub type PPROCESS_HANDLE_INFORMATION = *mut PROCESS_HANDLE_INFORMATION;
|
|
STRUCT!{struct PROCESS_CYCLE_TIME_INFORMATION {
|
|
AccumulatedCycles: ULONGLONG,
|
|
CurrentCycleCount: ULONGLONG,
|
|
}}
|
|
pub type PPROCESS_CYCLE_TIME_INFORMATION = *mut PROCESS_CYCLE_TIME_INFORMATION;
|
|
STRUCT!{struct PROCESS_WINDOW_INFORMATION {
|
|
WindowFlags: ULONG,
|
|
WindowTitleLength: USHORT,
|
|
WindowTitle: [WCHAR; 1],
|
|
}}
|
|
pub type PPROCESS_WINDOW_INFORMATION = *mut PROCESS_WINDOW_INFORMATION;
|
|
STRUCT!{struct PROCESS_HANDLE_TABLE_ENTRY_INFO {
|
|
HandleValue: HANDLE,
|
|
HandleCount: ULONG_PTR,
|
|
PointerCount: ULONG_PTR,
|
|
GrantedAccess: ULONG,
|
|
ObjectTypeIndex: ULONG,
|
|
HandleAttributes: ULONG,
|
|
Reserved: ULONG,
|
|
}}
|
|
pub type PPROCESS_HANDLE_TABLE_ENTRY_INFO = *mut PROCESS_HANDLE_TABLE_ENTRY_INFO;
|
|
STRUCT!{struct PROCESS_HANDLE_SNAPSHOT_INFORMATION {
|
|
NumberOfHandles: ULONG_PTR,
|
|
Reserved: ULONG_PTR,
|
|
Handles: [PROCESS_HANDLE_TABLE_ENTRY_INFO; 1],
|
|
}}
|
|
pub type PPROCESS_HANDLE_SNAPSHOT_INFORMATION = *mut PROCESS_HANDLE_SNAPSHOT_INFORMATION;
|
|
UNION!{union PROCESS_MITIGATION_POLICY_INFORMATION_u {
|
|
ASLRPolicy: PROCESS_MITIGATION_ASLR_POLICY,
|
|
StrictHandleCheckPolicy: PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY,
|
|
SystemCallDisablePolicy: PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY,
|
|
ExtensionPointDisablePolicy: PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY,
|
|
DynamicCodePolicy: PROCESS_MITIGATION_DYNAMIC_CODE_POLICY,
|
|
ControlFlowGuardPolicy: PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY,
|
|
SignaturePolicy: PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY,
|
|
FontDisablePolicy: PROCESS_MITIGATION_FONT_DISABLE_POLICY,
|
|
ImageLoadPolicy: PROCESS_MITIGATION_IMAGE_LOAD_POLICY,
|
|
SystemCallFilterPolicy: PROCESS_MITIGATION_SYSTEM_CALL_FILTER_POLICY,
|
|
PayloadRestrictionPolicy: PROCESS_MITIGATION_PAYLOAD_RESTRICTION_POLICY,
|
|
ChildProcessPolicy: PROCESS_MITIGATION_CHILD_PROCESS_POLICY,
|
|
// SideChannelIsolationPolicy: PROCESS_MITIGATION_SIDE_CHANNEL_ISOLATION_POLICY, //TODO
|
|
}}
|
|
STRUCT!{struct PROCESS_MITIGATION_POLICY_INFORMATION {
|
|
Policy: PROCESS_MITIGATION_POLICY,
|
|
u: PROCESS_MITIGATION_POLICY_INFORMATION_u,
|
|
}}
|
|
pub type PPROCESS_MITIGATION_POLICY_INFORMATION = *mut PROCESS_MITIGATION_POLICY_INFORMATION;
|
|
STRUCT!{struct PROCESS_KEEPALIVE_COUNT_INFORMATION {
|
|
WakeCount: ULONG,
|
|
NoWakeCount: ULONG,
|
|
}}
|
|
pub type PPROCESS_KEEPALIVE_COUNT_INFORMATION = *mut PROCESS_KEEPALIVE_COUNT_INFORMATION;
|
|
STRUCT!{struct PROCESS_REVOKE_FILE_HANDLES_INFORMATION {
|
|
TargetDevicePath: UNICODE_STRING,
|
|
}}
|
|
pub type PPROCESS_REVOKE_FILE_HANDLES_INFORMATION = *mut PROCESS_REVOKE_FILE_HANDLES_INFORMATION;
|
|
ENUM!{enum PROCESS_WORKING_SET_OPERATION {
|
|
ProcessWorkingSetSwap = 0,
|
|
ProcessWorkingSetEmpty = 1,
|
|
ProcessWorkingSetOperationMax = 2,
|
|
}}
|
|
STRUCT!{struct PROCESS_WORKING_SET_CONTROL {
|
|
Version: ULONG,
|
|
Operation: PROCESS_WORKING_SET_OPERATION,
|
|
Flags: ULONG,
|
|
}}
|
|
pub type PPROCESS_WORKING_SET_CONTROL = *mut PROCESS_WORKING_SET_CONTROL;
|
|
ENUM!{enum PS_PROTECTED_TYPE {
|
|
PsProtectedTypeNone = 0,
|
|
PsProtectedTypeProtectedLight = 1,
|
|
PsProtectedTypeProtected = 2,
|
|
PsProtectedTypeMax = 3,
|
|
}}
|
|
ENUM!{enum PS_PROTECTED_SIGNER {
|
|
PsProtectedSignerNone = 0,
|
|
PsProtectedSignerAuthenticode = 1,
|
|
PsProtectedSignerCodeGen = 2,
|
|
PsProtectedSignerAntimalware = 3,
|
|
PsProtectedSignerLsa = 4,
|
|
PsProtectedSignerWindows = 5,
|
|
PsProtectedSignerWinTcb = 6,
|
|
PsProtectedSignerWinSystem = 7,
|
|
PsProtectedSignerApp = 8,
|
|
PsProtectedSignerMax = 9,
|
|
}}
|
|
pub const PS_PROTECTED_SIGNER_MASK: UCHAR = 0xFF;
|
|
pub const PS_PROTECTED_AUDIT_MASK: UCHAR = 0x08;
|
|
pub const PS_PROTECTED_TYPE_MASK: UCHAR = 0x07;
|
|
#[inline]
|
|
pub const fn PsProtectedValue(
|
|
aSigner: PS_PROTECTED_SIGNER,
|
|
aAudit: u8,
|
|
aType: PS_PROTECTED_TYPE,
|
|
) -> UCHAR {
|
|
(aSigner as u8 & PS_PROTECTED_SIGNER_MASK) << 4 | (aAudit & PS_PROTECTED_AUDIT_MASK) << 3
|
|
| (aType as u8 & PS_PROTECTED_TYPE_MASK)
|
|
}
|
|
#[inline]
|
|
pub fn InitializePsProtection(
|
|
aProtectionLevelPtr: &mut PS_PROTECTION,
|
|
aSigner: PS_PROTECTED_SIGNER,
|
|
aAudit: u8,
|
|
aType: PS_PROTECTED_TYPE,
|
|
) {
|
|
aProtectionLevelPtr.set_Signer(aSigner as u8);
|
|
aProtectionLevelPtr.set_Audit(aAudit);
|
|
aProtectionLevelPtr.set_Type(aType as u8);
|
|
}
|
|
STRUCT!{struct PS_PROTECTION {
|
|
Level: UCHAR,
|
|
}}
|
|
pub type PPS_PROTECTION = *mut PS_PROTECTION;
|
|
BITFIELD!{PS_PROTECTION Level: UCHAR [
|
|
Type set_Type[0..3],
|
|
Audit set_Audit[3..4],
|
|
Signer set_Signer[4..8],
|
|
]}
|
|
STRUCT!{struct PROCESS_FAULT_INFORMATION {
|
|
FaultFlags: ULONG,
|
|
AdditionalInfo: ULONG,
|
|
}}
|
|
pub type PPROCESS_FAULT_INFORMATION = *mut PROCESS_FAULT_INFORMATION;
|
|
STRUCT!{struct PROCESS_TELEMETRY_ID_INFORMATION {
|
|
HeaderSize: ULONG,
|
|
ProcessId: ULONG,
|
|
ProcessStartKey: ULONGLONG,
|
|
CreateTime: ULONGLONG,
|
|
CreateInterruptTime: ULONGLONG,
|
|
CreateUnbiasedInterruptTime: ULONGLONG,
|
|
ProcessSequenceNumber: ULONGLONG,
|
|
SessionCreateTime: ULONGLONG,
|
|
SessionId: ULONG,
|
|
BootId: ULONG,
|
|
ImageChecksum: ULONG,
|
|
ImageTimeDateStamp: ULONG,
|
|
UserSidOffset: ULONG,
|
|
ImagePathOffset: ULONG,
|
|
PackageNameOffset: ULONG,
|
|
RelativeAppNameOffset: ULONG,
|
|
CommandLineOffset: ULONG,
|
|
}}
|
|
pub type PPROCESS_TELEMETRY_ID_INFORMATION = *mut PROCESS_TELEMETRY_ID_INFORMATION;
|
|
STRUCT!{struct PROCESS_COMMIT_RELEASE_INFORMATION {
|
|
Version: ULONG,
|
|
s: ULONG,
|
|
CommitDebt: SIZE_T,
|
|
CommittedMemResetSize: SIZE_T,
|
|
RepurposedMemResetSize: SIZE_T,
|
|
}}
|
|
BITFIELD!{PROCESS_COMMIT_RELEASE_INFORMATION s: ULONG [
|
|
Eligible set_Eligible[0..1],
|
|
ReleaseRepurposedMemResetCommit set_ReleaseRepurposedMemResetCommit[1..2],
|
|
ForceReleaseMemResetCommit set_ForceReleaseMemResetCommit[2..3],
|
|
Spare set_Spare[3..32],
|
|
]}
|
|
pub type PPROCESS_COMMIT_RELEASE_INFORMATION = *mut PROCESS_COMMIT_RELEASE_INFORMATION;
|
|
STRUCT!{struct PROCESS_JOB_MEMORY_INFO {
|
|
SharedCommitUsage: ULONGLONG,
|
|
PrivateCommitUsage: ULONGLONG,
|
|
PeakPrivateCommitUsage: ULONGLONG,
|
|
PrivateCommitLimit: ULONGLONG,
|
|
TotalCommitLimit: ULONGLONG,
|
|
}}
|
|
pub type PPROCESS_JOB_MEMORY_INFO = *mut PROCESS_JOB_MEMORY_INFO;
|
|
STRUCT!{struct PROCESS_CHILD_PROCESS_INFORMATION {
|
|
ProhibitChildProcesses: BOOLEAN,
|
|
AlwaysAllowSecureChildProcess: BOOLEAN,
|
|
AuditProhibitChildProcesses: BOOLEAN,
|
|
}}
|
|
pub type PPROCESS_CHILD_PROCESS_INFORMATION = *mut PROCESS_CHILD_PROCESS_INFORMATION;
|
|
STRUCT!{struct PROCESS_WAKE_INFORMATION {
|
|
NotificationChannel: ULONGLONG,
|
|
WakeCounters: [ULONG; 7],
|
|
WakeFilter: *mut JOBOBJECT_WAKE_FILTER,
|
|
}}
|
|
pub type PPROCESS_WAKE_INFORMATION = *mut PROCESS_WAKE_INFORMATION;
|
|
STRUCT!{struct PROCESS_ENERGY_TRACKING_STATE {
|
|
StateUpdateMask: ULONG,
|
|
StateDesiredValue: ULONG,
|
|
StateSequence: ULONG,
|
|
UpdateTag: ULONG,
|
|
Tag: [WCHAR; 64],
|
|
}}
|
|
pub type PPROCESS_ENERGY_TRACKING_STATE = *mut PROCESS_ENERGY_TRACKING_STATE;
|
|
BITFIELD!{PROCESS_ENERGY_TRACKING_STATE UpdateTag: ULONG [
|
|
UpdateTag set_UpdateTag[0..1],
|
|
]}
|
|
STRUCT!{struct MANAGE_WRITES_TO_EXECUTABLE_MEMORY {
|
|
BitFields: ULONG,
|
|
}}
|
|
BITFIELD!{MANAGE_WRITES_TO_EXECUTABLE_MEMORY BitFields: ULONG [
|
|
Machine set_Machine[0..16],
|
|
KernelMode set_KernelMode[16..17],
|
|
UserMode set_UserMode[17..18],
|
|
Native set_Native[18..19],
|
|
Process set_Process[19..20],
|
|
ReservedZero0 set_ReservedZero0[20..32],
|
|
]}
|
|
pub type PMANAGE_WRITES_TO_EXECUTABLE_MEMORY = *mut MANAGE_WRITES_TO_EXECUTABLE_MEMORY;
|
|
pub const PROCESS_READWRITEVM_LOGGING_ENABLE_READVM: UCHAR = 1;
|
|
pub const PROCESS_READWRITEVM_LOGGING_ENABLE_WRITEVM: UCHAR = 2;
|
|
pub const PROCESS_READWRITEVM_LOGGING_ENABLE_READVM_V: UCHAR = 1;
|
|
pub const PROCESS_READWRITEVM_LOGGING_ENABLE_WRITEVM_V: UCHAR = 2;
|
|
STRUCT!{struct PROCESS_READWRITEVM_LOGGING_INFORMATION {
|
|
Flags: UCHAR,
|
|
}}
|
|
BITFIELD!{PROCESS_READWRITEVM_LOGGING_INFORMATION Flags: UCHAR [
|
|
EnableReadVmLogging set_EnableReadVmLogging[0..1],
|
|
EnableWriteVmLogging set_EnableWriteVmLogging[1..2],
|
|
Unused set_Unused[2..8],
|
|
]}
|
|
UNION!{union PROCESS_UPTIME_INFORMATION_u {
|
|
HangCount: ULONG,
|
|
GhostCount: ULONG,
|
|
Crashed: ULONG,
|
|
Terminated: ULONG,
|
|
}}
|
|
pub type PPROCESS_READWRITEVM_LOGGING_INFORMATION = *mut PROCESS_READWRITEVM_LOGGING_INFORMATION;
|
|
STRUCT!{struct PROCESS_UPTIME_INFORMATION {
|
|
QueryInterruptTime: ULONGLONG,
|
|
QueryUnbiasedTime: ULONGLONG,
|
|
EndInterruptTime: ULONGLONG,
|
|
TimeSinceCreation: ULONGLONG,
|
|
Uptime: ULONGLONG,
|
|
SuspendedTime: ULONGLONG,
|
|
u: PROCESS_UPTIME_INFORMATION_u,
|
|
}}
|
|
pub type PPROCESS_UPTIME_INFORMATION = *mut PROCESS_UPTIME_INFORMATION;
|
|
STRUCT!{struct PROCESS_SYSTEM_RESOURCE_MANAGEMENT {
|
|
Flags: ULONG,
|
|
}}
|
|
pub type PPROCESS_SYSTEM_RESOURCE_MANAGEMENT = *mut PROCESS_SYSTEM_RESOURCE_MANAGEMENT;
|
|
BITFIELD!{PROCESS_SYSTEM_RESOURCE_MANAGEMENT Flags: ULONG [
|
|
Foreground set_Foreground[0..1],
|
|
Reserved set_Reserved[1..32],
|
|
]}
|
|
STRUCT!{struct PROCESS_SECURITY_DOMAIN_INFORMATION {
|
|
SecurityDomain: ULONGLONG,
|
|
}}
|
|
pub type PPROCESS_SECURITY_DOMAIN_INFORMATION = *mut PROCESS_SECURITY_DOMAIN_INFORMATION;
|
|
STRUCT!{struct PROCESS_COMBINE_SECURITY_DOMAINS_INFORMATION {
|
|
ProcessHandle: HANDLE,
|
|
}}
|
|
pub type PPROCESS_COMBINE_SECURITY_DOMAINS_INFORMATION =
|
|
*mut PROCESS_COMBINE_SECURITY_DOMAINS_INFORMATION;
|
|
STRUCT!{struct PROCESS_LOGGING_INFORMATION {
|
|
Flags: ULONG,
|
|
BitFields: ULONG,
|
|
}}
|
|
BITFIELD!{PROCESS_LOGGING_INFORMATION BitFields: ULONG [
|
|
EnableReadVmLogging set_EnableReadVmLogging[0..1],
|
|
EnableWriteVmLogging set_EnableWriteVmLogging[1..2],
|
|
EnableProcessSuspendResumeLogging set_EnableProcessSuspendResumeLogging[2..3],
|
|
EnableThreadSuspendResumeLogging set_EnableThreadSuspendResumeLogging[3..4],
|
|
Reserved set_Reserved[4..32],
|
|
]}
|
|
pub type PPROCESS_LOGGING_INFORMATION = *mut PROCESS_LOGGING_INFORMATION;
|
|
STRUCT!{struct PROCESS_LEAP_SECOND_INFORMATION {
|
|
Flags: ULONG,
|
|
Reserved: ULONG,
|
|
}}
|
|
pub type PPROCESS_LEAP_SECOND_INFORMATION = *mut PROCESS_LEAP_SECOND_INFORMATION;
|
|
STRUCT!{struct THREAD_BASIC_INFORMATION {
|
|
ExitStatus: NTSTATUS,
|
|
TebBaseAddress: PTEB,
|
|
ClientId: CLIENT_ID,
|
|
AffinityMask: ULONG_PTR,
|
|
Priority: KPRIORITY,
|
|
BasePriority: LONG,
|
|
}}
|
|
pub type PTHREAD_BASIC_INFORMATION = *mut THREAD_BASIC_INFORMATION;
|
|
STRUCT!{struct THREAD_LAST_SYSCALL_INFORMATION {
|
|
FirstArgument: PVOID,
|
|
SystemCallNumber: USHORT,
|
|
Pad: [USHORT; 1],
|
|
WaitTime: ULONG64,
|
|
}}
|
|
pub type PTHREAD_LAST_SYSCALL_INFORMATION = *mut THREAD_LAST_SYSCALL_INFORMATION;
|
|
STRUCT!{struct THREAD_CYCLE_TIME_INFORMATION {
|
|
AccumulatedCycles: ULONGLONG,
|
|
CurrentCycleCount: ULONGLONG,
|
|
}}
|
|
pub type PTHREAD_CYCLE_TIME_INFORMATION = *mut THREAD_CYCLE_TIME_INFORMATION;
|
|
STRUCT!{struct THREAD_TEB_INFORMATION {
|
|
TebInformation: PVOID,
|
|
TebOffset: ULONG,
|
|
BytesToRead: ULONG,
|
|
}}
|
|
pub type PTHREAD_TEB_INFORMATION = *mut THREAD_TEB_INFORMATION;
|
|
STRUCT!{struct COUNTER_READING {
|
|
Type: HARDWARE_COUNTER_TYPE,
|
|
Index: ULONG,
|
|
Start: ULONG64,
|
|
Total: ULONG64,
|
|
}}
|
|
pub type PCOUNTER_READING = *mut COUNTER_READING;
|
|
STRUCT!{struct THREAD_PERFORMANCE_DATA {
|
|
Size: USHORT,
|
|
Version: USHORT,
|
|
ProcessorNumber: PROCESSOR_NUMBER,
|
|
ContextSwitches: ULONG,
|
|
HwCountersCount: ULONG,
|
|
UpdateCount: ULONG64,
|
|
WaitReasonBitMap: ULONG64,
|
|
HardwareCounters: ULONG64,
|
|
CycleTime: COUNTER_READING,
|
|
HwCounters: [COUNTER_READING; MAX_HW_COUNTERS],
|
|
}}
|
|
pub type PTHREAD_PERFORMANCE_DATA = *mut THREAD_PERFORMANCE_DATA;
|
|
STRUCT!{struct THREAD_PROFILING_INFORMATION {
|
|
HardwareCounters: ULONG64,
|
|
Flags: ULONG,
|
|
Enable: ULONG,
|
|
PerformanceData: PTHREAD_PERFORMANCE_DATA,
|
|
}}
|
|
pub type PTHREAD_PROFILING_INFORMATION = *mut THREAD_PROFILING_INFORMATION;
|
|
#[cfg(target_arch = "x86_64")]
|
|
STRUCT!{#[repr(align(16))] struct RTL_UMS_CONTEXT {
|
|
Link: SINGLE_LIST_ENTRY,
|
|
__padding: u64,
|
|
Context: CONTEXT,
|
|
Teb: PVOID,
|
|
UserContext: PVOID,
|
|
ScheduledThread: ULONG,
|
|
Suspended: ULONG,
|
|
VolatileContext: ULONG,
|
|
Terminated: ULONG,
|
|
DebugActive: ULONG,
|
|
RunningOnSelfThread: ULONG,
|
|
DenyRunningOnSelfThread: ULONG,
|
|
Flags: LONG,
|
|
KernelUpdateLock: ULONG64,
|
|
PrimaryClientID: ULONG64,
|
|
ContextLock: ULONG64,
|
|
PrimaryUmsContext: *mut RTL_UMS_CONTEXT,
|
|
SwitchCount: ULONG,
|
|
KernelYieldCount: ULONG,
|
|
MixedYieldCount: ULONG,
|
|
YieldCount: ULONG,
|
|
}}
|
|
#[cfg(target_arch = "x86")]
|
|
STRUCT!{struct RTL_UMS_CONTEXT {
|
|
Link: SINGLE_LIST_ENTRY,
|
|
Context: CONTEXT,
|
|
Teb: PVOID,
|
|
UserContext: PVOID,
|
|
ScheduledThread: ULONG,
|
|
Suspended: ULONG,
|
|
VolatileContext: ULONG,
|
|
Terminated: ULONG,
|
|
DebugActive: ULONG,
|
|
RunningOnSelfThread: ULONG,
|
|
DenyRunningOnSelfThread: ULONG,
|
|
Flags: LONG,
|
|
KernelUpdateLock: ULONG64,
|
|
PrimaryClientID: ULONG64,
|
|
ContextLock: ULONG64,
|
|
PrimaryUmsContext: *mut RTL_UMS_CONTEXT,
|
|
SwitchCount: ULONG,
|
|
KernelYieldCount: ULONG,
|
|
MixedYieldCount: ULONG,
|
|
YieldCount: ULONG,
|
|
__padding: u32,
|
|
}}
|
|
pub type PRTL_UMS_CONTEXT = *mut RTL_UMS_CONTEXT;
|
|
ENUM!{enum THREAD_UMS_INFORMATION_COMMAND {
|
|
UmsInformationCommandInvalid = 0,
|
|
UmsInformationCommandAttach = 1,
|
|
UmsInformationCommandDetach = 2,
|
|
UmsInformationCommandQuery = 3,
|
|
}}
|
|
STRUCT!{struct RTL_UMS_COMPLETION_LIST {
|
|
ThreadListHead: PSINGLE_LIST_ENTRY,
|
|
CompletionEvent: PVOID,
|
|
CompletionFlags: ULONG,
|
|
InternalListHead: SINGLE_LIST_ENTRY,
|
|
}}
|
|
pub type PRTL_UMS_COMPLETION_LIST = *mut RTL_UMS_COMPLETION_LIST;
|
|
STRUCT!{struct THREAD_UMS_INFORMATION {
|
|
Command: THREAD_UMS_INFORMATION_COMMAND,
|
|
CompletionList: PRTL_UMS_COMPLETION_LIST,
|
|
UmsContext: PRTL_UMS_CONTEXT,
|
|
Flags: ULONG,
|
|
IsUmsSchedulerThread: ULONG,
|
|
IsUmsWorkerThread: ULONG,
|
|
}}
|
|
pub type PTHREAD_UMS_INFORMATION = *mut THREAD_UMS_INFORMATION;
|
|
STRUCT!{struct THREAD_NAME_INFORMATION {
|
|
ThreadName: UNICODE_STRING,
|
|
}}
|
|
pub type PTHREAD_NAME_INFORMATION = *mut THREAD_NAME_INFORMATION;
|
|
ENUM!{enum SUBSYSTEM_INFORMATION_TYPE {
|
|
SubsystemInformationTypeWin32 = 0,
|
|
SubsystemInformationTypeWSL = 1,
|
|
MaxSubsystemInformationType = 2,
|
|
}}
|
|
ENUM!{enum THREAD_WORKLOAD_CLASS {
|
|
ThreadWorkloadClassDefault = 0,
|
|
ThreadWorkloadClassGraphics = 1,
|
|
MaxThreadWorkloadClass = 2,
|
|
}}
|
|
EXTERN!{extern "system" {
|
|
fn NtCreateProcess(
|
|
ProcessHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ParentProcess: HANDLE,
|
|
InheritObjectTable: BOOLEAN,
|
|
SectionHandle: HANDLE,
|
|
DebugPort: HANDLE,
|
|
ExceptionPort: HANDLE,
|
|
) -> NTSTATUS;
|
|
}}
|
|
pub const PROCESS_CREATE_FLAGS_BREAKAWAY: ULONG = 0x00000001;
|
|
pub const PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT: ULONG = 0x00000002;
|
|
pub const PROCESS_CREATE_FLAGS_INHERIT_HANDLES: ULONG = 0x00000004;
|
|
pub const PROCESS_CREATE_FLAGS_OVERRIDE_ADDRESS_SPACE: ULONG = 0x00000008;
|
|
pub const PROCESS_CREATE_FLAGS_LARGE_PAGES: ULONG = 0x00000010;
|
|
EXTERN!{extern "system" {
|
|
fn NtCreateProcessEx(
|
|
ProcessHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ParentProcess: HANDLE,
|
|
Flags: ULONG,
|
|
SectionHandle: HANDLE,
|
|
DebugPort: HANDLE,
|
|
ExceptionPort: HANDLE,
|
|
JobMemberLevel: ULONG,
|
|
) -> NTSTATUS;
|
|
fn NtOpenProcess(
|
|
ProcessHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ClientId: PCLIENT_ID,
|
|
) -> NTSTATUS;
|
|
fn NtTerminateProcess(
|
|
ProcessHandle: HANDLE,
|
|
ExitStatus: NTSTATUS,
|
|
) -> NTSTATUS;
|
|
fn NtSuspendProcess(
|
|
ProcessHandle: HANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtResumeProcess(
|
|
ProcessHandle: HANDLE,
|
|
) -> NTSTATUS;
|
|
}}
|
|
pub const NtCurrentProcess: HANDLE = -1isize as *mut c_void;
|
|
pub const ZwCurrentProcess: HANDLE = NtCurrentProcess;
|
|
pub const NtCurrentThread: HANDLE = -2isize as *mut c_void;
|
|
pub const ZwCurrentThread: HANDLE = NtCurrentThread;
|
|
pub const NtCurrentSession: HANDLE = -3isize as *mut c_void;
|
|
pub const ZwCurrentSession: HANDLE = NtCurrentSession;
|
|
#[inline] #[cfg(feature = "nightly")]
|
|
pub unsafe fn NtCurrentPeb() -> PPEB {
|
|
(*NtCurrentTeb()).ProcessEnvironmentBlock
|
|
}
|
|
pub const NtCurrentProcessToken: HANDLE = -4isize as *mut c_void;
|
|
pub const NtCurrentThreadToken: HANDLE = -5isize as *mut c_void;
|
|
pub const NtCurrentEffectiveToken: HANDLE = -6isize as *mut c_void;
|
|
pub const NtCurrentSilo: HANDLE = -1isize as *mut c_void;
|
|
#[inline] #[cfg(feature = "nightly")]
|
|
pub unsafe fn NtCurrentProcessId() -> HANDLE {
|
|
(*NtCurrentTeb()).ClientId.UniqueProcess
|
|
}
|
|
#[inline] #[cfg(feature = "nightly")]
|
|
pub unsafe fn NtCurrentThreadId() -> HANDLE {
|
|
(*NtCurrentTeb()).ClientId.UniqueThread
|
|
}
|
|
EXTERN!{extern "system" {
|
|
fn NtQueryInformationProcess(
|
|
ProcessHandle: HANDLE,
|
|
ProcessInformationClass: PROCESSINFOCLASS,
|
|
ProcessInformation: PVOID,
|
|
ProcessInformationLength: ULONG,
|
|
ReturnLength: PULONG,
|
|
) -> NTSTATUS;
|
|
fn NtGetNextProcess(
|
|
ProcessHandle: HANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
HandleAttributes: ULONG,
|
|
Flags: ULONG,
|
|
NewProcessHandle: PHANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtGetNextThread(
|
|
ProcessHandle: HANDLE,
|
|
ThreadHandle: HANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
HandleAttributes: ULONG,
|
|
Flags: ULONG,
|
|
NewThreadHandle: PHANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtSetInformationProcess(
|
|
ProcessHandle: HANDLE,
|
|
ProcessInformationClass: PROCESSINFOCLASS,
|
|
ProcessInformation: PVOID,
|
|
ProcessInformationLength: ULONG,
|
|
) -> NTSTATUS;
|
|
fn NtQueryPortInformationProcess() -> NTSTATUS;
|
|
fn NtCreateThread(
|
|
ThreadHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ProcessHandle: HANDLE,
|
|
ClientId: PCLIENT_ID,
|
|
ThreadContext: PCONTEXT,
|
|
InitialTeb: PINITIAL_TEB,
|
|
CreateSuspended: BOOLEAN,
|
|
) -> NTSTATUS;
|
|
fn NtOpenThread(
|
|
ThreadHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ClientId: PCLIENT_ID,
|
|
) -> NTSTATUS;
|
|
fn NtTerminateThread(
|
|
ThreadHandle: HANDLE,
|
|
ExitStatus: NTSTATUS,
|
|
) -> NTSTATUS;
|
|
fn NtSuspendThread(
|
|
ThreadHandle: HANDLE,
|
|
PreviousSuspendCount: PULONG,
|
|
) -> NTSTATUS;
|
|
fn NtResumeThread(
|
|
ThreadHandle: HANDLE,
|
|
PreviousSuspendCount: PULONG,
|
|
) -> NTSTATUS;
|
|
fn NtGetCurrentProcessorNumber() -> ULONG;
|
|
fn NtGetContextThread(
|
|
ThreadHandle: HANDLE,
|
|
ThreadContext: PCONTEXT,
|
|
) -> NTSTATUS;
|
|
fn NtSetContextThread(
|
|
ThreadHandle: HANDLE,
|
|
ThreadContext: PCONTEXT,
|
|
) -> NTSTATUS;
|
|
fn NtQueryInformationThread(
|
|
ThreadHandle: HANDLE,
|
|
ThreadInformationClass: THREADINFOCLASS,
|
|
ThreadInformation: PVOID,
|
|
ThreadInformationLength: ULONG,
|
|
ReturnLength: PULONG,
|
|
) -> NTSTATUS;
|
|
fn NtSetInformationThread(
|
|
ThreadHandle: HANDLE,
|
|
ThreadInformationClass: THREADINFOCLASS,
|
|
ThreadInformation: PVOID,
|
|
ThreadInformationLength: ULONG,
|
|
) -> NTSTATUS;
|
|
fn NtAlertThread(
|
|
ThreadHandle: HANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtAlertResumeThread(
|
|
ThreadHandle: HANDLE,
|
|
PreviousSuspendCount: PULONG,
|
|
) -> NTSTATUS;
|
|
fn NtTestAlert() -> NTSTATUS;
|
|
fn NtImpersonateThread(
|
|
ServerThreadHandle: HANDLE,
|
|
ClientThreadHandle: HANDLE,
|
|
SecurityQos: PSECURITY_QUALITY_OF_SERVICE,
|
|
) -> NTSTATUS;
|
|
fn NtRegisterThreadTerminatePort(
|
|
PortHandle: HANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtSetLdtEntries(
|
|
Selector0: ULONG,
|
|
Entry0Low: ULONG,
|
|
Entry0Hi: ULONG,
|
|
Selector1: ULONG,
|
|
Entry1Low: ULONG,
|
|
Entry1Hi: ULONG,
|
|
) -> NTSTATUS;
|
|
}}
|
|
FN!{cdecl PPS_APC_ROUTINE(
|
|
ApcArgument1: PVOID,
|
|
ApcArgument2: PVOID,
|
|
ApcArgument3: PVOID,
|
|
) -> ()}
|
|
EXTERN!{extern "system" {
|
|
fn NtQueueApcThread(
|
|
ThreadHandle: HANDLE,
|
|
ApcRoutine: PPS_APC_ROUTINE,
|
|
ApcArgument1: PVOID,
|
|
ApcArgument2: PVOID,
|
|
ApcArgument3: PVOID,
|
|
) -> NTSTATUS;
|
|
}}
|
|
pub const APC_FORCE_THREAD_SIGNAL: HANDLE = 1 as *mut c_void;
|
|
EXTERN!{extern "system" {
|
|
fn NtQueueApcThreadEx(
|
|
ThreadHandle: HANDLE,
|
|
UserApcReserveHandle: HANDLE,
|
|
ApcRoutine: PPS_APC_ROUTINE,
|
|
ApcArgument1: PVOID,
|
|
ApcArgument2: PVOID,
|
|
ApcArgument3: PVOID,
|
|
) -> NTSTATUS;
|
|
fn NtAlertThreadByThreadId(
|
|
ThreadId: HANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtWaitForAlertByThreadId(
|
|
Address: PVOID,
|
|
Timeout: PLARGE_INTEGER,
|
|
) -> NTSTATUS;
|
|
}}
|
|
pub const PS_ATTRIBUTE_NUMBER_MASK: u32 = 0x0000ffff;
|
|
pub const PS_ATTRIBUTE_THREAD: u32 = 0x00010000;
|
|
pub const PS_ATTRIBUTE_INPUT: u32 = 0x00020000;
|
|
pub const PS_ATTRIBUTE_ADDITIVE: u32 = 0x00040000;
|
|
ENUM!{enum PS_ATTRIBUTE_NUM {
|
|
PsAttributeParentProcess = 0,
|
|
PsAttributeDebugPort = 1,
|
|
PsAttributeToken = 2,
|
|
PsAttributeClientId = 3,
|
|
PsAttributeTebAddress = 4,
|
|
PsAttributeImageName = 5,
|
|
PsAttributeImageInfo = 6,
|
|
PsAttributeMemoryReserve = 7,
|
|
PsAttributePriorityClass = 8,
|
|
PsAttributeErrorMode = 9,
|
|
PsAttributeStdHandleInfo = 10,
|
|
PsAttributeHandleList = 11,
|
|
PsAttributeGroupAffinity = 12,
|
|
PsAttributePreferredNode = 13,
|
|
PsAttributeIdealProcessor = 14,
|
|
PsAttributeUmsThread = 15,
|
|
PsAttributeMitigationOptions = 16,
|
|
PsAttributeProtectionLevel = 17,
|
|
PsAttributeSecureProcess = 18,
|
|
PsAttributeJobList = 19,
|
|
PsAttributeChildProcessPolicy = 20,
|
|
PsAttributeAllApplicationPackagesPolicy = 21,
|
|
PsAttributeWin32kFilter = 22,
|
|
PsAttributeSafeOpenPromptOriginClaim = 23,
|
|
PsAttributeBnoIsolation = 24,
|
|
PsAttributeDesktopAppPolicy = 25,
|
|
PsAttributeChpe = 26,
|
|
PsAttributeMax = 27,
|
|
}}
|
|
#[inline]
|
|
pub const fn PsAttributeValue(
|
|
Number: PS_ATTRIBUTE_NUM,
|
|
Thread: bool,
|
|
Input: bool,
|
|
Additive: bool,
|
|
) -> ULONG_PTR { //fixme
|
|
(Number & PS_ATTRIBUTE_NUMBER_MASK | [0, PS_ATTRIBUTE_THREAD][Thread as usize]
|
|
| [0, PS_ATTRIBUTE_INPUT][Input as usize] | [0, PS_ATTRIBUTE_ADDITIVE][Additive as usize]
|
|
) as usize
|
|
}
|
|
pub const PS_ATTRIBUTE_PARENT_PROCESS: ULONG_PTR = 0x00060000;
|
|
pub const PS_ATTRIBUTE_DEBUG_PORT: ULONG_PTR = 0x00060001;
|
|
pub const PS_ATTRIBUTE_TOKEN: ULONG_PTR = 0x00060002;
|
|
pub const PS_ATTRIBUTE_CLIENT_ID: ULONG_PTR = 0x00010003;
|
|
pub const PS_ATTRIBUTE_TEB_ADDRESS: ULONG_PTR = 0x00010004;
|
|
pub const PS_ATTRIBUTE_IMAGE_NAME: ULONG_PTR = 0x00020005;
|
|
pub const PS_ATTRIBUTE_IMAGE_INFO: ULONG_PTR = 0x00000006;
|
|
pub const PS_ATTRIBUTE_MEMORY_RESERVE: ULONG_PTR = 0x00020007;
|
|
pub const PS_ATTRIBUTE_PRIORITY_CLASS: ULONG_PTR = 0x00020008;
|
|
pub const PS_ATTRIBUTE_ERROR_MODE: ULONG_PTR = 0x00020009;
|
|
pub const PS_ATTRIBUTE_STD_HANDLE_INFO: ULONG_PTR = 0x0002000a;
|
|
pub const PS_ATTRIBUTE_HANDLE_LIST: ULONG_PTR = 0x0002000b;
|
|
pub const PS_ATTRIBUTE_GROUP_AFFINITY: ULONG_PTR = 0x0003000c;
|
|
pub const PS_ATTRIBUTE_PREFERRED_NODE: ULONG_PTR = 0x0002000d;
|
|
pub const PS_ATTRIBUTE_IDEAL_PROCESSOR: ULONG_PTR = 0x0003000e;
|
|
pub const PS_ATTRIBUTE_UMS_THREAD: ULONG_PTR = 0x0003000f;
|
|
pub const PS_ATTRIBUTE_MITIGATION_OPTIONS: ULONG_PTR = 0x00060010;
|
|
pub const PS_ATTRIBUTE_PROTECTION_LEVEL: ULONG_PTR = 0x00060011;
|
|
pub const PS_ATTRIBUTE_SECURE_PROCESS: ULONG_PTR = 0x00020012;
|
|
pub const PS_ATTRIBUTE_JOB_LIST: ULONG_PTR = 0x00020013;
|
|
pub const PS_ATTRIBUTE_CHILD_PROCESS_POLICY: ULONG_PTR = 0x00020014;
|
|
pub const PS_ATTRIBUTE_ALL_APPLICATION_PACKAGES_POLICY: ULONG_PTR = 0x00020015;
|
|
pub const PS_ATTRIBUTE_WIN32K_FILTER: ULONG_PTR = 0x00020016;
|
|
pub const PS_ATTRIBUTE_SAFE_OPEN_PROMPT_ORIGIN_CLAIM: ULONG_PTR = 0x00020017;
|
|
pub const PS_ATTRIBUTE_BNO_ISOLATION: ULONG_PTR = 0x00020018;
|
|
pub const PS_ATTRIBUTE_DESKTOP_APP_POLICY: ULONG_PTR = 0x00020019;
|
|
UNION!{union PS_ATTRIBUTE_u {
|
|
Value: ULONG_PTR,
|
|
ValuePtr: PVOID,
|
|
}}
|
|
STRUCT!{struct PS_ATTRIBUTE {
|
|
Attribute: ULONG_PTR,
|
|
Size: SIZE_T,
|
|
u: PS_ATTRIBUTE_u,
|
|
ReturnLength: PSIZE_T,
|
|
}}
|
|
pub type PPS_ATTRIBUTE = *mut PS_ATTRIBUTE;
|
|
STRUCT!{struct PS_ATTRIBUTE_LIST {
|
|
TotalLength: SIZE_T,
|
|
Attributes: [PS_ATTRIBUTE; 1],
|
|
}}
|
|
pub type PPS_ATTRIBUTE_LIST = *mut PS_ATTRIBUTE_LIST;
|
|
STRUCT!{struct PS_MEMORY_RESERVE {
|
|
ReserveAddress: PVOID,
|
|
ReserveSize: SIZE_T,
|
|
}}
|
|
pub type PPS_MEMORY_RESERVE = *mut PS_MEMORY_RESERVE;
|
|
ENUM!{enum PS_STD_HANDLE_STATE {
|
|
PsNeverDuplicate = 0,
|
|
PsRequestDuplicate = 1,
|
|
PsAlwaysDuplicate = 2,
|
|
PsMaxStdHandleStates = 3,
|
|
}}
|
|
pub const PS_STD_INPUT_HANDLE: u32 = 0x1;
|
|
pub const PS_STD_OUTPUT_HANDLE: u32 = 0x2;
|
|
pub const PS_STD_ERROR_HANDLE: u32 = 0x4;
|
|
STRUCT!{struct PS_STD_HANDLE_INFO {
|
|
Flags: ULONG,
|
|
StdHandleSubsystemType: ULONG,
|
|
}}
|
|
pub type PPS_STD_HANDLE_INFO = *mut PS_STD_HANDLE_INFO;
|
|
BITFIELD!{PS_STD_HANDLE_INFO Flags: ULONG [
|
|
StdHandleState set_StdHandleState[0..2],
|
|
PseudoHandleMask set_PseudoHandleMask[2..5],
|
|
]}
|
|
STRUCT!{struct PS_BNO_ISOLATION_PARAMETERS {
|
|
IsolationPrefix: UNICODE_STRING,
|
|
HandleCount: ULONG,
|
|
Handles: *mut PVOID,
|
|
IsolationEnabled: BOOLEAN,
|
|
}}
|
|
pub type PPS_BNO_ISOLATION_PARAMETERS = *mut PS_BNO_ISOLATION_PARAMETERS;
|
|
ENUM!{enum PS_MITIGATION_OPTION {
|
|
PS_MITIGATION_OPTION_NX = 0,
|
|
PS_MITIGATION_OPTION_SEHOP = 1,
|
|
PS_MITIGATION_OPTION_FORCE_RELOCATE_IMAGES = 2,
|
|
PS_MITIGATION_OPTION_HEAP_TERMINATE = 3,
|
|
PS_MITIGATION_OPTION_BOTTOM_UP_ASLR = 4,
|
|
PS_MITIGATION_OPTION_HIGH_ENTROPY_ASLR = 5,
|
|
PS_MITIGATION_OPTION_STRICT_HANDLE_CHECKS = 6,
|
|
PS_MITIGATION_OPTION_WIN32K_SYSTEM_CALL_DISABLE = 7,
|
|
PS_MITIGATION_OPTION_EXTENSION_POINT_DISABLE = 8,
|
|
PS_MITIGATION_OPTION_PROHIBIT_DYNAMIC_CODE = 9,
|
|
PS_MITIGATION_OPTION_CONTROL_FLOW_GUARD = 10,
|
|
PS_MITIGATION_OPTION_BLOCK_NON_MICROSOFT_BINARIES = 11,
|
|
PS_MITIGATION_OPTION_FONT_DISABLE = 12,
|
|
PS_MITIGATION_OPTION_IMAGE_LOAD_NO_REMOTE = 13,
|
|
PS_MITIGATION_OPTION_IMAGE_LOAD_NO_LOW_LABEL = 14,
|
|
PS_MITIGATION_OPTION_IMAGE_LOAD_PREFER_SYSTEM32 = 15,
|
|
PS_MITIGATION_OPTION_RETURN_FLOW_GUARD = 16,
|
|
PS_MITIGATION_OPTION_LOADER_INTEGRITY_CONTINUITY = 17,
|
|
PS_MITIGATION_OPTION_STRICT_CONTROL_FLOW_GUARD = 18,
|
|
PS_MITIGATION_OPTION_RESTRICT_SET_THREAD_CONTEXT = 19,
|
|
PS_MITIGATION_OPTION_ROP_STACKPIVOT = 20,
|
|
PS_MITIGATION_OPTION_ROP_CALLER_CHECK = 21,
|
|
PS_MITIGATION_OPTION_ROP_SIMEXEC = 22,
|
|
PS_MITIGATION_OPTION_EXPORT_ADDRESS_FILTER = 23,
|
|
PS_MITIGATION_OPTION_EXPORT_ADDRESS_FILTER_PLUS = 24,
|
|
PS_MITIGATION_OPTION_RESTRICT_CHILD_PROCESS_CREATION = 25,
|
|
PS_MITIGATION_OPTION_IMPORT_ADDRESS_FILTER = 26,
|
|
PS_MITIGATION_OPTION_MODULE_TAMPERING_PROTECTION = 27,
|
|
PS_MITIGATION_OPTION_RESTRICT_INDIRECT_BRANCH_PREDICTION = 28,
|
|
PS_MITIGATION_OPTION_SPECULATIVE_STORE_BYPASS_DISABLE = 29,
|
|
PS_MITIGATION_OPTION_ALLOW_DOWNGRADE_DYNAMIC_CODE_POLICY = 30,
|
|
PS_MITIGATION_OPTION_CET_SHADOW_STACKS = 31,
|
|
}}
|
|
ENUM!{enum PS_CREATE_STATE {
|
|
PsCreateInitialState = 0,
|
|
PsCreateFailOnFileOpen = 1,
|
|
PsCreateFailOnSectionCreate = 2,
|
|
PsCreateFailExeFormat = 3,
|
|
PsCreateFailMachineMismatch = 4,
|
|
PsCreateFailExeName = 5,
|
|
PsCreateSuccess = 6,
|
|
PsCreateMaximumStates = 7,
|
|
}}
|
|
STRUCT!{struct PS_CREATE_INFO_u_InitState {
|
|
InitFlags: ULONG,
|
|
AdditionalFileAccess: ACCESS_MASK,
|
|
}}
|
|
BITFIELD!{PS_CREATE_INFO_u_InitState InitFlags: ULONG [
|
|
WriteOutputOnExit set_WriteOutputOnExit[0..1],
|
|
DetectManifest set_DetectManifest[1..2],
|
|
IFEOSkipDebugger set_IFEOSkipDebugger[2..3],
|
|
IFEODoNotPropagateKeyState set_IFEODoNotPropagateKeyState[3..4],
|
|
SpareBits1 set_SpareBits1[4..8],
|
|
SpareBits2 set_SpareBits2[8..16],
|
|
ProhibitedImageCharacteristics set_ProhibitedImageCharacteristics[16..32],
|
|
]}
|
|
STRUCT!{struct PS_CREATE_INFO_u_SuccessState {
|
|
OutputFlags: ULONG,
|
|
FileHandle: HANDLE,
|
|
SectionHandle: HANDLE,
|
|
UserProcessParametersNative: ULONGLONG,
|
|
UserProcessParametersWow64: ULONG,
|
|
CurrentParameterFlags: ULONG,
|
|
PebAddressNative: ULONGLONG,
|
|
PebAddressWow64: ULONG,
|
|
ManifestAddress: ULONGLONG,
|
|
ManifestSize: ULONG,
|
|
}}
|
|
BITFIELD!{PS_CREATE_INFO_u_SuccessState OutputFlags: ULONG [
|
|
ProtectedProcess set_ProtectedProcess[0..1],
|
|
AddressSpaceOverride set_AddressSpaceOverride[1..2],
|
|
DevOverrideEnabled set_DevOverrideEnabled[2..3],
|
|
ManifestDetected set_ManifestDetected[3..4],
|
|
ProtectedProcessLight set_ProtectedProcessLight[4..5],
|
|
SpareBits1 set_SpareBits1[5..8],
|
|
SpareBits2 set_SpareBits2[8..16],
|
|
SpareBits3 set_SpareBits3[16..32],
|
|
]}
|
|
UNION!{union PS_CREATE_INFO_u {
|
|
InitState: PS_CREATE_INFO_u_InitState,
|
|
FileHandle: HANDLE,
|
|
DllCharacteristics: USHORT,
|
|
IFEOKey: HANDLE,
|
|
SuccessState: PS_CREATE_INFO_u_SuccessState,
|
|
}}
|
|
STRUCT!{struct PS_CREATE_INFO {
|
|
Size: SIZE_T,
|
|
State: PS_CREATE_STATE,
|
|
u: PS_CREATE_INFO_u,
|
|
}}
|
|
pub type PPS_CREATE_INFO = *mut PS_CREATE_INFO;
|
|
pub const PROCESS_CREATE_FLAGS_LARGE_PAGE_SYSTEM_DLL: ULONG = 0x00000020;
|
|
pub const PROCESS_CREATE_FLAGS_PROTECTED_PROCESS: ULONG = 0x00000040;
|
|
pub const PROCESS_CREATE_FLAGS_CREATE_SESSION: ULONG = 0x00000080;
|
|
pub const PROCESS_CREATE_FLAGS_INHERIT_FROM_PARENT: ULONG = 0x00000100;
|
|
pub const PROCESS_CREATE_FLAGS_SUSPENDED: ULONG = 0x00000200;
|
|
pub const PROCESS_CREATE_FLAGS_EXTENDED_UNKNOWN: ULONG = 0x00000400;
|
|
EXTERN!{extern "system" {
|
|
fn NtCreateUserProcess(
|
|
ProcessHandle: PHANDLE,
|
|
ThreadHandle: PHANDLE,
|
|
ProcessDesiredAccess: ACCESS_MASK,
|
|
ThreadDesiredAccess: ACCESS_MASK,
|
|
ProcessObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ThreadObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ProcessFlags: ULONG,
|
|
ThreadFlags: ULONG,
|
|
ProcessParameters: PVOID,
|
|
CreateInfo: PPS_CREATE_INFO,
|
|
AttributeList: PPS_ATTRIBUTE_LIST,
|
|
) -> NTSTATUS;
|
|
}}
|
|
pub const THREAD_CREATE_FLAGS_CREATE_SUSPENDED: ULONG = 0x00000001;
|
|
pub const THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH: ULONG = 0x00000002;
|
|
pub const THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER: ULONG = 0x00000004;
|
|
pub const THREAD_CREATE_FLAGS_HAS_SECURITY_DESCRIPTOR: ULONG = 0x00000010;
|
|
pub const THREAD_CREATE_FLAGS_ACCESS_CHECK_IN_TARGET: ULONG = 0x00000020;
|
|
pub const THREAD_CREATE_FLAGS_INITIAL_THREAD: ULONG = 0x00000080;
|
|
EXTERN!{extern "system" {
|
|
fn NtCreateThreadEx(
|
|
ThreadHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
ProcessHandle: HANDLE,
|
|
StartRoutine: PVOID,
|
|
Argument: PVOID,
|
|
CreateFlags: ULONG,
|
|
ZeroBits: SIZE_T,
|
|
StackSize: SIZE_T,
|
|
MaximumStackSize: SIZE_T,
|
|
AttributeList: PPS_ATTRIBUTE_LIST,
|
|
) -> NTSTATUS;
|
|
}}
|
|
STRUCT!{struct JOBOBJECT_EXTENDED_ACCOUNTING_INFORMATION {
|
|
BasicInfo: JOBOBJECT_BASIC_ACCOUNTING_INFORMATION,
|
|
IoInfo: IO_COUNTERS,
|
|
DiskIoInfo: PROCESS_DISK_COUNTERS,
|
|
ContextSwitches: ULONG64,
|
|
TotalCycleTime: LARGE_INTEGER,
|
|
ReadyTime: ULONG64,
|
|
EnergyValues: PROCESS_ENERGY_VALUES,
|
|
}}
|
|
pub type PJOBOBJECT_EXTENDED_ACCOUNTING_INFORMATION =
|
|
*mut JOBOBJECT_EXTENDED_ACCOUNTING_INFORMATION;
|
|
STRUCT!{struct JOBOBJECT_WAKE_INFORMATION {
|
|
NotificationChannel: HANDLE,
|
|
WakeCounters: [ULONG64; 7],
|
|
}}
|
|
pub type PJOBOBJECT_WAKE_INFORMATION = *mut JOBOBJECT_WAKE_INFORMATION;
|
|
STRUCT!{struct JOBOBJECT_WAKE_INFORMATION_V1 {
|
|
NotificationChannel: HANDLE,
|
|
WakeCounters: [ULONG64; 4],
|
|
}}
|
|
pub type PJOBOBJECT_WAKE_INFORMATION_V1 = *mut JOBOBJECT_WAKE_INFORMATION_V1;
|
|
STRUCT!{struct JOBOBJECT_INTERFERENCE_INFORMATION {
|
|
Count: ULONG64,
|
|
}}
|
|
pub type PJOBOBJECT_INTERFERENCE_INFORMATION = *mut JOBOBJECT_INTERFERENCE_INFORMATION;
|
|
STRUCT!{struct JOBOBJECT_WAKE_FILTER {
|
|
HighEdgeFilter: ULONG,
|
|
LowEdgeFilter: ULONG,
|
|
}}
|
|
pub type PJOBOBJECT_WAKE_FILTER = *mut JOBOBJECT_WAKE_FILTER;
|
|
STRUCT!{struct JOBOBJECT_FREEZE_INFORMATION {
|
|
Flags: ULONG,
|
|
Freeze: BOOLEAN,
|
|
Swap: BOOLEAN,
|
|
Reserved0: [UCHAR; 2],
|
|
WakeFilter: JOBOBJECT_WAKE_FILTER,
|
|
}}
|
|
pub type PJOBOBJECT_FREEZE_INFORMATION = *mut JOBOBJECT_FREEZE_INFORMATION;
|
|
BITFIELD!{JOBOBJECT_FREEZE_INFORMATION Flags: ULONG [
|
|
FreezeOperation set_FreezeOperation[0..1],
|
|
FilterOperation set_FilterOperation[1..2],
|
|
SwapOperation set_SwapOperation[2..3],
|
|
Reserved set_Reserved[3..32],
|
|
]}
|
|
STRUCT!{struct JOBOBJECT_MEMORY_USAGE_INFORMATION {
|
|
JobMemory: ULONG64,
|
|
PeakJobMemoryUsed: ULONG64,
|
|
}}
|
|
pub type PJOBOBJECT_MEMORY_USAGE_INFORMATION = *mut JOBOBJECT_MEMORY_USAGE_INFORMATION;
|
|
STRUCT!{struct JOBOBJECT_MEMORY_USAGE_INFORMATION_V2 {
|
|
BasicInfo: JOBOBJECT_MEMORY_USAGE_INFORMATION,
|
|
JobSharedMemory: ULONG64,
|
|
Reserved: [ULONG64; 2],
|
|
}}
|
|
pub type PJOBOBJECT_MEMORY_USAGE_INFORMATION_V2 = *mut JOBOBJECT_MEMORY_USAGE_INFORMATION_V2;
|
|
STRUCT!{struct SILO_USER_SHARED_DATA {
|
|
ServiceSessionId: ULONG64,
|
|
ActiveConsoleId: ULONG,
|
|
ConsoleSessionForegroundProcessId: LONGLONG,
|
|
NtProductType: NT_PRODUCT_TYPE,
|
|
SuiteMask: ULONG,
|
|
SharedUserSessionId: ULONG,
|
|
IsMultiSessionSku: BOOLEAN,
|
|
NtSystemRoot: [WCHAR; 260],
|
|
UserModeGlobalLogger: [USHORT; 16],
|
|
}}
|
|
pub type PSILO_USER_SHARED_DATA = *mut SILO_USER_SHARED_DATA;
|
|
STRUCT!{struct SILOOBJECT_ROOT_DIRECTORY {
|
|
ControlFlags: ULONG,
|
|
Path: UNICODE_STRING,
|
|
}}
|
|
pub type PSILOOBJECT_ROOT_DIRECTORY = *mut SILOOBJECT_ROOT_DIRECTORY;
|
|
STRUCT!{struct JOBOBJECT_ENERGY_TRACKING_STATE {
|
|
Value: ULONG64,
|
|
UpdateMask: ULONG,
|
|
DesiredState: ULONG,
|
|
}}
|
|
pub type PJOBOBJECT_ENERGY_TRACKING_STATE = *mut JOBOBJECT_ENERGY_TRACKING_STATE;
|
|
EXTERN!{extern "system" {
|
|
fn NtCreateJobObject(
|
|
JobHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
) -> NTSTATUS;
|
|
fn NtOpenJobObject(
|
|
JobHandle: PHANDLE,
|
|
DesiredAccess: ACCESS_MASK,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
) -> NTSTATUS;
|
|
fn NtAssignProcessToJobObject(
|
|
JobHandle: HANDLE,
|
|
ProcessHandle: HANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtTerminateJobObject(
|
|
JobHandle: HANDLE,
|
|
ExitStatus: NTSTATUS,
|
|
) -> NTSTATUS;
|
|
fn NtIsProcessInJob(
|
|
ProcessHandle: HANDLE,
|
|
JobHandle: HANDLE,
|
|
) -> NTSTATUS;
|
|
fn NtQueryInformationJobObject(
|
|
JobHandle: HANDLE,
|
|
JobObjectInformationClass: JOBOBJECTINFOCLASS,
|
|
JobObjectInformation: PVOID,
|
|
JobObjectInformationLength: ULONG,
|
|
ReturnLength: PULONG,
|
|
) -> NTSTATUS;
|
|
fn NtSetInformationJobObject(
|
|
JobHandle: HANDLE,
|
|
JobObjectInformationClass: JOBOBJECTINFOCLASS,
|
|
JobObjectInformation: PVOID,
|
|
JobObjectInformationLength: ULONG,
|
|
) -> NTSTATUS;
|
|
fn NtCreateJobSet(
|
|
NumJob: ULONG,
|
|
UserJobSet: PJOB_SET_ARRAY,
|
|
Flags: ULONG,
|
|
) -> NTSTATUS;
|
|
fn NtRevertContainerImpersonation() -> NTSTATUS;
|
|
}}
|
|
ENUM!{enum MEMORY_RESERVE_TYPE {
|
|
MemoryReserveUserApc = 0,
|
|
MemoryReserveIoCompletion = 1,
|
|
MemoryReserveTypeMax = 2,
|
|
}}
|
|
EXTERN!{extern "system" {
|
|
fn NtAllocateReserveObject(
|
|
MemoryReserveHandle: PHANDLE,
|
|
ObjectAttributes: POBJECT_ATTRIBUTES,
|
|
Type: MEMORY_RESERVE_TYPE,
|
|
) -> NTSTATUS;
|
|
}}
|