windows_JOB_0">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;//请求返回 当前进程集IDfOk = 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);
}