diff --git a/xtoskrnl/includes/ke/guard.hh b/xtoskrnl/includes/ke/guard.hh index 27bd824..f6bb041 100644 --- a/xtoskrnl/includes/ke/guard.hh +++ b/xtoskrnl/includes/ke/guard.hh @@ -19,17 +19,26 @@ namespace KE { private: KSPIN_LOCK_QUEUE_LEVEL QueuedLockLevel; + BOOLEAN Owned; public: - QueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel) + QueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel, + IN BOOLEAN Acquire = TRUE) { QueuedLockLevel = LockLevel; - KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel); + Owned = Acquire; + if(Owned) + { + KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel); + } } ~QueuedSpinLockGuard() { - KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel); + if(Owned) + { + KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel); + } } QueuedSpinLockGuard(const QueuedSpinLockGuard&) = delete; @@ -40,17 +49,26 @@ namespace KE { private: PKSPIN_LOCK Lock; + BOOLEAN Owned; public: - SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock) + SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock, + IN BOOLEAN Acquire = TRUE) { Lock = SpinLock; - KE::SpinLock::AcquireSpinLock(Lock); + Owned = Acquire; + if(Owned) + { + KE::SpinLock::AcquireSpinLock(Lock); + } } ~SpinLockGuard() { - KE::SpinLock::ReleaseSpinLock(Lock); + if(Owned) + { + KE::SpinLock::ReleaseSpinLock(Lock); + } } SpinLockGuard(const SpinLockGuard&) = delete; diff --git a/xtoskrnl/includes/ke/runlevel.hh b/xtoskrnl/includes/ke/runlevel.hh index 82685c9..ab4251d 100644 --- a/xtoskrnl/includes/ke/runlevel.hh +++ b/xtoskrnl/includes/ke/runlevel.hh @@ -27,17 +27,26 @@ namespace KE { private: KRUNLEVEL PreviousRunLevel; + BOOLEAN Switched; public: - LowerRunLevel(KRUNLEVEL RunLevel) + LowerRunLevel(IN KRUNLEVEL RunLevel, + IN BOOLEAN ChangeLevel = TRUE) { PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel(); - KE::RunLevel::LowerRunLevel(RunLevel); + Switched = ChangeLevel; + if(Switched) + { + KE::RunLevel::LowerRunLevel(RunLevel); + } } ~LowerRunLevel() { - KE::RunLevel::RaiseRunLevel(PreviousRunLevel); + if(Switched) + { + KE::RunLevel::RaiseRunLevel(PreviousRunLevel); + } } LowerRunLevel(const LowerRunLevel&) = delete; @@ -48,17 +57,26 @@ namespace KE { private: KRUNLEVEL PreviousRunLevel; + BOOLEAN Switched; public: - RaiseRunLevel(KRUNLEVEL RunLevel) + RaiseRunLevel(IN KRUNLEVEL RunLevel, + IN BOOLEAN ChangeLevel = TRUE) { PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel(); - KE::RunLevel::RaiseRunLevel(RunLevel); + Switched = ChangeLevel; + if(Switched) + { + KE::RunLevel::RaiseRunLevel(RunLevel); + } } ~RaiseRunLevel() { - KE::RunLevel::LowerRunLevel(PreviousRunLevel); + if(Switched) + { + KE::RunLevel::LowerRunLevel(PreviousRunLevel); + } } RaiseRunLevel(const RaiseRunLevel&) = delete;