From 4bdfee8e8bec17c37b7b57720f460fe3bded2e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 7 Nov 2021 01:17:32 +0100 Subject: [PATCH] [NTOS:EX] Initialize ExpResourceTimeoutCount also via the "Session Manager/ResourceTimeoutCount" registry value (#4089) For more details, see http://systemmanager.ru/win2k_regestry.en/29859.htm https://www.betaarchive.com/wiki/index.php/Microsoft_KB_Archive/102985#ResourceTimeoutCount_REG_DWORD --- ntoskrnl/config/cmdata.c | 2 +- ntoskrnl/ex/resource.c | 15 ++++++++++----- ntoskrnl/include/internal/ex.h | 1 + 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ntoskrnl/config/cmdata.c b/ntoskrnl/config/cmdata.c index 28ac7041793..80c91534b44 100644 --- a/ntoskrnl/config/cmdata.c +++ b/ntoskrnl/config/cmdata.c @@ -561,7 +561,7 @@ DATA_SEG("INITDATA") CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager", L"ResourceTimeoutCount", - &DummyData, + &ExpResourceTimeoutCount, NULL, NULL }, diff --git a/ntoskrnl/ex/resource.c b/ntoskrnl/ex/resource.c index 5b90c89813c..2ea09a92053 100644 --- a/ntoskrnl/ex/resource.c +++ b/ntoskrnl/ex/resource.c @@ -18,7 +18,7 @@ #define IsOwnedExclusive(r) (r->Flag & ResourceOwnedExclusive) #define IsBoostAllowed(r) (!(r->Flag & ResourceHasDisabledPriorityBoost)) -#if (!(defined(CONFIG_SMP)) && !(DBG)) +#if !defined(CONFIG_SMP) && !DBG FORCEINLINE VOID @@ -65,13 +65,17 @@ ExReleaseResourceLock(IN PERESOURCE Resource, /* Release the lock */ KeReleaseInStackQueuedSpinLock(LockHandle); } -#endif + +#endif // !defined(CONFIG_SMP) && !DBG /* DATA***********************************************************************/ LARGE_INTEGER ExShortTime = {{-100000, -1}}; LARGE_INTEGER ExpTimeout; -ULONG ExpResourceTimeoutCount = 90 * 3600 / 2; + +/* Timeout value for resources in 4-second units (7 days) */ +ULONG ExpResourceTimeoutCount = 90 * 3600 / 2; // NT value: 648000 (30 days) + KSPIN_LOCK ExpResourceSpinLock; LIST_ENTRY ExpSystemResourcesList; BOOLEAN ExResourceStrict = TRUE; @@ -631,7 +635,7 @@ ExpWaitForResource(IN PERESOURCE Resource, /* Increase contention count and use a 5 second timeout */ Resource->ContentionCount++; - Timeout.QuadPart = 500 * -10000; + Timeout.QuadPart = 500 * -10000LL; for (;;) { /* Wait for ownership */ @@ -640,7 +644,8 @@ ExpWaitForResource(IN PERESOURCE Resource, KernelMode, FALSE, &Timeout); - if (Status != STATUS_TIMEOUT) break; + if (Status != STATUS_TIMEOUT) + break; /* Increase wait count */ WaitCount++; diff --git a/ntoskrnl/include/internal/ex.h b/ntoskrnl/include/internal/ex.h index 03d9d29a8b5..f80cc7f8efd 100644 --- a/ntoskrnl/include/internal/ex.h +++ b/ntoskrnl/include/internal/ex.h @@ -19,6 +19,7 @@ extern ERESOURCE ExpFirmwareTableResource; extern ERESOURCE ExpTimeRefreshLock; extern LIST_ENTRY ExpFirmwareTableProviderListHead; extern BOOLEAN ExpIsWinPEMode; +extern ULONG ExpResourceTimeoutCount; extern LIST_ENTRY ExpSystemResourcesList; extern ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset; extern ULONG ExpUnicodeCaseTableDataOffset;