diff --git a/ntoskrnl/cache/section/newmm.h b/ntoskrnl/cache/section/newmm.h index d5f9998993..e567d7121e 100644 --- a/ntoskrnl/cache/section/newmm.h +++ b/ntoskrnl/cache/section/newmm.h @@ -21,7 +21,7 @@ #define MM_SEGMENT_FINALIZE (0x40000000) -#define RMAP_SEGMENT_MASK ~((ULONG_PTR)0xff) +#define RMAP_SEGMENT_MASK ~((ULONG_PTR)0x7ff) #define RMAP_IS_SEGMENT(x) (((ULONG_PTR)(x) & RMAP_SEGMENT_MASK) == RMAP_SEGMENT_MASK) #define MIN(x,y) (((x)<(y))?(x):(y)) diff --git a/ntoskrnl/cache/section/sptab.c b/ntoskrnl/cache/section/sptab.c index 454fb25af4..82791eec69 100644 --- a/ntoskrnl/cache/section/sptab.c +++ b/ntoskrnl/cache/section/sptab.c @@ -360,6 +360,11 @@ MmSetSectionAssociation(PFN_NUMBER Page, ASSERT(PageTable); ActualOffset = (ULONG)(Offset->QuadPart - PageTable->FileOffset.QuadPart); + if (((ActualOffset >> PAGE_SHIFT) & ~0xff) != 0) + { + DPRINT1("MmSetSectionAssociation with large offset 0x%lx for Page 0x%lx\n", + ActualOffset, Page); + } MmInsertRmap(Page, (PEPROCESS)PageTable, (PVOID)(RMAP_SEGMENT_MASK | (ActualOffset >> PAGE_SHIFT))); diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index d5094e0915..a079afef53 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -237,7 +237,7 @@ typedef struct _MM_RMAP_ENTRY PEPROCESS Process; PVOID Address; #if DBG - PVOID Caller; + PVOID Backtrace[5]; #endif } MM_RMAP_ENTRY, *PMM_RMAP_ENTRY; diff --git a/ntoskrnl/mm/rmap.c b/ntoskrnl/mm/rmap.c index 0064ba27da..b46a96b2ca 100644 --- a/ntoskrnl/mm/rmap.c +++ b/ntoskrnl/mm/rmap.c @@ -281,11 +281,10 @@ MmInsertRmap(PFN_NUMBER Page, PEPROCESS Process, new_entry->Address = Address; new_entry->Process = (PEPROCESS)Process; #if DBG -#ifdef __GNUC__ - new_entry->Caller = __builtin_return_address(0); -#else - new_entry->Caller = _ReturnAddress(); -#endif + RtlCaptureStackBackTrace(1, + RTL_NUMBER_OF(new_entry->Backtrace), + new_entry->Backtrace, + NULL); #endif if ( @@ -306,15 +305,27 @@ MmInsertRmap(PFN_NUMBER Page, PEPROCESS Process, #if DBG while (current_entry) { - if (current_entry->Address == new_entry->Address && current_entry->Process == new_entry->Process) + ASSERT(new_entry->Address == Address); + if (current_entry->Process == new_entry->Process) { - DbgPrint("MmInsertRmap tries to add a second rmap entry for address %p\n current caller ", - current_entry->Address); - DbgPrint("%p", new_entry->Caller); - DbgPrint("\n previous caller "); - DbgPrint("%p", current_entry->Caller); - DbgPrint("\n"); - KeBugCheck(MEMORY_MANAGEMENT); + if (RMAP_IS_SEGMENT(current_entry->Address) && RMAP_IS_SEGMENT(new_entry->Address) && + ((ULONG_PTR)current_entry->Address & 0xff) == ((ULONG_PTR)new_entry->Address & 0xff)) + { + DPRINT1("Segment RMAPs with same lower byte. %p vs %p\n", + current_entry->Address, + new_entry->Address); + } + if (current_entry->Address == new_entry->Address) + { + DbgPrint("MmInsertRmap tries to add a second rmap entry for address %p", + current_entry->Address); + DbgPrint("\n current caller "); + DbgPrint("%p %p %p %p %p", new_entry->Backtrace[0], new_entry->Backtrace[1], new_entry->Backtrace[2], new_entry->Backtrace[3], new_entry->Backtrace[4]); + DbgPrint("\n previous caller "); + DbgPrint("%p %p %p %p %p", current_entry->Backtrace[0], current_entry->Backtrace[1], current_entry->Backtrace[2], current_entry->Backtrace[3], current_entry->Backtrace[4]); + DbgPrint("\n"); + KeBugCheck(MEMORY_MANAGEMENT); + } } current_entry = current_entry->Next; }