mirror of
https://github.com/helpsystems/CreateProcess
synced 2026-06-08 14:37:39 +00:00
236 lines
9.4 KiB
C
236 lines
9.4 KiB
C
#pragma once
|
|
|
|
#include <windows.h>
|
|
#include <winternl.h>
|
|
|
|
#define STATUS_SUCCESS 0x00000000
|
|
#define STATUS_UNSUCCESSFUL 0xC0000001
|
|
|
|
#define NTDLL_DLL L"ntdll.dll"
|
|
|
|
#define ProcessMitigationPolicy 0x34
|
|
|
|
#define PROCESS_CREATE_FLAGS_BREAKAWAY 0x00000001
|
|
#define PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT 0x00000002
|
|
#define PROCESS_CREATE_FLAGS_INHERIT_HANDLES 0x00000004
|
|
#define PROCESS_CREATE_FLAGS_OVERRIDE_ADDRESS_SPACE 0x00000008
|
|
#define PROCESS_CREATE_FLAGS_LARGE_PAGES 0x00000010
|
|
#define PROCESS_CREATE_FLAGS_LARGE_PAGE_SYSTEM_DLL 0x00000020
|
|
#define PROCESS_CREATE_FLAGS_PROTECTED_PROCESS 0x00000040
|
|
#define PROCESS_CREATE_FLAGS_CREATE_SESSION 0x00000080
|
|
#define PROCESS_CREATE_FLAGS_INHERIT_FROM_PARENT 0x00000100
|
|
#define PROCESS_CREATE_FLAGS_SUSPENDED 0x00000200
|
|
#define PROCESS_CREATE_FLAGS_EXTENDED_UNKNOWN 0x00000400
|
|
|
|
#define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001
|
|
#define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002
|
|
#define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004
|
|
#define THREAD_CREATE_FLAGS_HAS_SECURITY_DESCRIPTOR 0x00000010
|
|
#define THREAD_CREATE_FLAGS_ACCESS_CHECK_IN_TARGET 0x00000020
|
|
#define THREAD_CREATE_FLAGS_INITIAL_THREAD 0x00000080
|
|
|
|
#define RTL_USER_PROC_PARAMS_NORMALIZED 0x00000001
|
|
|
|
#define PS_ATTRIBUTE_NUMBER_MASK 0x0000ffff
|
|
#define PS_ATTRIBUTE_THREAD 0x00010000
|
|
#define PS_ATTRIBUTE_INPUT 0x00020000
|
|
#define PS_ATTRIBUTE_ADDITIVE 0x00040000
|
|
|
|
#define RVA2VA(Type, DllBase, Rva) (Type)((ULONG_PTR) DllBase + Rva)
|
|
|
|
typedef enum _PS_ATTRIBUTE_NUM
|
|
{
|
|
PsAttributeParentProcess, // in HANDLE
|
|
PsAttributeDebugPort, // in HANDLE
|
|
PsAttributeToken, // in HANDLE
|
|
PsAttributeClientId, // out PCLIENT_ID
|
|
PsAttributeTebAddress, // out PTEB *
|
|
PsAttributeImageName, // in PWSTR
|
|
PsAttributeImageInfo, // out PSECTION_IMAGE_INFORMATION
|
|
PsAttributeMemoryReserve, // in PPS_MEMORY_RESERVE
|
|
PsAttributePriorityClass, // in UCHAR
|
|
PsAttributeErrorMode, // in ULONG
|
|
PsAttributeStdHandleInfo, // 10, in PPS_STD_HANDLE_INFO
|
|
PsAttributeHandleList, // in PHANDLE
|
|
PsAttributeGroupAffinity, // in PGROUP_AFFINITY
|
|
PsAttributePreferredNode, // in PUSHORT
|
|
PsAttributeIdealProcessor, // in PPROCESSOR_NUMBER
|
|
PsAttributeUmsThread, // ? in PUMS_CREATE_THREAD_ATTRIBUTES
|
|
PsAttributeMitigationOptions, // in UCHAR
|
|
PsAttributeProtectionLevel, // in ULONG
|
|
PsAttributeSecureProcess, // since THRESHOLD
|
|
PsAttributeJobList,
|
|
PsAttributeChildProcessPolicy, // since THRESHOLD2
|
|
PsAttributeAllApplicationPackagesPolicy, // since REDSTONE
|
|
PsAttributeWin32kFilter,
|
|
PsAttributeSafeOpenPromptOriginClaim,
|
|
PsAttributeBnoIsolation, // PS_BNO_ISOLATION_PARAMETERS
|
|
PsAttributeDesktopAppPolicy, // in ULONG
|
|
PsAttributeChpe, // since REDSTONE3
|
|
PsAttributeMax
|
|
} PS_ATTRIBUTE_NUM;
|
|
|
|
#define PsAttributeValue(Number, Thread, Input, Additive) \
|
|
(((Number) & PS_ATTRIBUTE_NUMBER_MASK) | \
|
|
((Thread) ? PS_ATTRIBUTE_THREAD : 0) | \
|
|
((Input) ? PS_ATTRIBUTE_INPUT : 0) | \
|
|
((Additive) ? PS_ATTRIBUTE_ADDITIVE : 0))
|
|
|
|
typedef struct _PS_ATTRIBUTE {
|
|
ULONGLONG Attribute;
|
|
SIZE_T Size;
|
|
union {
|
|
ULONG_PTR Value;
|
|
PVOID ValuePtr;
|
|
};
|
|
PSIZE_T ReturnLength;
|
|
} PS_ATTRIBUTE, * PPS_ATTRIBUTE;
|
|
|
|
typedef struct _PS_ATTRIBUTE_LIST {
|
|
SIZE_T TotalLength;
|
|
PS_ATTRIBUTE Attributes[5];
|
|
} PS_ATTRIBUTE_LIST, * PPS_ATTRIBUTE_LIST;
|
|
|
|
typedef enum _PS_CREATE_STATE {
|
|
PsCreateInitialState,
|
|
PsCreateFailOnFileOpen,
|
|
PsCreateFailOnSectionCreate,
|
|
PsCreateFailExeFormat,
|
|
PsCreateFailMachineMismatch,
|
|
PsCreateFailExeName,
|
|
PsCreateSuccess,
|
|
PsCreateMaximumStates
|
|
} PS_CREATE_STATE;
|
|
|
|
typedef enum _ProcessCreateInitFlag {
|
|
None,
|
|
WriteOutputOnExit,
|
|
DetectManifest,
|
|
IFEOSkipDebugger,
|
|
IFEODoNotPropagateKeyState,
|
|
} ProcessCreateInitFlag;
|
|
|
|
typedef struct _PS_CREATE_INFO {
|
|
SIZE_T Size;
|
|
PS_CREATE_STATE State;
|
|
union {
|
|
// PsCreateInitialState
|
|
struct {
|
|
union {
|
|
ULONG InitFlags;
|
|
struct {
|
|
UCHAR WriteOutputOnExit : 1;
|
|
UCHAR DetectManifest : 1;
|
|
UCHAR IFEOSkipDebugger : 1;
|
|
UCHAR IFEODoNotPropagateKeyState : 1;
|
|
UCHAR SpareBits1 : 4;
|
|
UCHAR SpareBits2 : 8;
|
|
USHORT ProhibitedImageCharacteristics : 16;
|
|
};
|
|
};
|
|
ACCESS_MASK AdditionalFileAccess;
|
|
} InitState;
|
|
|
|
// PsCreateFailOnSectionCreate
|
|
struct {
|
|
HANDLE FileHandle;
|
|
} FailSection;
|
|
|
|
// PsCreateFailExeFormat
|
|
struct {
|
|
USHORT DllCharacteristics;
|
|
} ExeFormat;
|
|
|
|
// PsCreateFailExeName
|
|
struct {
|
|
HANDLE IFEOKey;
|
|
} ExeName;
|
|
|
|
// PsCreateSuccess
|
|
struct {
|
|
union {
|
|
ULONG OutputFlags;
|
|
struct {
|
|
UCHAR ProtectedProcess : 1;
|
|
UCHAR AddressSpaceOverride : 1;
|
|
UCHAR DevOverrideEnabled : 1;
|
|
UCHAR ManifestDetected : 1;
|
|
UCHAR ProtectedProcessLight : 1;
|
|
UCHAR SpareBits1 : 3;
|
|
UCHAR SpareBits2 : 8;
|
|
USHORT SpareBits3 : 16;
|
|
};
|
|
};
|
|
HANDLE FileHandle;
|
|
HANDLE SectionHandle;
|
|
ULONGLONG UserProcessParametersNative;
|
|
ULONG UserProcessParametersWow64;
|
|
ULONG CurrentParameterFlags;
|
|
ULONGLONG PebAddressNative;
|
|
ULONG PebAddressWow64;
|
|
ULONGLONG ManifestAddress;
|
|
ULONG ManifestSize;
|
|
} SuccessState;
|
|
};
|
|
} PS_CREATE_INFO, * PPS_CREATE_INFO;
|
|
|
|
//0x18 bytes (sizeof)
|
|
struct _RTL_DRIVE_LETTER_CURDIR
|
|
{
|
|
USHORT Flags; //0x0
|
|
USHORT Length; //0x2
|
|
ULONG TimeStamp; //0x4
|
|
struct _STRING DosPath; //0x8
|
|
};
|
|
|
|
//0x18 bytes (sizeof)
|
|
struct _CURDIR
|
|
{
|
|
struct _UNICODE_STRING DosPath; //0x0
|
|
VOID* Handle; //0x10
|
|
};
|
|
|
|
//0x440 bytes (sizeof)
|
|
typedef struct _MY_RTL_USER_PROCESS_PARAMETERS {
|
|
|
|
ULONG MaximumLength; //0x0
|
|
ULONG Length; //0x4
|
|
ULONG Flags; //0x8
|
|
ULONG DebugFlags; //0xc
|
|
VOID* ConsoleHandle; //0x10
|
|
ULONG ConsoleFlags; //0x18
|
|
VOID* StandardInput; //0x20
|
|
VOID* StandardOutput; //0x28
|
|
VOID* StandardError; //0x30
|
|
struct _CURDIR CurrentDirectory; //0x38
|
|
struct _UNICODE_STRING DllPath; //0x50
|
|
struct _UNICODE_STRING ImagePathName; //0x60
|
|
struct _UNICODE_STRING CommandLine; //0x70
|
|
VOID* Environment; //0x80
|
|
ULONG StartingX; //0x88
|
|
ULONG StartingY; //0x8c
|
|
ULONG CountX; //0x90
|
|
ULONG CountY; //0x94
|
|
ULONG CountCharsX; //0x98
|
|
ULONG CountCharsY; //0x9c
|
|
ULONG FillAttribute; //0xa0
|
|
ULONG WindowFlags; //0xa4
|
|
ULONG ShowWindowFlags; //0xa8
|
|
struct _UNICODE_STRING WindowTitle; //0xb0
|
|
struct _UNICODE_STRING DesktopInfo; //0xc0
|
|
struct _UNICODE_STRING ShellInfo; //0xd0
|
|
struct _UNICODE_STRING RuntimeData; //0xe0
|
|
struct _RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32]; //0xf0
|
|
ULONGLONG EnvironmentSize; //0x3f0
|
|
ULONGLONG EnvironmentVersion; //0x3f8
|
|
VOID* PackageDependencyData; //0x400
|
|
ULONG ProcessGroupId; //0x408
|
|
ULONG LoaderThreads; //0x40c
|
|
struct _UNICODE_STRING RedirectionDllName; //0x410
|
|
struct _UNICODE_STRING HeapPartitionName; //0x420
|
|
ULONGLONG* DefaultThreadpoolCpuSetMasks; //0x430
|
|
ULONG DefaultThreadpoolCpuSetMaskCount; //0x438
|
|
ULONG DefaultThreadpoolThreadMaximum; //0x43c
|
|
// ...
|
|
} MY_RTL_USER_PROCESS_PARAMETERS,*PMY_RTL_USER_PROCESS_PARAMETERS;
|