From: Pierre Schweitzer Date: Sat, 17 Nov 2018 14:01:05 +0000 (+0100) Subject: [NTOSKRNL] Implement ExInitializeRundownProtectionCacheAware() X-Git-Tag: 0.4.12-dev~200 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=ce94d37dbe8670bb7f2a8c344f89429b53739b91 [NTOSKRNL] Implement ExInitializeRundownProtectionCacheAware() --- diff --git a/ntoskrnl/ex/rundown.c b/ntoskrnl/ex/rundown.c index a6561df1cb0..5b354857e34 100644 --- a/ntoskrnl/ex/rundown.c +++ b/ntoskrnl/ex/rundown.c @@ -552,16 +552,57 @@ ExFreeCacheAwareRundownProtection(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAwar } /* - * @unimplemented NT5.2 + * @implemented NT5.2 */ VOID NTAPI ExInitializeRundownProtectionCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, - IN SIZE_T Count) + IN SIZE_T Size) { - DBG_UNREFERENCED_PARAMETER(RunRefCacheAware); - DBG_UNREFERENCED_PARAMETER(Count); - UNIMPLEMENTED; + PVOID Pool; + PEX_RUNDOWN_REF RunRef; + ULONG Count, RunRefSize, Offset; + + PAGED_CODE(); + + /* Get the user allocate pool for runrefs */ + Pool = (PVOID)((ULONG_PTR)RunRefCacheAware + sizeof(EX_RUNDOWN_REF_CACHE_AWARE)); + + /* By default a runref is structure-sized */ + RunRefSize = sizeof(EX_RUNDOWN_REF); + + /* + * If we just have enough room for a single runref, deduce were on a single + * processor machine + */ + if (Size == sizeof(EX_RUNDOWN_REF_CACHE_AWARE) + sizeof(EX_RUNDOWN_REF)) + { + Count = 1; + } + else + { + /* FIXME: Properly align on SMP */ + UNIMPLEMENTED; + } + + /* Initialize the structure */ + RunRefCacheAware->RunRefs = Pool; + RunRefCacheAware->RunRefSize = RunRefSize; + RunRefCacheAware->Number = Count; + + /* There is no allocated pool! */ + RunRefCacheAware->PoolToFree = (PVOID)0xBADCA11u; + + /* Initialize runref */ + if (RunRefCacheAware->Number != 0) + { + for (Count = 0; Count < RunRefCacheAware->Number; ++Count) + { + Offset = RunRefCacheAware->RunRefSize * Count; + RunRef = (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + Offset); + RunRef->Count = 0; + } + } } /*