Blob Blame History Raw
#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