https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ce94d37dbe8670bb7f2a8…
commit ce94d37dbe8670bb7f2a8c344f89429b53739b91
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Sat Nov 17 15:01:05 2018 +0100
Commit: Pierre Schweitzer <pierre(a)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;
+ }
+ }
}
/*