83 lines
2.3 KiB
C++
83 lines
2.3 KiB
C++
#include "JobsController.h"
|
|
#include "ApiLoader.h"
|
|
|
|
void* JobsController::operator new(size_t sz)
|
|
{
|
|
void* p = MemAllocLocal(sz);
|
|
return p;
|
|
}
|
|
|
|
void JobsController::operator delete(void* p) noexcept
|
|
{
|
|
MemFreeLocal(&p, sizeof(JobsController));
|
|
}
|
|
|
|
JobData JobsController::CreateJobData(ULONG taskId, WORD Type, WORD State, HANDLE object, WORD pid, HANDLE input, HANDLE output)
|
|
{
|
|
JobData jobData = { taskId, Type, State, object, pid, input, output };
|
|
this->jobs.push_back(jobData);
|
|
return jobData;
|
|
}
|
|
|
|
void JobsController::ProcessJobs(Packer* packer)
|
|
{
|
|
if ( !this->jobs.size() )
|
|
return;
|
|
|
|
for (int i = 0; i < this->jobs.size(); i++) {
|
|
|
|
ULONG available = 0;
|
|
LPVOID buffer = ReadDataFromAnonPipe(this->jobs[i].pipeRead, &available);
|
|
if (available > 0) {
|
|
packer->Pack32(jobs[i].jobId);
|
|
packer->Pack32(COMMAND_JOB);
|
|
packer->Pack8(jobs[i].jobType);
|
|
packer->Pack8(JOB_STATE_RUNNING);
|
|
packer->PackBytes((BYTE*)buffer, available);
|
|
|
|
MemFreeLocal(&buffer, available);
|
|
}
|
|
|
|
if (jobs[i].jobState == JOB_STATE_RUNNING) {
|
|
|
|
ULONG status = 0;
|
|
if (jobs[i].jobType == JOB_TYPE_PROCESS || jobs[i].jobType == JOB_TYPE_SHELL)
|
|
ApiWin->GetExitCodeProcess(jobs[i].jobObject, &status);
|
|
else if (jobs[i].jobType == JOB_TYPE_LOCAL || jobs[i].jobType == JOB_TYPE_REMOTE)
|
|
ApiWin->GetExitCodeThread(jobs[i].jobObject, &status);
|
|
|
|
if (status != STILL_ACTIVE) {
|
|
if(jobs[i].jobType == JOB_TYPE_SHELL)
|
|
jobs[i].jobState = JOB_STATE_KILLED;
|
|
else
|
|
jobs[i].jobState = JOB_STATE_FINISHED;
|
|
}
|
|
}
|
|
|
|
if (jobs[i].jobState == JOB_STATE_KILLED || jobs[i].jobState == JOB_STATE_FINISHED) {
|
|
|
|
if (jobs[i].jobType == JOB_TYPE_PROCESS || jobs[i].jobType == JOB_TYPE_SHELL)
|
|
ApiNt->NtTerminateProcess(jobs[i].jobObject, NULL);
|
|
else if (jobs[i].jobType == JOB_TYPE_LOCAL || jobs[i].jobType == JOB_TYPE_REMOTE)
|
|
ApiNt->NtTerminateThread(jobs[i].jobObject, NULL);
|
|
|
|
if (jobs[i].pipeRead) {
|
|
ApiNt->NtClose(jobs[i].pipeRead);
|
|
jobs[i].pipeRead = NULL;
|
|
}
|
|
if (jobs[i].pipeWrite) {
|
|
ApiNt->NtClose(jobs[i].pipeWrite);
|
|
jobs[i].pipeWrite = NULL;
|
|
}
|
|
|
|
packer->Pack32(jobs[i].jobId);
|
|
packer->Pack32(COMMAND_JOB);
|
|
packer->Pack8(jobs[i].jobType);
|
|
packer->Pack8(jobs[i].jobState);
|
|
|
|
jobs.remove(i);
|
|
--i;
|
|
}
|
|
}
|
|
}
|