https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ce94d37dbe8670bb7f2a8c344f89429b53739b91

commit ce94d37dbe8670bb7f2a8c344f89429b53739b91
Author:     Pierre Schweitzer <[email protected]>
AuthorDate: Sat Nov 17 15:01:05 2018 +0100
Commit:     Pierre Schweitzer <[email protected]>
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;
+        }
+    }
 }
 
 /*

Reply via email to