[NTOSKRNL]

- Remove the BoundaryAddressMultiple parameter from MmCreateMemoryArea (wasn't used) and give it instead a Granularity parameter
- Use the Granularity parameter in MmMapViewOfSegment to make sure that full sections are allocated on a MM_ALLOCATION_GRANULARITY aligned address.
- Check for overflow and unaligned image base in MmMapViewOfSection when mapping image sections
- Return proper status code on failure

svn path=/trunk/; revision=61108
This commit is contained in:
Timo Kreuzer 2013-11-26 21:38:02 +00:00
parent ac56ce2849
commit 543797fee3
10 changed files with 60 additions and 68 deletions

View file

@ -627,9 +627,6 @@ _MiMapViewOfSegment(PMMSUPPORT AddressSpace,
{ {
PMEMORY_AREA MArea; PMEMORY_AREA MArea;
NTSTATUS Status; NTSTATUS Status;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
BoundaryAddressMultiple.QuadPart = 0;
Status = MmCreateMemoryArea(AddressSpace, Status = MmCreateMemoryArea(AddressSpace,
MEMORY_AREA_CACHE, MEMORY_AREA_CACHE,
@ -639,7 +636,7 @@ _MiMapViewOfSegment(PMMSUPPORT AddressSpace,
&MArea, &MArea,
FALSE, FALSE,
AllocationType, AllocationType,
BoundaryAddressMultiple); PAGE_SIZE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {

View file

@ -611,13 +611,11 @@ CcRosCreateCacheSegment (
#ifdef CACHE_BITMAP #ifdef CACHE_BITMAP
ULONG StartingOffset; ULONG StartingOffset;
#endif #endif
PHYSICAL_ADDRESS BoundaryAddressMultiple;
ASSERT(Bcb); ASSERT(Bcb);
DPRINT("CcRosCreateCacheSegment()\n"); DPRINT("CcRosCreateCacheSegment()\n");
BoundaryAddressMultiple.QuadPart = 0;
if (FileOffset >= Bcb->FileSize.u.LowPart) if (FileOffset >= Bcb->FileSize.u.LowPart)
{ {
CacheSeg = NULL; CacheSeg = NULL;
@ -742,7 +740,7 @@ CcRosCreateCacheSegment (
(PMEMORY_AREA*)&current->MemoryArea, (PMEMORY_AREA*)&current->MemoryArea,
FALSE, FALSE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
MmUnlockAddressSpace(MmGetKernelAddressSpace()); MmUnlockAddressSpace(MmGetKernelAddressSpace());
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
@ -1370,12 +1368,10 @@ CcInitView (
#ifdef CACHE_BITMAP #ifdef CACHE_BITMAP
PMEMORY_AREA marea; PMEMORY_AREA marea;
PVOID Buffer; PVOID Buffer;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
#endif #endif
DPRINT("CcInitView()\n"); DPRINT("CcInitView()\n");
#ifdef CACHE_BITMAP #ifdef CACHE_BITMAP
BoundaryAddressMultiple.QuadPart = 0;
CiCacheSegMappingRegionHint = 0; CiCacheSegMappingRegionHint = 0;
CiCacheSegMappingRegionBase = NULL; CiCacheSegMappingRegionBase = NULL;
@ -1389,7 +1385,7 @@ CcInitView (
&marea, &marea,
FALSE, FALSE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
MmUnlockAddressSpace(MmGetKernelAddressSpace()); MmUnlockAddressSpace(MmGetKernelAddressSpace());
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {

View file

@ -512,7 +512,7 @@ MmCreateMemoryArea(
PMEMORY_AREA *Result, PMEMORY_AREA *Result,
BOOLEAN FixedAddress, BOOLEAN FixedAddress,
ULONG AllocationFlags, ULONG AllocationFlags,
PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL ULONG AllocationGranularity
); );
PMEMORY_AREA PMEMORY_AREA

View file

@ -30,9 +30,7 @@ MiRosTakeOverSharedUserPage(IN PEPROCESS Process)
{ {
NTSTATUS Status; NTSTATUS Status;
PMEMORY_AREA MemoryArea; PMEMORY_AREA MemoryArea;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
PVOID AllocatedBase = (PVOID)MM_SHARED_USER_DATA_VA; PVOID AllocatedBase = (PVOID)MM_SHARED_USER_DATA_VA;
BoundaryAddressMultiple.QuadPart = 0;
Status = MmCreateMemoryArea(&Process->Vm, Status = MmCreateMemoryArea(&Process->Vm,
MEMORY_AREA_OWNED_BY_ARM3, MEMORY_AREA_OWNED_BY_ARM3,
@ -42,7 +40,7 @@ MiRosTakeOverSharedUserPage(IN PEPROCESS Process)
&MemoryArea, &MemoryArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(NT_SUCCESS(Status)); ASSERT(NT_SUCCESS(Status));
} }

View file

@ -129,11 +129,10 @@ MiInsertNode(IN PMM_AVL_TABLE Table,
{ {
NTSTATUS Status; NTSTATUS Status;
PMEMORY_AREA MemoryArea; PMEMORY_AREA MemoryArea;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
SIZE_T Size; SIZE_T Size;
PEPROCESS Process = CONTAINING_RECORD(Table, EPROCESS, VadRoot); PEPROCESS Process = CONTAINING_RECORD(Table, EPROCESS, VadRoot);
PVOID AllocatedBase = (PVOID)(Vad->StartingVpn << PAGE_SHIFT); PVOID AllocatedBase = (PVOID)(Vad->StartingVpn << PAGE_SHIFT);
BoundaryAddressMultiple.QuadPart = 0;
Size = ((Vad->EndingVpn + 1) - Vad->StartingVpn) << PAGE_SHIFT; Size = ((Vad->EndingVpn + 1) - Vad->StartingVpn) << PAGE_SHIFT;
Status = MmCreateMemoryArea(&Process->Vm, Status = MmCreateMemoryArea(&Process->Vm,
MEMORY_AREA_OWNED_BY_ARM3, MEMORY_AREA_OWNED_BY_ARM3,
@ -143,7 +142,7 @@ MiInsertNode(IN PMM_AVL_TABLE Table,
&MemoryArea, &MemoryArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(NT_SUCCESS(Status)); ASSERT(NT_SUCCESS(Status));
/* Check if this is VM VAD */ /* Check if this is VM VAD */

View file

@ -779,14 +779,12 @@ NTAPI
MiInitPageDirectoryMap(VOID) MiInitPageDirectoryMap(VOID)
{ {
MEMORY_AREA* MemoryArea = NULL; MEMORY_AREA* MemoryArea = NULL;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
PVOID BaseAddress; PVOID BaseAddress;
NTSTATUS Status; NTSTATUS Status;
// //
// Create memory area for the PTE area // Create memory area for the PTE area
// //
BoundaryAddressMultiple.QuadPart = 0;
BaseAddress = (PVOID)PTE_BASE; BaseAddress = (PVOID)PTE_BASE;
Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
MEMORY_AREA_OWNED_BY_ARM3, MEMORY_AREA_OWNED_BY_ARM3,
@ -796,7 +794,7 @@ MiInitPageDirectoryMap(VOID)
&MemoryArea, &MemoryArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(NT_SUCCESS(Status)); ASSERT(NT_SUCCESS(Status));
// //
@ -811,7 +809,7 @@ MiInitPageDirectoryMap(VOID)
&MemoryArea, &MemoryArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(NT_SUCCESS(Status)); ASSERT(NT_SUCCESS(Status));
// //
@ -826,7 +824,7 @@ MiInitPageDirectoryMap(VOID)
&MemoryArea, &MemoryArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(NT_SUCCESS(Status)); ASSERT(NT_SUCCESS(Status));
} }

View file

@ -2311,13 +2311,11 @@ MiInitPageDirectoryMap(VOID)
{ {
MEMORY_AREA* kernel_map_desc = NULL; MEMORY_AREA* kernel_map_desc = NULL;
MEMORY_AREA* hyperspace_desc = NULL; MEMORY_AREA* hyperspace_desc = NULL;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
PVOID BaseAddress; PVOID BaseAddress;
NTSTATUS Status; NTSTATUS Status;
DPRINT("MiInitPageDirectoryMap()\n"); DPRINT("MiInitPageDirectoryMap()\n");
BoundaryAddressMultiple.QuadPart = 0;
BaseAddress = (PVOID)PAGETABLE_MAP; BaseAddress = (PVOID)PAGETABLE_MAP;
Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
MEMORY_AREA_SYSTEM, MEMORY_AREA_SYSTEM,
@ -2327,7 +2325,7 @@ MiInitPageDirectoryMap(VOID)
&kernel_map_desc, &kernel_map_desc,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ASSERT(FALSE); ASSERT(FALSE);
@ -2341,7 +2339,7 @@ MiInitPageDirectoryMap(VOID)
&hyperspace_desc, &hyperspace_desc,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ASSERT(FALSE); ASSERT(FALSE);

View file

@ -984,10 +984,8 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace,
PMEMORY_AREA *Result, PMEMORY_AREA *Result,
BOOLEAN FixedAddress, BOOLEAN FixedAddress,
ULONG AllocationFlags, ULONG AllocationFlags,
PHYSICAL_ADDRESS BoundaryAddressMultiple) ULONG Granularity)
{ {
PVOID EndAddress;
ULONG Granularity;
ULONG_PTR tmpLength; ULONG_PTR tmpLength;
PMEMORY_AREA MemoryArea; PMEMORY_AREA MemoryArea;
@ -997,7 +995,6 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace,
Type, BaseAddress, *BaseAddress, Length, AllocationFlags, Type, BaseAddress, *BaseAddress, Length, AllocationFlags,
FixedAddress, Result); FixedAddress, Result);
Granularity = PAGE_SIZE;
if ((*BaseAddress) == 0 && !FixedAddress) if ((*BaseAddress) == 0 && !FixedAddress)
{ {
tmpLength = (ULONG_PTR)MM_ROUND_UP(Length, Granularity); tmpLength = (ULONG_PTR)MM_ROUND_UP(Length, Granularity);
@ -1030,12 +1027,6 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace,
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
if (BoundaryAddressMultiple.QuadPart != 0)
{
EndAddress = ((char*)(*BaseAddress)) + tmpLength-1;
ASSERT(((ULONG_PTR)*BaseAddress/BoundaryAddressMultiple.QuadPart) == ((DWORD_PTR)EndAddress/BoundaryAddressMultiple.QuadPart));
}
if (MmLocateMemoryAreaByRegion(AddressSpace, if (MmLocateMemoryAreaByRegion(AddressSpace,
*BaseAddress, *BaseAddress,
tmpLength) != NULL) tmpLength) != NULL)

View file

@ -44,10 +44,8 @@ NTAPI
MiInitSystemMemoryAreas() MiInitSystemMemoryAreas()
{ {
PVOID BaseAddress; PVOID BaseAddress;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
PMEMORY_AREA MArea; PMEMORY_AREA MArea;
NTSTATUS Status; NTSTATUS Status;
BoundaryAddressMultiple.QuadPart = 0;
// //
// Create the memory area to define the loader mappings // Create the memory area to define the loader mappings
@ -61,7 +59,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -76,7 +74,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -91,7 +89,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -106,7 +104,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -121,7 +119,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -136,7 +134,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -151,7 +149,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -167,7 +165,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -182,7 +180,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
#ifndef _M_AMD64 #ifndef _M_AMD64
// //
@ -197,7 +195,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
#endif #endif
// //
@ -212,7 +210,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
// //
@ -227,7 +225,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
#if defined(_X86_) #if defined(_X86_)
@ -243,7 +241,7 @@ MiInitSystemMemoryAreas()
&MArea, &MArea,
TRUE, TRUE,
0, 0,
BoundaryAddressMultiple); PAGE_SIZE);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
#endif #endif
} }

View file

@ -200,7 +200,7 @@ NTSTATUS NTAPI PeFmtCreateSection(IN CONST VOID * FileHeader,
ULONG cbHeadersSize = 0; ULONG cbHeadersSize = 0;
ULONG nSectionAlignment; ULONG nSectionAlignment;
ULONG nFileAlignment; ULONG nFileAlignment;
ULONG ImageBase; ULONG_PTR ImageBase;
const IMAGE_DOS_HEADER * pidhDosHeader; const IMAGE_DOS_HEADER * pidhDosHeader;
const IMAGE_NT_HEADERS32 * pinhNtHeader; const IMAGE_NT_HEADERS32 * pinhNtHeader;
const IMAGE_OPTIONAL_HEADER32 * piohOptHeader; const IMAGE_OPTIONAL_HEADER32 * piohOptHeader;
@ -457,7 +457,7 @@ l_ReadHeaderFromFile:
break; break;
} }
#ifdef _WIN64
/* PE64 */ /* PE64 */
case IMAGE_NT_OPTIONAL_HDR64_MAGIC: case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
{ {
@ -535,6 +535,7 @@ l_ReadHeaderFromFile:
break; break;
} }
#endif // _WIN64
} }
/* [1], section 3.4.2 */ /* [1], section 3.4.2 */
@ -2816,7 +2817,8 @@ MmCreatePageFileSection(PROS_SECTION_OBJECT *SectionObject,
if (UMaximumSize == NULL) if (UMaximumSize == NULL)
{ {
return(STATUS_UNSUCCESSFUL); DPRINT1("MmCreatePageFileSection: (UMaximumSize == NULL)\n");
return(STATUS_INVALID_PARAMETER);
} }
MaximumSize = *UMaximumSize; MaximumSize = *UMaximumSize;
@ -2834,6 +2836,7 @@ MmCreatePageFileSection(PROS_SECTION_OBJECT *SectionObject,
(PVOID*)(PVOID)&Section); (PVOID*)(PVOID)&Section);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("MmCreatePageFileSection: failed to create object (0x%lx)\n", Status);
return(Status); return(Status);
} }
@ -3901,7 +3904,7 @@ MmMapViewOfSegment(PMMSUPPORT AddressSpace,
{ {
PMEMORY_AREA MArea; PMEMORY_AREA MArea;
NTSTATUS Status; NTSTATUS Status;
PHYSICAL_ADDRESS BoundaryAddressMultiple; ULONG Granularity;
if (Segment->WriteCopy) if (Segment->WriteCopy)
{ {
@ -3920,7 +3923,10 @@ MmMapViewOfSegment(PMMSUPPORT AddressSpace,
Protect = PAGE_EXECUTE_READWRITE; Protect = PAGE_EXECUTE_READWRITE;
} }
BoundaryAddressMultiple.QuadPart = 0; if (*BaseAddress == NULL)
Granularity = MM_ALLOCATION_GRANULARITY;
else
Granularity = PAGE_SIZE;
#ifdef NEWCC #ifdef NEWCC
if (Segment->Flags & MM_DATAFILE_SEGMENT) { if (Segment->Flags & MM_DATAFILE_SEGMENT) {
@ -3938,7 +3944,7 @@ MmMapViewOfSegment(PMMSUPPORT AddressSpace,
&MArea, &MArea,
FALSE, FALSE,
AllocationType, AllocationType,
BoundaryAddressMultiple); Granularity);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Mapping between 0x%p and 0x%p failed (%X).\n", DPRINT1("Mapping between 0x%p and 0x%p failed (%X).\n",
@ -4471,9 +4477,19 @@ MmMapViewOfSection(IN PVOID SectionObject,
ImageSectionObject->ImageInformation.ImageFileSize = (ULONG)ImageSize; ImageSectionObject->ImageInformation.ImageFileSize = (ULONG)ImageSize;
/* Check for an illegal base address */ /* Check for an illegal base address */
if ((ImageBase + ImageSize) > (ULONG_PTR)MmHighestUserAddress) if (((ImageBase + ImageSize) > (ULONG_PTR)MmHighestUserAddress) ||
((ImageBase + ImageSize) < ImageSize))
{ {
ImageBase = PAGE_ROUND_DOWN((ULONG_PTR)MmHighestUserAddress - ImageSize); NT_ASSERT(*BaseAddress == NULL);
ImageBase = ALIGN_DOWN_BY((ULONG_PTR)MmHighestUserAddress - ImageSize,
MM_VIRTMEM_GRANULARITY);
NotAtBase = TRUE;
}
else if (ImageBase != ALIGN_DOWN_BY(ImageBase, MM_VIRTMEM_GRANULARITY))
{
NT_ASSERT(*BaseAddress == NULL);
ImageBase = ALIGN_DOWN_BY(ImageBase, MM_VIRTMEM_GRANULARITY);
NotAtBase = TRUE;
} }
/* Check there is enough space to map the section at that point. */ /* Check there is enough space to map the section at that point. */
@ -4484,14 +4500,14 @@ MmMapViewOfSection(IN PVOID SectionObject,
if ((*BaseAddress) != NULL) if ((*BaseAddress) != NULL)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
return(STATUS_UNSUCCESSFUL); return(STATUS_CONFLICTING_ADDRESSES);
} }
/* Otherwise find a gap to map the image. */ /* Otherwise find a gap to map the image. */
ImageBase = (ULONG_PTR)MmFindGap(AddressSpace, PAGE_ROUND_UP(ImageSize), PAGE_SIZE, FALSE); ImageBase = (ULONG_PTR)MmFindGap(AddressSpace, PAGE_ROUND_UP(ImageSize), MM_VIRTMEM_GRANULARITY, FALSE);
if (ImageBase == 0) if (ImageBase == 0)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
return(STATUS_UNSUCCESSFUL); return(STATUS_CONFLICTING_ADDRESSES);
} }
/* Remember that we loaded image at a different base address */ /* Remember that we loaded image at a different base address */
NotAtBase = TRUE; NotAtBase = TRUE;
@ -4599,6 +4615,7 @@ MmMapViewOfSection(IN PVOID SectionObject,
} }
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
NT_ASSERT(*BaseAddress == ALIGN_DOWN_POINTER_BY(*BaseAddress, MM_VIRTMEM_GRANULARITY));
if (NotAtBase) if (NotAtBase)
Status = STATUS_IMAGE_NOT_AT_BASE; Status = STATUS_IMAGE_NOT_AT_BASE;