/* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. ------------------------------------------- */ #pragma once #include #include namespace Kernel { class USER_PROCESS; class KERNEL_PROCESS; class UserProcessTeam; /***********************************************************************************/ /// @brief Subsystem enum type. /***********************************************************************************/ enum class ProcessSubsystem : Int32 { kProcessSubsystemSecurity = 100, kProcessSubsystemApplication, kProcessSubsystemService, kProcessSubsystemDriver, kProcessSubsystemInvalid = 0xFFFFFFF, kProcessSubsystemCount = 4, }; typedef UInt64 PTime; /***********************************************************************************/ //! @brief Local Process identifier. /***********************************************************************************/ typedef Int64 ProcessID; /***********************************************************************************/ //! @brief Local Process status enum. /***********************************************************************************/ enum class ProcessStatusKind : Int32 { kInvalid = 0, kStarting = 100, kRunning, kKilled, kFrozen, kFinished, kCount = 6, }; /***********************************************************************************/ //! @brief Affinity is the amount of nano-seconds this process is going to run. /***********************************************************************************/ enum class AffinityKind : Int32 { kRealTime = 500, kVeryHigh = 250, kHigh = 200, kStandard = 1000, kLowUsage = 1500, kVeryLowUsage = 2000, }; /***********************************************************************************/ //! Operators for AffinityKind /***********************************************************************************/ inline bool operator<(AffinityKind lhs, AffinityKind rhs) { Int32 lhs_int = static_cast(lhs); Int32 rhs_int = static_cast(rhs); return lhs_int < rhs_int; } inline bool operator>(AffinityKind lhs, AffinityKind rhs) { Int32 lhs_int = static_cast(lhs); Int32 rhs_int = static_cast(rhs); return lhs_int > rhs_int; } inline bool operator<=(AffinityKind lhs, AffinityKind rhs) { Int32 lhs_int = static_cast(lhs); Int32 rhs_int = static_cast(rhs); return lhs_int <= rhs_int; } inline bool operator>=(AffinityKind lhs, AffinityKind rhs) { Int32 lhs_int = static_cast(lhs); Int32 rhs_int = static_cast(rhs); return lhs_int >= rhs_int; } using ProcessTime = UInt64; using PID = Int64; /***********************************************************************************/ /// @note For User manager, tells where we run the code. /***********************************************************************************/ enum class ProcessLevelRing : Int32 { kRingStdUser = 1, kRingSuperUser = 2, kRingGuestUser = 5, kRingCount = 5, }; /***********************************************************************************/ /// @brief Helper type to describe a code image. /***********************************************************************************/ using ImagePtr = VoidPtr; /***********************************************************************************/ /// @brief Helper class to contain a process's image and blob. /***********************************************************************************/ struct PROCESS_IMAGE final { explicit PROCESS_IMAGE() = default; private: friend USER_PROCESS; friend KERNEL_PROCESS; friend class UserProcessScheduler; ImagePtr fCode; ImagePtr fBlob; public: Bool HasCode() const { return this->fCode != nullptr; } Bool HasImage() const { return this->fBlob != nullptr; } ErrorOr Leak() { if (this->fCode) { return ErrorOr{this->fCode}; } return ErrorOr{kErrorInvalidData}; } ErrorOr LeakBlob() { if (this->fBlob) { return ErrorOr{this->fBlob}; } return ErrorOr{kErrorInvalidData}; } }; } // namespace Kernel