#ifndef _NT_JOB_H_
#define _NT_JOB_H_
#include "nt_abi.h"
#include "nt_object.h"
typedef enum _nt_job_object_info_class {
NT_JOB_OBJECT_BASIC_ACCOUNTING_INFORMATION = 0x01,
NT_JOB_OBJECT_BASIC_LIMIT_INFORMATION = 0x02,
NT_JOB_OBJECT_BASIC_PROCESS_ID_LIST = 0x03,
NT_JOB_OBJECT_BASIC_U_I_RESTRICTIONS = 0x04,
NT_JOB_OBJECT_SECURITY_LIMIT_INFORMATION = 0x05,
NT_JOB_OBJECT_END_OF_JOB_TIME_INFORMATION = 0x06,
NT_JOB_OBJECT_ASSOCIATE_COMPLETION_PORT_INFORMATION = 0x07,
NT_JOB_OBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION = 0x08,
NT_JOB_OBJECT_EXTENDED_LIMIT_INFORMATION = 0x09,
NT_JOB_OBJECT_GROUP_INFORMATION = 0x0B,
NT_JOB_OBJECT_NOTIFICATION_LIMIT_INFORMATION = 0x0C,
NT_JOB_OBJECT_LIMIT_VIOLATION_INFORMATION = 0x0D,
NT_JOB_OBJECT_GROUP_INFORMATION_EX = 0x0E,
NT_JOB_OBJECT_CPU_RATE_CONTROL_INFORMATION = 0x0F,
} nt_job_object_info_class;
/* job access bits */
#define NT_JOB_OBJECT_ASSIGN_PROCESS 0x000001
#define NT_JOB_OBJECT_SET_ATTRIBUTES 0x000002
#define NT_JOB_OBJECT_QUERY 0x000004
#define NT_JOB_OBJECT_TERMINATE 0x000008
#define NT_JOB_OBJECT_SET_SECURITY_ATTRIBUTES 0x000010
#define NT_JOB_OBJECT_ALL_ACCESS 0x1F001F
/* job limit flags */
#define NT_JOB_OBJECT_LIMIT_WORKINGSET 0x00000001
#define NT_JOB_OBJECT_LIMIT_PROCESS_TIME 0x00000002
#define NT_JOB_OBJECT_LIMIT_JOB_TIME 0x00000004
#define NT_JOB_OBJECT_LIMIT_ACTIVE_PROCESS 0x00000008
#define NT_JOB_OBJECT_LIMIT_AFFINITY 0x00000010
#define NT_JOB_OBJECT_LIMIT_PRIORITY_CLASS 0x00000020
#define NT_JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME 0x00000040
#define NT_JOB_OBJECT_LIMIT_SCHEDULING_CLASS 0x00000080
#define NT_JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100
#define NT_JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200
#define NT_JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400
#define NT_JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800
#define NT_JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000
#define NT_JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000
#define NT_JOB_OBJECT_LIMIT_SUBSET_AFFINITY 0x00004000
/* job object cpu rate control bits */
#define NT_JOB_OBJECT_CPU_RATE_CONTROL_ENABLE 0x0001
#define NT_JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED 0x0002
#define NT_JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP 0x0004
#define NT_JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY 0x0008
/* job object basic user interface restrictions bits */
#define NT_JOB_OBJECT_UILIMIT_HANDLES 0x00000001
#define NT_JOB_OBJECT_UILIMIT_READCLIPBOARD 0x00000002
#define NT_JOB_OBJECT_UILIMIT_WRITECLIPBOARD 0x00000004
#define NT_JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x00000008
#define NT_JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 0x00000010
#define NT_JOB_OBJECT_UILIMIT_GLOBALATOMS 0x00000020
#define NT_JOB_OBJECT_UILIMIT_DESKTOP 0x00000040
#define NT_JOB_OBJECT_UILIMIT_EXITWINDOWS 0x00000080
/* job security limit bits */
#define NT_JOB_OBJECT_SECURITY_NO_ADMIN 0x0001
#define NT_JOB_OBJECT_SECURITY_RESTRICTED_TOKEN 0x0002
#define NT_JOB_OBJECT_SECURITY_ONLY_TOKEN 0x0004
#define NT_JOB_OBJECT_SECURITY_FILTER_TOKENS 0x0008
/* end of job actions */
#define NT_JOB_OBJECT_TERMINATE_AT_END_OF_JOB 0
#define NT_JOB_OBJECT_POST_AT_END_OF_JOB 1
/* job associate completion port events */
#define NT_JOB_OBJECT_MSG_END_OF_JOB_TIME 1
#define NT_JOB_OBJECT_MSG_END_OF_PROCESS_TIME 2
#define NT_JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT 3
#define NT_JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO 4
#define NT_JOB_OBJECT_MSG_NEW_PROCESS 6
#define NT_JOB_OBJECT_MSG_EXIT_PROCESS 7
#define NT_JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS 8
#define NT_JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT 9
#define NT_JOB_OBJECT_MSG_JOB_MEMORY_LIMIT 10
typedef struct _nt_job_object_basic_accounting_information {
nt_large_integer total_user_time;
nt_large_integer total_kernel_time;
nt_large_integer this_period_total_user_time;
nt_large_integer this_period_total_kernel_time;
int32_t total_page_fault_count;
int32_t total_processes;
int32_t active_processes;
int32_t total_terminated_processes;
} nt_job_object_basic_accounting_information;
typedef struct _nt_job_object_basic_limit_information {
nt_large_integer per_process_user_time_limit;
nt_large_integer per_job_user_time_limit;
uint32_t limit_flags;
size_t minimum_working_set_size;
size_t maximum_working_set_size;
uint32_t active_process_limit;
uintptr_t affinity;
uint32_t priority_class;
uint32_t scheduling_class;
} nt_job_object_basic_limit_information;
typedef struct _nt_job_object_basic_and_io_accounting_information {
nt_job_object_basic_accounting_information basic_info;
nt_io_counters io_info;
} nt_job_object_basic_and_io_accounting_information;
typedef struct _nt_job_object_extended_limit_information {
nt_job_object_basic_limit_information basic_limit_information;
nt_io_counters io_info;
size_t process_memory_limit;
size_t job_memory_limit;
size_t peak_process_memory_used;
size_t peak_job_memory_used;
} nt_job_object_extended_limit_information;
typedef struct _nt_job_object_basic_process_id_list {
uint32_t number_of_assigned_processes;
uint32_t number_of_process_ids_in_list;
uintptr_t process_id_list[];
} nt_job_object_basic_process_id_list;
typedef struct _nt_job_object_basic_ui_restrictions {
uint32_t ui_restrictions_class;
} nt_job_object_basic_ui_restrictions;
typedef struct _nt_job_object_security_limit_information {
uint32_t security_limit_flags;
void * job_token;
nt_token_groups * sids_to_disable;
nt_token_privileges * privileges_to_delete;
nt_token_groups * restricted_sids;
} nt_job_object_security_limit_information;
typedef struct _nt_job_object_end_of_job_time_information {
uint32_t end_of_job_time_action;
} nt_job_object_end_of_job_time_information;
typedef struct _nt_job_object_associate_completion_port {
void * completion_key;
void * completion_port;
} nt_job_object_associate_completion_port;
typedef struct _nt_job_object_cpu_rate_control_information {
uint32_t control_flags;
union {
uint32_t cpu_rate;
uint32_t weight;
};
} nt_job_object_cpu_rate_control_information;
typedef int32_t __stdcall ntapi_zw_create_job_object(
__out void ** hjob,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_open_job_object(
__out void ** hjob,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_terminate_job_object(
__in void * hjob,
__in int32_t exit_status);
typedef int32_t __stdcall ntapi_zw_assign_process_to_job_object(
__in void * hjob,
__in void * hprocess);
typedef int32_t __stdcall ntapi_zw_query_information_job_object(
__in void * hjob,
__in nt_job_object_info_class job_info_class,
__out void * job_info,
__in size_t job_info_length,
__out size_t * returned_length __optional);
typedef int32_t __stdcall ntapi_zw_set_information_job_object(
__in void * hjob,
__in nt_job_object_info_class job_info_class,
__in void * job_info,
__in size_t job_info_length);
#endif