2026-04-06 00:20:51 -05:00

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