https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ce94d37dbe8670bb7f2a8c...
commit ce94d37dbe8670bb7f2a8c344f89429b53739b91 Author: Pierre Schweitzer pierre@reactos.org AuthorDate: Sat Nov 17 15:01:05 2018 +0100 Commit: Pierre Schweitzer pierre@reactos.org CommitDate: Sat Nov 17 16:44:35 2018 +0100
[NTOSKRNL] Implement ExInitializeRundownProtectionCacheAware() --- ntoskrnl/ex/rundown.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-)
diff --git a/ntoskrnl/ex/rundown.c b/ntoskrnl/ex/rundown.c index a6561df1cb..5b354857e3 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; + } + } }
/*