diff --git a/ntoskrnl/mm/i386/page.c b/ntoskrnl/mm/i386/page.c index cf2e012389..bee163cc8e 100644 --- a/ntoskrnl/mm/i386/page.c +++ b/ntoskrnl/mm/i386/page.c @@ -109,6 +109,46 @@ ULONG MmProtectToValue[32] = /* FUNCTIONS ***************************************************************/ +VOID Delay(INT Amount) +{ + /* This is a kernel mode delay routine programmed by a non-developer. + * I did try KeWaitForSingleObject, but it was always too long or too short. */ + + LARGE_INTEGER time; + LARGE_INTEGER TimeSave; + + int i = 0; + for ( i ; i < Amount; i++) + { + KeQuerySystemTime(&time); + TimeSave = time; + DPRINT("Time - %10lu-%10lu.\n", time.HighPart, time.LowPart); + + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + KeQuerySystemTime(&time); + if (time.LowPart != TimeSave.LowPart) DPRINT("\n"); + + DPRINT("Time - %10lu.\n", time.LowPart); + } +} + NTSTATUS NTAPI MiFillSystemPageDirectory(IN PVOID Base, @@ -298,6 +338,8 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, return; } + Delay(10000); // HACK to workaround CORE-17595 + /* It must have been present, or not a swap entry */ ASSERT(OldPte.u.Hard.Valid || !FlagOn(OldPte.u.Long, 0x800));