[NTOS:MM] Allow MiMapPageInHyperSpace to be called from DISPATCH_LEVEL
authorJérôme Gardou <jerome.gardou@reactos.org>
Wed, 7 Apr 2021 21:05:51 +0000 (23:05 +0200)
committerJérôme Gardou <jerome.gardou@reactos.org>
Wed, 7 Apr 2021 21:09:26 +0000 (23:09 +0200)
Also annotate it to show its behaviour.

ntoskrnl/include/internal/mm.h
ntoskrnl/mm/ARM3/hypermap.c

index 074dbd4..4718fca 100644 (file)
@@ -1011,17 +1011,26 @@ MmZeroPageThread(
 );
 
 /* hypermap.c *****************************************************************/
+_Acquires_lock_(Process->HyperSpaceLock)
+_When_(OldIrql == 0, _IRQL_requires_(DISPATCH_LEVEL))
+_When_(OldIrql != 0, _IRQL_requires_(PASSIVE_LEVEL))
+_When_(OldIrql != 0, _At_(*OldIrql, IRQL_saves_))
+_When_(OldIrql != 0, _IRQL_raises_(DISPATCH_LEVEL))
 PVOID
 NTAPI
-MiMapPageInHyperSpace(IN PEPROCESS Process,
-                      IN PFN_NUMBER Page,
-                      IN PKIRQL OldIrql);
+MiMapPageInHyperSpace(_In_ PEPROCESS Process,
+                      _In_ PFN_NUMBER Page,
+                      _Out_opt_ PKIRQL OldIrql);
 
+_Requires_lock_held_(Process->HyperSpaceLock)
+_Releases_lock_(Process->HyperSpaceLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+_When_(OldIrql != MM_NOIRQL, _At_(OldIrql, _IRQL_restores_))
 VOID
 NTAPI
-MiUnmapPageInHyperSpace(IN PEPROCESS Process,
-                        IN PVOID Address,
-                        IN KIRQL OldIrql);
+MiUnmapPageInHyperSpace(_In_ PEPROCESS Process,
+                        _In_ PVOID Address,
+                        _In_ KIRQL OldIrql);
 
 PVOID
 NTAPI
index 4113814..88d1a1e 100644 (file)
@@ -23,16 +23,24 @@ MMPTE HyperTemplatePte;
 
 /* PRIVATE FUNCTIONS **********************************************************/
 
+_Acquires_lock_(Process->HyperSpaceLock)
+_When_(OldIrql == 0, _IRQL_requires_(DISPATCH_LEVEL))
+_When_(OldIrql != 0, _IRQL_requires_(PASSIVE_LEVEL))
+_When_(OldIrql != 0, _At_(*OldIrql, _IRQL_saves_))
+_When_(OldIrql != 0, _IRQL_raises_(DISPATCH_LEVEL))
 PVOID
 NTAPI
-MiMapPageInHyperSpace(IN PEPROCESS Process,
-                      IN PFN_NUMBER Page,
-                      IN PKIRQL OldIrql)
+MiMapPageInHyperSpace(_In_ PEPROCESS Process,
+                      _In_ PFN_NUMBER Page,
+                      _Out_opt_ PKIRQL OldIrql)
 {
     MMPTE TempPte;
     PMMPTE PointerPte;
     PFN_NUMBER Offset;
 
+    ASSERT(((OldIrql != NULL) && (KeGetCurrentIrql() == PASSIVE_LEVEL))
+        || ((OldIrql == NULL) && (KeGetCurrentIrql() == DISPATCH_LEVEL)));
+
     //
     // Never accept page 0 or non-physical pages
     //
@@ -54,7 +62,10 @@ MiMapPageInHyperSpace(IN PEPROCESS Process,
     // Acquire the hyperlock
     //
     ASSERT(Process == PsGetCurrentProcess());
-    KeAcquireSpinLock(&Process->HyperSpaceLock, OldIrql);
+    if (OldIrql != NULL)
+        KeAcquireSpinLock(&Process->HyperSpaceLock, OldIrql);
+    else
+        KeAcquireSpinLockAtDpcLevel(&Process->HyperSpaceLock);
 
     //
     // Now get the first free PTE
@@ -86,11 +97,15 @@ MiMapPageInHyperSpace(IN PEPROCESS Process,
     return MiPteToAddress(PointerPte);
 }
 
+_Requires_lock_held_(Process->HyperSpaceLock)
+_Releases_lock_(Process->HyperSpaceLock)
+_IRQL_requires_(DISPATCH_LEVEL)
+_When_(OldIrql != MM_NOIRQL, _At_(OldIrql, _IRQL_restores_))
 VOID
 NTAPI
-MiUnmapPageInHyperSpace(IN PEPROCESS Process,
-                        IN PVOID Address,
-                        IN KIRQL OldIrql)
+MiUnmapPageInHyperSpace(_In_ PEPROCESS Process,
+                        _In_ PVOID Address,
+                        _In_ KIRQL OldIrql)
 {
     ASSERT(Process == PsGetCurrentProcess());
 
@@ -103,7 +118,10 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process,
     // Release the hyperlock
     //
     ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
-    KeReleaseSpinLock(&Process->HyperSpaceLock, OldIrql);
+    if (OldIrql == MM_NOIRQL)
+        KeReleaseSpinLockFromDpcLevel(&Process->HyperSpaceLock);
+    else
+        KeReleaseSpinLock(&Process->HyperSpaceLock, OldIrql);
 }
 
 PVOID