windows JOB作业类的处理

windows JOB作业类的处理

windows JOB作业类的处理


# windows JOB作业类的处理
/*
moduel Job.h
Notices:
*/

#pragma once
#include <malloc.h>	//for _alloca;
class CJob
{
private:
	HANDLE m_hJob;
public:
	CJob(HANDLE hJob = NULL);
	~CJob();
	operator HANDLE() const { return(m_hJob); }	//重载()运算符

	//用于打开或创建一个作业对象
	BOOL Create(PSECURITY_ATTRIBUTES psa = NULL, PCTSTR pszName = NULL);
	BOOL Open(PCTSTR pszName, DWORD dwDesiredAccess, BOOL fInheritHandle = FALSE);

	//用于操作作业对象的函数
	BOOL AssignProcess(HANDLE hProcess);
	BOOL Terminate(UINT uExitCode = 0);

	//用于设置或限制作业对象
	BOOL SetExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli, BOOL fPreserveJobTime = FALSE);
	BOOL SetBasicUIRestrictions(DWORD fdwLimits);
	BOOL GrantUserHandleAccess(HANDLE hUserOjb, BOOL fGrant = TRUE);//设置访问作业外用户对象能力
	BOOL SetSecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli);

	//查询作业限制信息
	BOOL QueryExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli);
	BOOL QueryBasicUIRestrictions(PDWORD fdwRestrictions);
	BOOL QuerySecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli);

	//查询作业状态信息
	BOOL QueryBasicAccountingInfo(PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION pjobai);
	BOOL QueryBasicProcessIdList(DWORD dwMaxProcess, PDWORD pdwProcessIdList,
		PDWORD pdwProcessesReturned = NULL);

	//设置或者查询作业的通知事件
	BOOL AssociateCompletionPort(HANDLE hIOCP, ULONG_PTR CompKey);
	BOOL QueryAssociatedCompletionPort(PJOBOBJECT_ASSOCIATE_COMPLETION_PORT pjoacp);
	BOOL SetEndOfJobInfo(DWORD fdwEndOfJobInfo = JOB_OBJECT_TERMINATE_AT_END_OF_JOB);
	BOOL QueryEndOfJobTimeInfo(PDWORD pfdwEndOfJobTimeInfo);
};

CJob::CJob(HANDLE hJob)
{
	m_hJob = hJob;
}

CJob::~CJob()
{
	if (NULL != m_hJob)
	{
		CloseHandle(m_hJob);
	}
}
///
inline BOOL CJob::Create(PSECURITY_ATTRIBUTES psa, PCTSTR pszName) {
	m_hJob = CreateJobObject(psa, pszName);
	return (m_hJob != NULL);
}

///
inline BOOL CJob::Open(PCTSTR pszName, DWORD dwDesiredAccess, BOOL fInheritHandle /*= FALSE*/) {
	m_hJob = OpenJobObject(dwDesiredAccess, fInheritHandle, pszName);
	return (m_hJob != NULL);
}

///
inline 	BOOL CJob::AssignProcess(HANDLE hProcess) {
	return(AssignProcessToJobObject(m_hJob, hProcess));
}

///
inline BOOL CJob::Terminate(UINT uExitCode /* = 0*/) {
	return(TerminateJobObject(m_hJob, uExitCode));
}

///
inline BOOL CJob::SetExtendedLimitInfo(
	PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli, BOOL fPreserveJobTime /*= FALSE*/) {

	if (fPreserveJobTime)
	{
		pjoeli->BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME;
	}
	//如果要保留作业事件信息,则JOB_OBJECT_LIMIT_JOB_TIME标志必须去掉
	const DWORD fdwFlagTest =
		(JOB_OBJECT_LIMIT_JOB_TIME | JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME);

	if ((pjoeli->BasicLimitInformation.LimitFlags & fdwFlagTest) == fdwFlagTest);
	//DebugBreak();//这两个标志是互斥的,单现在两者同时被设置了。

	return (SetInformationJobObject(m_hJob, JobObjectExtendedLimitInformation,
		pjoeli, sizeof(*pjoeli)));
}

///
inline BOOL CJob::SetBasicUIRestrictions(DWORD fdwLimits) {
	JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir = { fdwLimits };
	return (SetInformationJobObject(m_hJob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir)));
}

///
inline BOOL CJob::GrantUserHandleAccess(HANDLE hUserOjb, BOOL fGrant /*= TRUE*/){
	return UserHandleGrantAccess(hUserOjb, m_hJob, fGrant);
}

