mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
[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:
parent
1d240a84ee
commit
0dfd2330e2
2 changed files with 122 additions and 20 deletions
|
@ -1686,6 +1686,59 @@ MmGetFileObjectForSection(IN PVOID SectionObject)
|
||||||
return ((PROS_SECTION_OBJECT)SectionObject)->FileObject;
|
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
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
MmGetImageInformation (OUT PSECTION_IMAGE_INFORMATION ImageInformation)
|
MmGetImageInformation (OUT PSECTION_IMAGE_INFORMATION ImageInformation)
|
||||||
|
@ -1771,19 +1824,30 @@ MmGetFileNameForAddress(IN PVOID Address,
|
||||||
POBJECT_NAME_INFORMATION ModuleNameInformation;
|
POBJECT_NAME_INFORMATION ModuleNameInformation;
|
||||||
PVOID AddressSpace;
|
PVOID AddressSpace;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
PMMVAD Vad;
|
||||||
PFILE_OBJECT FileObject = NULL;
|
PFILE_OBJECT FileObject = NULL;
|
||||||
|
|
||||||
/* Lock address space */
|
/* Lock address space */
|
||||||
AddressSpace = MmGetCurrentAddressSpace();
|
AddressSpace = MmGetCurrentAddressSpace();
|
||||||
MmLockAddressSpace(AddressSpace);
|
MmLockAddressSpace(AddressSpace);
|
||||||
|
|
||||||
/* Get the file object pointer for the address */
|
/* Get the VAD */
|
||||||
Status = MiGetFileObjectForSectionAddress(Address, &FileObject);
|
Vad = MiLocateAddress(Address);
|
||||||
if (!NT_SUCCESS(Status))
|
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);
|
DPRINT1("Failed to get file object for Address %p\n", Address);
|
||||||
MmUnlockAddressSpace(AddressSpace);
|
MmUnlockAddressSpace(AddressSpace);
|
||||||
return Status;
|
return STATUS_SECTION_NOT_IMAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reference the file object */
|
/* Reference the file object */
|
||||||
|
@ -3099,6 +3163,7 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage,
|
||||||
IN PVOID File2MappedAsFile)
|
IN PVOID File2MappedAsFile)
|
||||||
{
|
{
|
||||||
PVOID AddressSpace;
|
PVOID AddressSpace;
|
||||||
|
PMMVAD Vad1, Vad2;
|
||||||
PFILE_OBJECT FileObject1, FileObject2;
|
PFILE_OBJECT FileObject1, FileObject2;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
@ -3106,34 +3171,66 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage,
|
||||||
AddressSpace = MmGetCurrentAddressSpace();
|
AddressSpace = MmGetCurrentAddressSpace();
|
||||||
MmLockAddressSpace(AddressSpace);
|
MmLockAddressSpace(AddressSpace);
|
||||||
|
|
||||||
/* Get the file object pointer for address 1 */
|
/* Get the VAD for Address 1 */
|
||||||
Status = MiGetFileObjectForSectionAddress(File1MappedAsAnImage, &FileObject1);
|
Vad1 = MiLocateAddress(File1MappedAsAnImage);
|
||||||
if (!NT_SUCCESS(Status))
|
if (Vad1 == NULL)
|
||||||
{
|
{
|
||||||
DPRINT1("Failed to get file object for Address %p\n", File1MappedAsAnImage);
|
/* Fail, the address does not exist */
|
||||||
MmUnlockAddressSpace(AddressSpace);
|
DPRINT1("No VAD at address 1 %p\n", File1MappedAsAnImage);
|
||||||
return Status;
|
Status = STATUS_INVALID_ADDRESS;
|
||||||
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the file object pointer for address 2 */
|
/* Get the VAD for Address 2 */
|
||||||
Status = MiGetFileObjectForSectionAddress(File2MappedAsFile, &FileObject2);
|
Vad2 = MiLocateAddress(File2MappedAsFile);
|
||||||
if (!NT_SUCCESS(Status))
|
if (Vad2 == NULL)
|
||||||
{
|
{
|
||||||
DPRINT1("Failed to get file object for Address %p\n", File1MappedAsAnImage);
|
/* Fail, the address does not exist */
|
||||||
MmUnlockAddressSpace(AddressSpace);
|
DPRINT1("No VAD at address 2 %p\n", File2MappedAsFile);
|
||||||
return Status;
|
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 */
|
/* SectionObjectPointer is equal if the files are equal */
|
||||||
if (FileObject1->SectionObjectPointer != FileObject2->SectionObjectPointer)
|
if (FileObject1->SectionObjectPointer == FileObject2->SectionObjectPointer)
|
||||||
{
|
{
|
||||||
MmUnlockAddressSpace(AddressSpace);
|
Status = STATUS_SUCCESS;
|
||||||
return STATUS_NOT_SAME_DEVICE;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Status = STATUS_NOT_SAME_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Exit:
|
||||||
/* Unlock address space */
|
/* Unlock address space */
|
||||||
MmUnlockAddressSpace(AddressSpace);
|
MmUnlockAddressSpace(AddressSpace);
|
||||||
return STATUS_SUCCESS;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3979,6 +3979,11 @@ MmMapViewOfSegment(PMMSUPPORT AddressSpace,
|
||||||
MArea->Data.SectionData.Segment = Segment;
|
MArea->Data.SectionData.Segment = Segment;
|
||||||
MArea->Data.SectionData.Section = Section;
|
MArea->Data.SectionData.Section = Section;
|
||||||
MArea->Data.SectionData.ViewOffset.QuadPart = ViewOffset;
|
MArea->Data.SectionData.ViewOffset.QuadPart = ViewOffset;
|
||||||
|
if (Section->AllocationAttributes & SEC_IMAGE)
|
||||||
|
{
|
||||||
|
MArea->VadNode.u.VadFlags.VadType = VadImageMap;
|
||||||
|
}
|
||||||
|
|
||||||
MmInitializeRegion(&MArea->Data.SectionData.RegionListHead,
|
MmInitializeRegion(&MArea->Data.SectionData.RegionListHead,
|
||||||
ViewSize, 0, Protect);
|
ViewSize, 0, Protect);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue