[Kernel] Added support for custom kernel version

This commit is contained in:
Gliniak
2024-03-04 22:48:20 +01:00
parent 3e55d0048c
commit 1ff3dc4d10
4 changed files with 38 additions and 8 deletions

View File

@@ -48,6 +48,8 @@ namespace kernel {
constexpr fourcc_t kKernelSaveSignature = make_fourcc("KRNL");
static constexpr const uint16_t kBaseKernelBuildVersion = 1888;
// (?), used by KeGetCurrentProcessType
constexpr uint32_t X_PROCTYPE_IDLE = 0;
constexpr uint32_t X_PROCTYPE_TITLE = 1;
@@ -145,6 +147,27 @@ struct KernelGuestGlobals {
struct DPCImpersonationScope {
uint8_t previous_irql_;
};
struct KernelVersion {
union {
xe::be<uint64_t> value;
struct {
xe::be<uint16_t> major;
xe::be<uint16_t> minor;
xe::be<uint16_t> build;
xe::be<uint16_t> qfe;
};
};
KernelVersion(uint16_t build_ver = kBaseKernelBuildVersion) {
major = 2;
minor = 0;
build = std::max(kBaseKernelBuildVersion, build_ver);
qfe = 0;
}
};
class KernelState {
public:
explicit KernelState(Emulator* emulator);
@@ -200,6 +223,8 @@ class KernelState {
// Access must be guarded by the global critical region.
util::ObjectTable* object_table() { return &object_table_; }
const KernelVersion* GetKernelVersion() const { return &kernel_version_; }
uint32_t GetSystemProcess() const {
return kernel_guest_globals_ + offsetof(KernelGuestGlobals, system_process);
}
@@ -332,6 +357,8 @@ class KernelState {
std::map<uint8_t, std::unique_ptr<xam::UserProfile>> user_profiles_;
std::unique_ptr<AchievementManager> achievement_manager_;
KernelVersion kernel_version_;
xe::global_critical_region global_critical_region_;
// Must be guarded by the global critical region.