///
inline BOOL CJob::SetSecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli) {
	return (SetInformationJobObject(m_hJob,
		JobObjectSecurityLimitInformation, pjosli, sizeof(*pjosli)));
}

///
inline BOOL CJob::QueryExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli) {
	return (QueryInformationJobObject(m_hJob, JobObjectExtendedLimitInformation,
		pjoeli, sizeof(*pjoeli), NULL));
}

///
inline BOOL CJob::QueryBasicUIRestrictions(PDWORD fdwRestrictions) {
	JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;
	BOOL fOk = QueryInformationJobObject(m_hJob, JobObjectBasicUIRestrictions,
		&jobuir, sizeof(jobuir), NULL);
	if (fOk)
	{
		*fdwRestrictions = jobuir.UIRestrictionsClass;
	}
	return (fOk);
}

///
inline BOOL CJob::QuerySecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli) {
	return (QueryInformationJobObject(m_hJob, JobObjectSecurityLimitInformation,
		pjosli, sizeof(*pjosli), NULL));
}

 
inline BOOL CJob::QueryBasicAccountingInfo(PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION pjobai) {
	return (QueryInformationJobObject(m_hJob,
		JobObjectBasicAndIoAccountingInformation, pjobai, sizeof(*pjobai), NULL));
}

///
inline BOOL CJob::QueryBasicProcessIdList(DWORD dwMaxProcess, PDWORD pdwProcessIdList,
	PDWORD pdwProcessesReturned /*= NULL*/) {
	//计算所需的控件大小
	DWORD cb = sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST) + (sizeof(DWORD) * (dwMaxProcess - 1));

	//从栈上分匹配内存(注意,不是堆,所有无需释放
	PJOBOBJECT_BASIC_PROCESS_ID_LIST  pjobpil =
		(PJOBOBJECT_BASIC_PROCESS_ID_LIST)_alloca(cb);


	BOOL fOk = (pjobpil != NULL);
	if (fOk)
	{
		//告知函数,我们分配的最大控件大小
		pjobpil->NumberOfProcessIdsInList = dwMaxProcess;

		//请求返回 当前进程集ID
		fOk = QueryInformationJobObject(m_hJob,
			JobObjectBasicProcessIdList, pjobpil, cb, NULL);
		if (fOk)
		{
			//得到信息,并返回给调用者
			if (pdwProcessesReturned != NULL)
			{
				*pdwProcessesReturned = pjobpil->NumberOfProcessIdsInList;

				CopyMemory(pdwProcessesReturned, pjobpil,
					sizeof(DWORD) * pjobpil->NumberOfProcessIdsInList);
			}
		}
	}
	return fOk;
}

///
inline BOOL CJob::AssociateCompletionPort(HANDLE hIOCP, ULONG_PTR CompKey) {
	JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;
	joacp.CompletionPort = hIOCP;
	joacp.CompletionKey = (PVOID)CompKey;

	return(SetInformationJobObject(m_hJob,
		JobObjectAssociateCompletionPortInformation, &joacp, sizeof(joacp)));
}

///
inline BOOL CJob::QueryAssociatedCompletionPort(PJOBOBJECT_ASSOCIATE_COMPLETION_PORT pjoacp) {
	return (QueryInformationJobObject(m_hJob,
		JobObjectAssociateCompletionPortInformation, pjoacp, sizeof(*pjoacp), NULL));
}

///
inline BOOL CJob::SetEndOfJobInfo(DWORD fdwEndOfJobInfo /*= JOB_OBJECT_TERMINATE_AT_END_OF_JOB*/) {
	JOBOBJECT_END_OF_JOB_TIME_INFORMATION joeojti = { fdwEndOfJobInfo };
	return (SetInformationJobObject(m_hJob,
		JobObjectEndOfJobTimeInformation, &joeojti, sizeof(joeojti)));
}

///
inline BOOL CJob::QueryEndOfJobTimeInfo(PDWORD pfdwEndOfJobTimeInfo) {
	JOBOBJECT_END_OF_JOB_TIME_INFORMATION jobojti;
	BOOL fOk = QueryInformationJobObject(m_hJob,
		JobObjectEndOfJobTimeInformation, &jobojti, sizeof(jobojti), NULL);

	if (fOk)
	{
		*pfdwEndOfJobTimeInfo = jobojti.EndOfJobTimeAction;
	}
	return (fOk);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值