51 lines
1.8 KiB
C++
51 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <windows.h>
|
|
#include <iostream>
|
|
|
|
#include "offsets.h"
|
|
#include "../process.h"
|
|
#include "instance.h"
|
|
#include "xrbx/engine/common.h"
|
|
|
|
namespace RBX {
|
|
class Scheduler : public InternalObjectWrapper {
|
|
public:
|
|
class Job : public InternalObjectWrapper {
|
|
public:
|
|
Job(BYTE *va, const Process &process) : InternalObjectWrapper(va, process) {}
|
|
|
|
inline std::string getName() const {
|
|
BYTE *name_ptr = VA() + OFF_JOB_NAME;
|
|
uint64_t length = process().read<uint64_t>(name_ptr + 8);
|
|
std::string name(length, '\0');
|
|
process().readBytes(process().read<BYTE *>(name_ptr), (BYTE *)name.data(), length);
|
|
name[length] = 0;
|
|
return name;
|
|
}
|
|
|
|
inline Instance getRunService() {
|
|
return Instance(process().read<BYTE *>(VA() + OFF_JOB_RUNSERVICE), process());
|
|
}
|
|
};
|
|
|
|
Scheduler(BYTE *va, const Process &process) : InternalObjectWrapper(va, process) {}
|
|
|
|
inline std::vector<Job> getJobs() const {
|
|
return process().readVector<Job>(VA() + OFF_SCHEDULER_JOBS);
|
|
}
|
|
|
|
Job getJob(const std::string &name) const {
|
|
auto j = process().readVectorElement<Job>(VA() + OFF_SCHEDULER_JOBS, [&name](const Job &job) -> bool {
|
|
return job.getName() == name;
|
|
});
|
|
if (!j.has_value()) throw std::runtime_error(std::format("Job '{}' not found", name));
|
|
return j.value();
|
|
}
|
|
};
|
|
}
|