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);
}