From 016f144f5b2e4ded1e6de67943af35e412ce8da0 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 19 Dec 2004 16:16:58 +0000 Subject: [PATCH] - Remove unused and broken MmSplitMemoryArea function. - Don't allow releasing section with NtFreeVirtualMemory. - Implement TokenDefaultDacl case of NtSetInformationToken. svn path=/trunk/; revision=12226 --- reactos/ntoskrnl/include/internal/mm.h | 8 ---- reactos/ntoskrnl/mm/anonmem.c | 5 ++- reactos/ntoskrnl/mm/marea.c | 49 --------------------- reactos/ntoskrnl/mm/section.c | 6 +-- reactos/ntoskrnl/se/token.c | 59 +++++++++++++++++++++++++- 5 files changed, 63 insertions(+), 64 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 8ed577b6dcc..fbe8d7d6dd9 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -370,14 +370,6 @@ NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea); NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea); -PMEMORY_AREA MmSplitMemoryArea(struct _EPROCESS* Process, - PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA OriginalMemoryArea, - PVOID BaseAddress, - ULONG Length, - ULONG NewType, - ULONG NewAttributes); - MEMORY_AREA* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace, PVOID Address, ULONG Length); diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index 8b54dec2036..8809a4e569d 100644 --- a/reactos/ntoskrnl/mm/anonmem.c +++ b/reactos/ntoskrnl/mm/anonmem.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: anonmem.c,v 1.33 2004/10/01 20:26:04 gvg Exp $ +/* $Id: anonmem.c,v 1.34 2004/12/19 16:16:57 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/anonmem.c @@ -814,7 +814,8 @@ NtFreeVirtualMemory(IN HANDLE ProcessHandle, { case MEM_RELEASE: /* We can only free a memory area in one step. */ - if (MemoryArea->BaseAddress != BaseAddress) + if (MemoryArea->BaseAddress != BaseAddress || + MemoryArea->Type != MEMORY_AREA_VIRTUAL_MEMORY) { MmUnlockAddressSpace(AddressSpace); ObDereferenceObject(Process); diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index b687c249ab0..27476aca74a 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -498,55 +498,6 @@ MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace, return(STATUS_SUCCESS); } -PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process, - PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA OriginalMemoryArea, - PVOID BaseAddress, - ULONG Length, - ULONG NewType, - ULONG NewAttributes) -{ - PMEMORY_AREA Result; - PMEMORY_AREA Split; - - Result = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA), - TAG_MAREA); - RtlZeroMemory(Result,sizeof(MEMORY_AREA)); - Result->Type = NewType; - Result->BaseAddress = BaseAddress; - Result->Length = Length; - Result->Attributes = NewAttributes; - Result->LockCount = 0; - Result->Process = Process; - - if (BaseAddress == OriginalMemoryArea->BaseAddress) - { - OriginalMemoryArea->BaseAddress = (char*)BaseAddress + Length; - OriginalMemoryArea->Length = OriginalMemoryArea->Length - Length; - MmInsertMemoryArea(AddressSpace, Result); - return(Result); - } - if (((char*)BaseAddress + Length) == - ((char*)OriginalMemoryArea->BaseAddress + OriginalMemoryArea->Length)) - { - OriginalMemoryArea->Length = OriginalMemoryArea->Length - Length; - MmInsertMemoryArea(AddressSpace, Result); - - return(Result); - } - - Split = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA), - TAG_MAREA); - RtlCopyMemory(Split,OriginalMemoryArea,sizeof(MEMORY_AREA)); - Split->BaseAddress = (char*)BaseAddress + Length; - Split->Length = OriginalMemoryArea->Length - (((ULONG)BaseAddress) - + Length); - - OriginalMemoryArea->Length = (char*)BaseAddress - (char*)OriginalMemoryArea->BaseAddress; - - return(Split); -} - NTSTATUS MmCreateMemoryArea(PEPROCESS Process, PMADDRESS_SPACE AddressSpace, ULONG Type, diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 13b21a5ae3e..6736942b241 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: section.c,v 1.166 2004/10/22 20:38:23 ekohl Exp $ +/* $Id: section.c,v 1.167 2004/12/19 16:16:58 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -3023,8 +3023,8 @@ MmMapViewOfSegment(PEPROCESS Process, BoundaryAddressMultiple); if (!NT_SUCCESS(Status)) { - DPRINT1("Mapping between 0x%.8X and 0x%.8X failed.\n", - (*BaseAddress), (char*)(*BaseAddress) + ViewSize); + DPRINT1("Mapping between 0x%.8X and 0x%.8X failed (%X).\n", + (*BaseAddress), (char*)(*BaseAddress) + ViewSize, Status); return(Status); } diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index e228413f930..59f13fa23df 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.44 2004/12/14 00:41:24 gdalsnes Exp $ +/* $Id: token.c,v 1.45 2004/12/19 16:16:58 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -913,8 +913,14 @@ NtSetInformationToken(IN HANDLE TokenHandle, NeededAccess = TOKEN_ADJUST_DEFAULT; break; + case TokenDefaultDacl: + if (TokenInformationLength < sizeof(TOKEN_DEFAULT_DACL)) + return STATUS_BUFFER_TOO_SMALL; + NeededAccess = TOKEN_ADJUST_DEFAULT; + break; + default: - DPRINT1("NtSetInformationToken: lying about success (stub)\n"); + DPRINT1("NtSetInformationToken: lying about success (stub) - %x\n", TokenInformationClass); return STATUS_SUCCESS; } @@ -954,6 +960,55 @@ NtSetInformationToken(IN HANDLE TokenHandle, "Token->PrimaryGroup = 0x%08x\n", Token->PrimaryGroup); break; + case TokenDefaultDacl: + { + TOKEN_DEFAULT_DACL TokenDefaultDacl = { 0 }; + ACL OldAcl; + PACL NewAcl; + + Status = MmCopyFromCaller( &TokenDefaultDacl, TokenInformation, + sizeof(TOKEN_DEFAULT_DACL) ); + if (!NT_SUCCESS(Status)) + { + Status = STATUS_INVALID_PARAMETER; + break; + } + + Status = MmCopyFromCaller( &OldAcl, TokenDefaultDacl.DefaultDacl, + sizeof(ACL) ); + if (!NT_SUCCESS(Status)) + { + Status = STATUS_INVALID_PARAMETER; + break; + } + + NewAcl = ExAllocatePool(NonPagedPool, sizeof(ACL)); + if (NewAcl == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + break; + } + + Status = MmCopyFromCaller( NewAcl, TokenDefaultDacl.DefaultDacl, + OldAcl.AclSize ); + if (!NT_SUCCESS(Status)) + { + Status = STATUS_INVALID_PARAMETER; + ExFreePool(NewAcl); + break; + } + + if (Token->DefaultDacl) + { + ExFreePool(Token->DefaultDacl); + } + + Token->DefaultDacl = NewAcl; + + Status = STATUS_SUCCESS; + break; + } + default: Status = STATUS_NOT_IMPLEMENTED; break;