Added mapping of access rights

Improved 'open' function

svn path=/trunk/; revision=1578
This commit is contained in:
Eric Kohl 2001-01-28 15:17:52 +00:00
parent 9331d6391e
commit 6c726dfe40
6 changed files with 162 additions and 139 deletions

View file

@ -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 <welch@cwcom.net>
@ -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 */

View file

@ -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);
}

View file

@ -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;
}

View file

@ -13,8 +13,8 @@
#include <limits.h>
#include <ddk/ntddk.h>
#include <internal/ob.h>
#include <ntos/synch.h>
#include <internal/id.h>
#include <ntos/synch.h>
#define NDEBUG
#include <internal/debug.h>
@ -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 */

View file

@ -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 */

View file

@ -14,6 +14,18 @@
#include <internal/debug.h>
/* 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