diff --git a/ntoskrnl/mm/i386/page.c b/ntoskrnl/mm/i386/page.c index df13cb013e2..eeccef94346 100644 --- a/ntoskrnl/mm/i386/page.c +++ b/ntoskrnl/mm/i386/page.c @@ -637,6 +637,9 @@ MmCreateVirtualMappingUnsafeEx( PMMPTE PointerPte; MMPTE TempPte; ULONG_PTR Pte; +#ifdef _M_AMD64 + BOOLEAN LockReleased = FALSE; +#endif DPRINT("MmCreateVirtualMappingUnsafe(%p, %p, %lu, %x)\n", Process, Address, flProtect, Page); @@ -665,6 +668,15 @@ MmCreateVirtualMappingUnsafeEx( if (!MiSynchronizeSystemPde(MiAddressToPde(Address))) MiFillSystemPageDirectory(Address, PAGE_SIZE); #endif + +#ifdef _M_AMD64 + /* This is a temporary hack, because we can incur a recursive page fault when accessing the PDE */ + if (PsIdleProcess->AddressCreationLock.Owner == KeGetCurrentThread()) + { + MmUnlockAddressSpace(MmGetKernelAddressSpace()); + LockReleased = TRUE; + } +#endif } else { @@ -715,6 +727,15 @@ MmCreateVirtualMappingUnsafeEx( MiIncrementPageTableReferences(Address); MiUnlockProcessWorkingSetUnsafe(Process, PsGetCurrentThread()); } +#ifdef _M_AMD64 + else + { + if (LockReleased) + { + MmLockAddressSpace(MmGetKernelAddressSpace()); + } + } +#endif return(STATUS_SUCCESS); }