Author: tkreuzer
Date: Sat Jun 13 19:18:25 2015
New Revision: 68123
URL:
http://svn.reactos.org/svn/reactos?rev=68123&view=rev
Log:
[NTOSKRNL]
- Set VadType = VadImageMap for image section mappings
- Rewrite MmGetFileNameForAddress and NtAreMappedFilesTheSame. Take into account that the
first address must be an image section mapping
- Fixes a few kernel32_winetest:virtual tests
CORE-9736 #resolve
Modified:
trunk/reactos/ntoskrnl/mm/ARM3/section.c
trunk/reactos/ntoskrnl/mm/section.c
Modified: trunk/reactos/ntoskrnl/mm/ARM3/section.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/section.c…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/section.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/section.c [iso-8859-1] Sat Jun 13 19:18:25 2015
@@ -1686,6 +1686,59 @@
return ((PROS_SECTION_OBJECT)SectionObject)->FileObject;
}
+static
+PFILE_OBJECT
+MiGetFileObjectForVad(
+ _In_ PMMVAD Vad)
+{
+ PCONTROL_AREA ControlArea;
+ PFILE_OBJECT FileObject;
+
+ /* Check if this is a RosMm memory area */
+ if (Vad->u.VadFlags.Spare != 0)
+ {
+ PMEMORY_AREA MemoryArea = (PMEMORY_AREA)Vad;
+ PROS_SECTION_OBJECT Section;
+
+ /* Check if it's a section view (RosMm section) */
+ if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW)
+ {
+ /* Get the section pointer to the SECTION_OBJECT */
+ Section = MemoryArea->Data.SectionData.Section;
+ FileObject = Section->FileObject;
+ }
+ else
+ {
+ ASSERT(MemoryArea->Type == MEMORY_AREA_CACHE);
+ DPRINT1("VAD is a cache section!\n");
+ return NULL;
+ }
+ }
+ else
+ {
+ /* Make sure it's not a VM VAD */
+ if (Vad->u.VadFlags.PrivateMemory == 1)
+ {
+ DPRINT1("VAD is not a section\n");
+ return NULL;
+ }
+
+ /* Get the control area */
+ ControlArea = Vad->ControlArea;
+ if ((ControlArea == NULL) || !ControlArea->u.Flags.Image)
+ {
+ DPRINT1("Address is not a section\n");
+ return NULL;
+ }
+
+ /* Get the file object */
+ FileObject = ControlArea->FilePointer;
+ }
+
+ /* Return the file object */
+ return FileObject;
+}
+
VOID
NTAPI
MmGetImageInformation (OUT PSECTION_IMAGE_INFORMATION ImageInformation)
@@ -1771,19 +1824,30 @@
POBJECT_NAME_INFORMATION ModuleNameInformation;
PVOID AddressSpace;
NTSTATUS Status;
+ PMMVAD Vad;
PFILE_OBJECT FileObject = NULL;
/* Lock address space */
AddressSpace = MmGetCurrentAddressSpace();
MmLockAddressSpace(AddressSpace);
- /* Get the file object pointer for the address */
- Status = MiGetFileObjectForSectionAddress(Address, &FileObject);
- if (!NT_SUCCESS(Status))
+ /* Get the VAD */
+ Vad = MiLocateAddress(Address);
+ if (Vad == NULL)
+ {
+ /* Fail, the address does not exist */
+ DPRINT1("No VAD at address %p\n", Address);
+ MmUnlockAddressSpace(AddressSpace);
+ return STATUS_INVALID_ADDRESS;
+ }
+
+ /* Get the file object pointer for the VAD */
+ FileObject = MiGetFileObjectForVad(Vad);
+ if (FileObject == NULL)
{
DPRINT1("Failed to get file object for Address %p\n", Address);
MmUnlockAddressSpace(AddressSpace);
- return Status;
+ return STATUS_SECTION_NOT_IMAGE;
}
/* Reference the file object */
@@ -3099,6 +3163,7 @@
IN PVOID File2MappedAsFile)
{
PVOID AddressSpace;
+ PMMVAD Vad1, Vad2;
PFILE_OBJECT FileObject1, FileObject2;
NTSTATUS Status;
@@ -3106,34 +3171,66 @@
AddressSpace = MmGetCurrentAddressSpace();
MmLockAddressSpace(AddressSpace);
- /* Get the file object pointer for address 1 */
- Status = MiGetFileObjectForSectionAddress(File1MappedAsAnImage, &FileObject1);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to get file object for Address %p\n",
File1MappedAsAnImage);
- MmUnlockAddressSpace(AddressSpace);
- return Status;
- }
-
- /* Get the file object pointer for address 2 */
- Status = MiGetFileObjectForSectionAddress(File2MappedAsFile, &FileObject2);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to get file object for Address %p\n",
File1MappedAsAnImage);
- MmUnlockAddressSpace(AddressSpace);
- return Status;
+ /* Get the VAD for Address 1 */
+ Vad1 = MiLocateAddress(File1MappedAsAnImage);
+ if (Vad1 == NULL)
+ {
+ /* Fail, the address does not exist */
+ DPRINT1("No VAD at address 1 %p\n", File1MappedAsAnImage);
+ Status = STATUS_INVALID_ADDRESS;
+ goto Exit;
+ }
+
+ /* Get the VAD for Address 2 */
+ Vad2 = MiLocateAddress(File2MappedAsFile);
+ if (Vad2 == NULL)
+ {
+ /* Fail, the address does not exist */
+ DPRINT1("No VAD at address 2 %p\n", File2MappedAsFile);
+ Status = STATUS_INVALID_ADDRESS;
+ goto Exit;
+ }
+
+ /* Get the file object pointer for VAD 1 */
+ FileObject1 = MiGetFileObjectForVad(Vad1);
+ if (FileObject1 == NULL)
+ {
+ DPRINT1("Failed to get file object for Address 1 %p\n",
File1MappedAsAnImage);
+ Status = STATUS_CONFLICTING_ADDRESSES;
+ goto Exit;
+ }
+
+ /* Get the file object pointer for VAD 2 */
+ FileObject2 = MiGetFileObjectForVad(Vad2);
+ if (FileObject2 == NULL)
+ {
+ DPRINT1("Failed to get file object for Address 2 %p\n",
File2MappedAsFile);
+ Status = STATUS_CONFLICTING_ADDRESSES;
+ goto Exit;
+ }
+
+ /* Make sure Vad1 is an image mapping */
+ if (Vad1->u.VadFlags.VadType != VadImageMap)
+ {
+ DPRINT1("Address 1 (%p) is not an image mapping\n",
File1MappedAsAnImage);
+ Status = STATUS_NOT_SAME_DEVICE;
+ goto Exit;
}
/* SectionObjectPointer is equal if the files are equal */
- if (FileObject1->SectionObjectPointer != FileObject2->SectionObjectPointer)
- {
- MmUnlockAddressSpace(AddressSpace);
- return STATUS_NOT_SAME_DEVICE;
- }
-
+ if (FileObject1->SectionObjectPointer == FileObject2->SectionObjectPointer)
+ {
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ Status = STATUS_NOT_SAME_DEVICE;
+ }
+
+Exit:
/* Unlock address space */
MmUnlockAddressSpace(AddressSpace);
- return STATUS_SUCCESS;
+ return Status;
}
/*
Modified: trunk/reactos/ntoskrnl/mm/section.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/section.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/section.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/section.c [iso-8859-1] Sat Jun 13 19:18:25 2015
@@ -3979,6 +3979,11 @@
MArea->Data.SectionData.Segment = Segment;
MArea->Data.SectionData.Section = Section;
MArea->Data.SectionData.ViewOffset.QuadPart = ViewOffset;
+ if (Section->AllocationAttributes & SEC_IMAGE)
+ {
+ MArea->VadNode.u.VadFlags.VadType = VadImageMap;
+ }
+
MmInitializeRegion(&MArea->Data.SectionData.RegionListHead,
ViewSize, 0, Protect);