- Fixed the offset calculation in MmWritePagePhysicalAddress and MmPageOutPhysicalAddress. - Add some code which will check for adding of multiple rmap entries. Modified: trunk/reactos/ntoskrnl/mm/rmap.c _____
Modified: trunk/reactos/ntoskrnl/mm/rmap.c --- trunk/reactos/ntoskrnl/mm/rmap.c 2005-08-16 16:17:47 UTC (rev 17414) +++ trunk/reactos/ntoskrnl/mm/rmap.c 2005-08-16 20:36:03 UTC (rev 17415) @@ -21,6 +21,9 @@
struct _MM_RMAP_ENTRY* Next; PEPROCESS Process; PVOID Address; +#ifdef DBG + PVOID Caller; +#endif } MM_RMAP_ENTRY, *PMM_RMAP_ENTRY;
@@ -110,8 +113,8 @@ Type = MemoryArea->Type; if (Type == MEMORY_AREA_SECTION_VIEW) { - Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress; - + Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress + + MemoryArea->Data.SectionData.ViewOffset; /* * Get or create a pageop */ @@ -234,7 +237,8 @@ Type = MemoryArea->Type; if (Type == MEMORY_AREA_SECTION_VIEW) { - Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress; + Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress + + MemoryArea->Data.SectionData.ViewOffset;;
/* * Get or create a pageop @@ -381,6 +385,9 @@ } new_entry->Address = Address; new_entry->Process = Process; +#ifdef DBG + new_entry->Caller = __builtin_return_address(0); +#endif
if (MmGetPfnForProcess(Process, Address) != Page) { @@ -394,6 +401,22 @@ ExAcquireFastMutex(&RmapListLock); current_entry = MmGetRmapListHeadPage(Page); new_entry->Next = current_entry; +#ifdef DBG + while (current_entry) + { + if (current_entry->Address == new_entry->Address && current_entry->Process == new_entry->Process) + { + DbgPrint("MmInsertRmap tries to add a second rmap entry for address %p\n current caller ", + current_entry->Address); + KeRosPrintAddress(new_entry->Caller); + DbgPrint("\n previous caller "); + KeRosPrintAddress(current_entry->Caller); + DbgPrint("\n"); + KeBugCheck(0); + } + current_entry = current_entry->Next; + } +#endif MmSetRmapListHeadPage(Page, new_entry); ExReleaseFastMutex(&RmapListLock); if (Process == NULL)