From 6c726dfe40cbfb0ca6bd6be12a3bb4a6a4f0af75 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 28 Jan 2001 15:17:52 +0000 Subject: [PATCH] Added mapping of access rights Improved 'open' function svn path=/trunk/; revision=1578 --- reactos/include/ntos/synch.h | 8 +-- reactos/ntoskrnl/mm/section.c | 97 +++++++++++++++++------------------ reactos/ntoskrnl/nt/evtpair.c | 36 ++++++------- reactos/ntoskrnl/nt/ntevent.c | 71 +++++++++++++++---------- reactos/ntoskrnl/nt/ntsem.c | 77 +++++++++++++-------------- reactos/ntoskrnl/nt/nttimer.c | 12 +++++ 6 files changed, 162 insertions(+), 139 deletions(-) diff --git a/reactos/include/ntos/synch.h b/reactos/include/ntos/synch.h index 6dcc696d156..85d1a3bede7 100644 --- a/reactos/include/ntos/synch.h +++ b/reactos/include/ntos/synch.h @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: include/synch.h + * FILE: include/ntos/synch.h * PURPOSE: Synchronization declarations used by all the parts of the * system * PROGRAMMER: David Welch @@ -18,7 +18,9 @@ #define EVENT_MODIFY_STATE (2) #define EVENT_PAIR_ALL_ACCESS (0x1f0000L) #define MUTEX_ALL_ACCESS (0x1f0001L) -#define MUTEX_MODIFY_STATE (1) +#define MUTEX_QUERY_STATE (1) +#define MUTANT_ALL_ACCESS (0x1f0001L) +#define MUTANT_QUERY_STATE (1) #define SEMAPHORE_ALL_ACCESS (0x1f0003L) #define SEMAPHORE_QUERY_STATE (1) #define SEMAPHORE_MODIFY_STATE (2) @@ -27,4 +29,4 @@ #define TIMER_MODIFY_STATE (2) -#endif /* __INCLUDE_PS_H */ +#endif /* __INCLUDE_SYNCH_H */ diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index d48fd13cc02..adc31e0de71 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -1,4 +1,4 @@ -/* $Id: section.c,v 1.42 2001/01/13 18:38:09 dwelch Exp $ +/* $Id: section.c,v 1.43 2001/01/28 15:17:52 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -25,6 +25,12 @@ POBJECT_TYPE EXPORTED MmSectionObjectType = NULL; +static GENERIC_MAPPING MmpSectionMapping = { + STANDARD_RIGHTS_READ | SECTION_MAP_READ | SECTION_QUERY, + STANDARD_RIGHTS_WRITE | SECTION_MAP_WRITE, + STANDARD_RIGHTS_EXECUTE | SECTION_MAP_EXECUTE, + SECTION_ALL_ACCESS}; + /* FUNCTIONS *****************************************************************/ NTSTATUS @@ -231,7 +237,7 @@ MmWaitForPendingOperationSection(PMADDRESS_SPACE AddressSpace, * page-in again so we have to wait again. */ Entry = MmGetPageEntrySection(Section, - Offset.u.LowPart); + Offset.u.LowPart); } while (Entry & SPE_PAGEIN_PENDING); /* @@ -370,7 +376,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, MmWaitForFreePages(); MmLockAddressSpace(AddressSpace); MmLockSection(Section); - Entry1 = MmGetPageEntrySection(Section, Offset.u.LowPart); + Entry1 = MmGetPageEntrySection(Section, Offset.u.LowPart); if (Entry1 & SPE_PAGEIN_PENDING) { return(MmWaitForPendingOperationSection(AddressSpace, @@ -411,7 +417,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, * Clear the wait state (Since we are holding the only reference to * page this is safe) */ - MmClearWaitPage(Page); + MmClearWaitPage(Page); /* * Notify any other threads that fault on the same section offset @@ -597,14 +603,14 @@ MmCreatePhysicalMemorySection(VOID) */ SectionSize.QuadPart = 0xFFFFFFFF; RtlInitUnicodeString(&Name, L"\\Device\\PhysicalMemory"); - InitializeObjectAttributes(&Obj, + InitializeObjectAttributes(&Obj, &Name, 0, NULL, NULL); Status = NtCreateSection(&PhysSectionH, SECTION_ALL_ACCESS, - &Obj, + &Obj, &SectionSize, PAGE_EXECUTE_READWRITE, 0, @@ -634,36 +640,37 @@ MmCreatePhysicalMemorySection(VOID) NTSTATUS MmInitSectionImplementation(VOID) { - MmSectionObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); - - RtlInitUnicodeString(&MmSectionObjectType->TypeName, L"Section"); - - MmSectionObjectType->TotalObjects = 0; - MmSectionObjectType->TotalHandles = 0; - MmSectionObjectType->MaxObjects = ULONG_MAX; - MmSectionObjectType->MaxHandles = ULONG_MAX; - MmSectionObjectType->PagedPoolCharge = 0; - MmSectionObjectType->NonpagedPoolCharge = sizeof(SECTION_OBJECT); - MmSectionObjectType->Dump = NULL; - MmSectionObjectType->Open = NULL; - MmSectionObjectType->Close = MmpCloseSection; - MmSectionObjectType->Delete = MmpDeleteSection; - MmSectionObjectType->Parse = NULL; - MmSectionObjectType->Security = NULL; - MmSectionObjectType->QueryName = NULL; - MmSectionObjectType->OkayToClose = NULL; - MmSectionObjectType->Create = MmpCreateSection; + MmSectionObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); - return(STATUS_SUCCESS); + RtlInitUnicodeString(&MmSectionObjectType->TypeName, L"Section"); + + MmSectionObjectType->TotalObjects = 0; + MmSectionObjectType->TotalHandles = 0; + MmSectionObjectType->MaxObjects = ULONG_MAX; + MmSectionObjectType->MaxHandles = ULONG_MAX; + MmSectionObjectType->PagedPoolCharge = 0; + MmSectionObjectType->NonpagedPoolCharge = sizeof(SECTION_OBJECT); + MmSectionObjectType->Mapping = &MmpSectionMapping; + MmSectionObjectType->Dump = NULL; + MmSectionObjectType->Open = NULL; + MmSectionObjectType->Close = MmpCloseSection; + MmSectionObjectType->Delete = MmpDeleteSection; + MmSectionObjectType->Parse = NULL; + MmSectionObjectType->Security = NULL; + MmSectionObjectType->QueryName = NULL; + MmSectionObjectType->OkayToClose = NULL; + MmSectionObjectType->Create = MmpCreateSection; + + return(STATUS_SUCCESS); } /* FIXME: NtCS should call MmCS */ -NTSTATUS STDCALL -NtCreateSection (OUT PHANDLE SectionHandle, +NTSTATUS STDCALL +NtCreateSection (OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, IN ULONG SectionPageProtection OPTIONAL, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL) @@ -768,35 +775,23 @@ NtCreateSection (OUT PHANDLE SectionHandle, * REVISIONS * */ -NTSTATUS STDCALL +NTSTATUS STDCALL NtOpenSection(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes) { - PVOID Object; NTSTATUS Status; *SectionHandle = 0; - Status = ObReferenceObjectByName(ObjectAttributes->ObjectName, - ObjectAttributes->Attributes, - NULL, - DesiredAccess, - MmSectionObjectType, - UserMode, - NULL, - &Object); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = ObCreateHandle(PsGetCurrentProcess(), - Object, - DesiredAccess, - FALSE, - SectionHandle); - ObDereferenceObject(Object); + Status = ObOpenObjectByName(ObjectAttributes, + MmSectionObjectType, + NULL, + UserMode, + DesiredAccess, + NULL, + SectionHandle); + return(Status); } @@ -886,7 +881,7 @@ NtMapViewOfSection(HANDLE SectionHandle, NULL); if (!(NT_SUCCESS(Status))) { - DPRINT("ObReference failed rc=%x\n",Status); + DPRINT("ObReference failed rc=%x\n",Status); return(Status); } diff --git a/reactos/ntoskrnl/nt/evtpair.c b/reactos/ntoskrnl/nt/evtpair.c index 95d39a5cb73..9953b349715 100644 --- a/reactos/ntoskrnl/nt/evtpair.c +++ b/reactos/ntoskrnl/nt/evtpair.c @@ -1,4 +1,4 @@ -/* $Id: evtpair.c,v 1.5 2000/10/22 11:30:00 ekohl Exp $ +/* $Id: evtpair.c,v 1.6 2001/01/28 15:14:19 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,6 +24,11 @@ POBJECT_TYPE EXPORTED ExEventPairObjectType = NULL; +static GENERIC_MAPPING ExEventPairMapping = { + STANDARD_RIGHTS_READ, + STANDARD_RIGHTS_WRITE, + STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, + EVENT_PAIR_ALL_ACCESS}; /* FUNCTIONS *****************************************************************/ @@ -59,6 +64,7 @@ VOID NtInitializeEventPairImplementation(VOID) ExEventPairObjectType->TotalHandles = 0; ExEventPairObjectType->PagedPoolCharge = 0; ExEventPairObjectType->NonpagedPoolCharge = sizeof(KEVENT_PAIR); + ExEventPairObjectType->Mapping = &ExEventPairMapping; ExEventPairObjectType->Dump = NULL; ExEventPairObjectType->Open = NULL; ExEventPairObjectType->Close = NULL; @@ -99,31 +105,19 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes) { - PKEVENT_PAIR EventPair; NTSTATUS Status; DPRINT("NtOpenEventPair()\n"); - Status = ObReferenceObjectByName(ObjectAttributes->ObjectName, - ObjectAttributes->Attributes, - NULL, - DesiredAccess, - ExEventPairObjectType, - UserMode, - NULL, - (PVOID*)&EventPair); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - Status = ObCreateHandle(PsGetCurrentProcess(), - EventPair, - DesiredAccess, - FALSE, - EventPairHandle); - ObDereferenceObject(EventPair); + Status = ObOpenObjectByName(ObjectAttributes, + ExEventPairObjectType, + NULL, + UserMode, + DesiredAccess, + NULL, + EventPairHandle); - return(STATUS_SUCCESS); + return Status; } diff --git a/reactos/ntoskrnl/nt/ntevent.c b/reactos/ntoskrnl/nt/ntevent.c index 4274d233264..461f7e2e401 100644 --- a/reactos/ntoskrnl/nt/ntevent.c +++ b/reactos/ntoskrnl/nt/ntevent.c @@ -13,8 +13,8 @@ #include #include #include -#include #include +#include #define NDEBUG #include @@ -23,14 +23,21 @@ POBJECT_TYPE EXPORTED ExEventObjectType = NULL; +static GENERIC_MAPPING ExpEventMapping = { + STANDARD_RIGHTS_READ | SYNCHRONIZE | EVENT_QUERY_STATE, + STANDARD_RIGHTS_WRITE | SYNCHRONIZE | EVENT_MODIFY_STATE, + STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | EVENT_QUERY_STATE, + EVENT_ALL_ACCESS}; + + /* FUNCTIONS *****************************************************************/ -NTSTATUS NtpCreateEvent(PVOID ObjectBody, - PVOID Parent, - PWSTR RemainingPath, - POBJECT_ATTRIBUTES ObjectAttributes) +NTSTATUS +NtpCreateEvent(PVOID ObjectBody, + PVOID Parent, + PWSTR RemainingPath, + POBJECT_ATTRIBUTES ObjectAttributes) { - DPRINT("NtpCreateEvent(ObjectBody %x, Parent %x, RemainingPath %S)\n", ObjectBody, Parent, RemainingPath); @@ -46,7 +53,9 @@ NTSTATUS NtpCreateEvent(PVOID ObjectBody, return(STATUS_SUCCESS); } -VOID NtInitializeEventImplementation(VOID) + +VOID +NtInitializeEventImplementation(VOID) { ExEventObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); @@ -58,6 +67,7 @@ VOID NtInitializeEventImplementation(VOID) ExEventObjectType->TotalHandles = 0; ExEventObjectType->PagedPoolCharge = 0; ExEventObjectType->NonpagedPoolCharge = sizeof(KEVENT); + ExEventObjectType->Mapping = &ExpEventMapping; ExEventObjectType->Dump = NULL; ExEventObjectType->Open = NULL; ExEventObjectType->Close = NULL; @@ -69,7 +79,9 @@ VOID NtInitializeEventImplementation(VOID) ExEventObjectType->Create = NtpCreateEvent; } -NTSTATUS STDCALL NtClearEvent (IN HANDLE EventHandle) + +NTSTATUS STDCALL +NtClearEvent(IN HANDLE EventHandle) { PKEVENT Event; NTSTATUS Status; @@ -90,11 +102,12 @@ NTSTATUS STDCALL NtClearEvent (IN HANDLE EventHandle) } -NTSTATUS STDCALL NtCreateEvent (OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN ManualReset, - IN BOOLEAN InitialState) +NTSTATUS STDCALL +NtCreateEvent(OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN ManualReset, + IN BOOLEAN InitialState) { PKEVENT Event; @@ -103,8 +116,8 @@ NTSTATUS STDCALL NtCreateEvent (OUT PHANDLE EventHandle, DesiredAccess, ObjectAttributes, ExEventObjectType); - KeInitializeEvent(Event, - ManualReset ? NotificationEvent : SynchronizationEvent, + KeInitializeEvent(Event, + ManualReset ? NotificationEvent : SynchronizationEvent, InitialState ); ObDereferenceObject(Event); return(STATUS_SUCCESS); @@ -132,8 +145,9 @@ NtOpenEvent(OUT PHANDLE EventHandle, } -NTSTATUS STDCALL NtPulseEvent(IN HANDLE EventHandle, - IN PULONG PulseCount OPTIONAL) +NTSTATUS STDCALL +NtPulseEvent(IN HANDLE EventHandle, + IN PULONG PulseCount OPTIONAL) { PKEVENT Event; NTSTATUS Status; @@ -157,11 +171,12 @@ NTSTATUS STDCALL NtPulseEvent(IN HANDLE EventHandle, } -NTSTATUS STDCALL NtQueryEvent (IN HANDLE EventHandle, - IN EVENT_INFORMATION_CLASS EventInformationClass, - OUT PVOID EventInformation, - IN ULONG EventInformationLength, - OUT PULONG ReturnLength) +NTSTATUS STDCALL +NtQueryEvent(IN HANDLE EventHandle, + IN EVENT_INFORMATION_CLASS EventInformationClass, + OUT PVOID EventInformation, + IN ULONG EventInformationLength, + OUT PULONG ReturnLength) { PEVENT_BASIC_INFORMATION Info; PKEVENT Event; @@ -198,8 +213,9 @@ NTSTATUS STDCALL NtQueryEvent (IN HANDLE EventHandle, } -NTSTATUS STDCALL NtResetEvent(HANDLE EventHandle, - PULONG NumberOfWaitingThreads OPTIONAL) +NTSTATUS STDCALL +NtResetEvent(IN HANDLE EventHandle, + OUT PULONG NumberOfWaitingThreads OPTIONAL) { PKEVENT Event; NTSTATUS Status; @@ -222,8 +238,9 @@ NTSTATUS STDCALL NtResetEvent(HANDLE EventHandle, } -NTSTATUS STDCALL NtSetEvent(IN HANDLE EventHandle, - OUT PULONG NumberOfThreadsReleased) +NTSTATUS STDCALL +NtSetEvent(IN HANDLE EventHandle, + OUT PULONG NumberOfThreadsReleased) { PKEVENT Event; NTSTATUS Status; @@ -244,3 +261,5 @@ NTSTATUS STDCALL NtSetEvent(IN HANDLE EventHandle, ObDereferenceObject(Event); return(STATUS_SUCCESS); } + +/* EOF */ diff --git a/reactos/ntoskrnl/nt/ntsem.c b/reactos/ntoskrnl/nt/ntsem.c index e7a6845d9ab..620b141d4ba 100644 --- a/reactos/ntoskrnl/nt/ntsem.c +++ b/reactos/ntoskrnl/nt/ntsem.c @@ -1,4 +1,5 @@ -/* +/* $Id: ntsem.c,v 1.9 2001/01/28 15:15:07 ekohl Exp $ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/nt/ntsem.c @@ -22,6 +23,12 @@ POBJECT_TYPE ExSemaphoreType; +static GENERIC_MAPPING ExSemaphoreMapping = { + STANDARD_RIGHTS_READ | SEMAPHORE_QUERY_STATE, + STANDARD_RIGHTS_WRITE | SEMAPHORE_MODIFY_STATE, + STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | SEMAPHORE_QUERY_STATE, + SEMAPHORE_ALL_ACCESS}; + /* FUNCTIONS *****************************************************************/ NTSTATUS NtpCreateSemaphore(PVOID ObjectBody, @@ -57,6 +64,7 @@ VOID NtInitializeSemaphoreImplementation(VOID) ExSemaphoreType->TotalHandles = 0; ExSemaphoreType->PagedPoolCharge = 0; ExSemaphoreType->NonpagedPoolCharge = sizeof(KSEMAPHORE); + ExSemaphoreType->Mapping = &ExSemaphoreMapping; ExSemaphoreType->Dump = NULL; ExSemaphoreType->Open = NULL; ExSemaphoreType->Close = NULL; @@ -68,11 +76,12 @@ VOID NtInitializeSemaphoreImplementation(VOID) ExSemaphoreType->Create = NtpCreateSemaphore; } -NTSTATUS STDCALL NtCreateSemaphore(OUT PHANDLE SemaphoreHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN LONG InitialCount, - IN LONG MaximumCount) +NTSTATUS STDCALL +NtCreateSemaphore(OUT PHANDLE SemaphoreHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN LONG InitialCount, + IN LONG MaximumCount) { PKSEMAPHORE Semaphore; @@ -89,42 +98,31 @@ NTSTATUS STDCALL NtCreateSemaphore(OUT PHANDLE SemaphoreHandle, } -NTSTATUS STDCALL NtOpenSemaphore(IN HANDLE SemaphoreHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes) +NTSTATUS STDCALL +NtOpenSemaphore(IN HANDLE SemaphoreHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes) { NTSTATUS Status; - PKSEMAPHORE Semaphore; - Status = ObReferenceObjectByName(ObjectAttributes->ObjectName, - ObjectAttributes->Attributes, - NULL, - DesiredAccess, - ExSemaphoreType, - UserMode, - NULL, - (PVOID*)&Semaphore); - if (Status != STATUS_SUCCESS) - { - return(Status); - } + Status = ObOpenObjectByName(ObjectAttributes, + ExSemaphoreType, + NULL, + UserMode, + DesiredAccess, + NULL, + SemaphoreHandle); - Status = ObCreateHandle(PsGetCurrentProcess(), - Semaphore, - DesiredAccess, - FALSE, - SemaphoreHandle); - ObDereferenceObject(Semaphore); - - return(STATUS_SUCCESS); + return Status; } -NTSTATUS STDCALL NtQuerySemaphore(IN HANDLE SemaphoreHandle, - IN SEMAPHORE_INFORMATION_CLASS SemaphoreInformationClass, - OUT PVOID SemaphoreInformation, - IN ULONG SemaphoreInformationLength, - OUT PULONG ReturnLength) +NTSTATUS STDCALL +NtQuerySemaphore(IN HANDLE SemaphoreHandle, + IN SEMAPHORE_INFORMATION_CLASS SemaphoreInformationClass, + OUT PVOID SemaphoreInformation, + IN ULONG SemaphoreInformationLength, + OUT PULONG ReturnLength) { PSEMAPHORE_BASIC_INFORMATION Info; PKSEMAPHORE Semaphore; @@ -157,9 +155,10 @@ NTSTATUS STDCALL NtQuerySemaphore(IN HANDLE SemaphoreHandle, return STATUS_SUCCESS; } -NTSTATUS STDCALL NtReleaseSemaphore(IN HANDLE SemaphoreHandle, - IN LONG ReleaseCount, - OUT PLONG PreviousCount) +NTSTATUS STDCALL +NtReleaseSemaphore(IN HANDLE SemaphoreHandle, + IN LONG ReleaseCount, + OUT PLONG PreviousCount) { PKSEMAPHORE Semaphore; NTSTATUS Status; @@ -181,3 +180,5 @@ NTSTATUS STDCALL NtReleaseSemaphore(IN HANDLE SemaphoreHandle, ObDereferenceObject(Semaphore); return(STATUS_SUCCESS); } + +/* EOF */ diff --git a/reactos/ntoskrnl/nt/nttimer.c b/reactos/ntoskrnl/nt/nttimer.c index 90194ca3e4f..9dde8b747ae 100644 --- a/reactos/ntoskrnl/nt/nttimer.c +++ b/reactos/ntoskrnl/nt/nttimer.c @@ -14,6 +14,18 @@ #include + +/* GLOBALS ******************************************************************/ + +#if 0 +static GENERIC_MAPPING ExpTimerMapping = { + STANDARD_RIGHTS_READ | TIMER_QUERY_STATE, + STANDARD_RIGHTS_WRITE | TIMER_MODIFY_STATE, + STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, + TIMER_ALL_ACCESS}; +#endif + + /* FUNCTIONS *****************************************************************/ NTSTATUS