File tree 2 files changed +49
-7
lines changed 2 files changed +49
-7
lines changed Original file line number Diff line number Diff line change @@ -151,6 +151,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
151
151
MMPTE TempPde , TempPte ;
152
152
PVOID NonPagedPoolExpansionVa ;
153
153
ULONG OldCount ;
154
+ KIRQL OldIrql ;
154
155
155
156
/* Check for kernel stack size that's too big */
156
157
if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / _1KB ))
@@ -541,21 +542,26 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
541
542
//
542
543
MiInitializeSystemPtes (PointerPte , MmNumberOfSystemPtes , SystemPteSpace );
543
544
544
- //
545
- // Get the PDE For hyperspace
546
- //
545
+ /* Get the PDE For hyperspace */
547
546
StartPde = MiAddressToPde (HYPER_SPACE );
548
547
549
- //
550
- // Allocate a page for it and create it
551
- //
552
- PageFrameIndex = MmAllocPage (MC_SYSTEM );
548
+ /* Lock PFN database */
549
+ OldIrql = KeAcquireQueuedSpinLock (LockQueuePfnLock );
550
+
551
+ /* Allocate a page for hyperspace and create it */
552
+ PageFrameIndex = MiRemoveAnyPage (0 );
553
553
TempPde .u .Hard .PageFrameNumber = PageFrameIndex ;
554
554
TempPde .u .Hard .Global = FALSE; // Hyperspace is local!
555
555
ASSERT (StartPde -> u .Hard .Valid == 0 );
556
556
ASSERT (TempPde .u .Hard .Valid == 1 );
557
557
* StartPde = TempPde ;
558
558
559
+ /* Flush the TLB */
560
+ KeFlushCurrentTb ();
561
+
562
+ /* Release the lock */
563
+ KeReleaseQueuedSpinLock (LockQueuePfnLock , OldIrql );
564
+
559
565
//
560
566
// Zero out the page table now
561
567
//
Original file line number Diff line number Diff line change 89
89
#define MM_DECOMMIT 0x10
90
90
#define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE)
91
91
92
+ //
93
+ // Corresponds to MMPTE_SOFTWARE.Protection
94
+ //
95
+ #ifdef _M_IX86
96
+ #define MM_PTE_SOFTWARE_PROTECTION_BITS 5
97
+ #elif _M_ARM
98
+ #define MM_PTE_SOFTWARE_PROTECTION_BITS 5
99
+ #elif _M_AMD64
100
+ #define MM_PTE_SOFTWARE_PROTECTION_BITS 5
101
+ #else
102
+ #error Define these please!
103
+ #endif
104
+
105
+ //
106
+ // Creates a software PTE with the given protection
107
+ //
108
+ #define MI_MAKE_SOFTWARE_PTE (x ) ((x) << MM_PTE_SOFTWARE_PROTECTION_BITS)
109
+
92
110
//
93
111
// Special values for LoadedImports
94
112
//
@@ -409,6 +427,12 @@ MmArmAccessFault(
409
427
IN PVOID TrapInformation
410
428
);
411
429
430
+ NTSTATUS
431
+ FASTCALL
432
+ MiCheckPdeForPagedPool (
433
+ IN PVOID Address
434
+ );
435
+
412
436
VOID
413
437
NTAPI
414
438
MiInitializeNonPagedPool (
@@ -532,6 +556,18 @@ MiRemoveHeadList(
532
556
IN PMMPFNLIST ListHead
533
557
);
534
558
559
+ PFN_NUMBER
560
+ NTAPI
561
+ MiAllocatePfn (
562
+ IN PMMPTE PointerPte ,
563
+ IN ULONG Protection
564
+ );
565
+
566
+ PFN_NUMBER
567
+ NTAPI
568
+ MiRemoveAnyPage (
569
+ IN ULONG Color
570
+ );
535
571
536
572
VOID
537
573
NTAPI
You can’t perform that action at this time.
0 commit comments