[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

svn path=/trunk/; revision=68123
This commit is contained in:
Timo Kreuzer 2015-06-13 19:18:25 +00:00
parent 1d240a84ee
commit 0dfd2330e2
2 changed files with 122 additions and 20 deletions

View file

@ -1686,6 +1686,59 @@ MmGetFileObjectForSection(IN PVOID SectionObject)
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 @@ MmGetFileNameForAddress(IN PVOID Address,
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 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage,
IN PVOID File2MappedAsFile)
{
PVOID AddressSpace;
PMMVAD Vad1, Vad2;
PFILE_OBJECT FileObject1, FileObject2;
NTSTATUS Status;
@ -3106,34 +3171,66 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage,
AddressSpace = MmGetCurrentAddressSpace();
MmLockAddressSpace(AddressSpace);
/* Get the file object pointer for address 1 */
Status = MiGetFileObjectForSectionAddress(File1MappedAsAnImage, &FileObject1);
if (!NT_SUCCESS(Status))
/* Get the VAD for Address 1 */
Vad1 = MiLocateAddress(File1MappedAsAnImage);
if (Vad1 == NULL)
{
DPRINT1("Failed to get file object for Address %p\n", File1MappedAsAnImage);
MmUnlockAddressSpace(AddressSpace);
return Status;
/* Fail, the address does not exist */
DPRINT1("No VAD at address 1 %p\n", File1MappedAsAnImage);
Status = STATUS_INVALID_ADDRESS;
goto Exit;
}
/* Get the file object pointer for address 2 */
Status = MiGetFileObjectForSectionAddress(File2MappedAsFile, &FileObject2);
if (!NT_SUCCESS(Status))
/* Get the VAD for Address 2 */
Vad2 = MiLocateAddress(File2MappedAsFile);
if (Vad2 == NULL)
{
DPRINT1("Failed to get file object for Address %p\n", File1MappedAsAnImage);
MmUnlockAddressSpace(AddressSpace);
return Status;
/* 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)
if (FileObject1->SectionObjectPointer == FileObject2->SectionObjectPointer)
{
MmUnlockAddressSpace(AddressSpace);
return STATUS_NOT_SAME_DEVICE;
Status = STATUS_SUCCESS;
}
else
{
Status = STATUS_NOT_SAME_DEVICE;
}
Exit:
/* Unlock address space */
MmUnlockAddressSpace(AddressSpace);
return STATUS_SUCCESS;
return Status;
}
/*

View file

@ -3979,6 +3979,11 @@ MmMapViewOfSegment(PMMSUPPORT AddressSpace,
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);