-/* $Id: namespc.c,v 1.28 2002/02/19 00:09:24 ekohl Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ob/namespc.c
* PURPOSE: Manages the system namespace
- * PROGRAMMER: David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- * 22/05/98: Created
+ *
+ * PROGRAMMERS: David Welch (welch@mcmail.com)
*/
/* INCLUDES ***************************************************************/
-#include <limits.h>
-#include <ddk/ntddk.h>
-#include <internal/ob.h>
-#include <internal/io.h>
-#include <internal/pool.h>
-
+#include <ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
+
/* GLOBALS ****************************************************************/
POBJECT_TYPE ObDirectoryType = NULL;
+POBJECT_TYPE ObTypeObjectType = NULL;
PDIRECTORY_OBJECT NameSpaceRoot = NULL;
+ /* FIXME: Move this somewhere else once devicemap support is in */
+PDEVICE_MAP ObSystemDeviceMap = NULL;
static GENERIC_MAPPING ObpDirectoryMapping = {
STANDARD_RIGHTS_READ|DIRECTORY_QUERY|DIRECTORY_TRAVERSE,
STANDARD_RIGHTS_EXECUTE|DIRECTORY_QUERY|DIRECTORY_TRAVERSE,
DIRECTORY_ALL_ACCESS};
+static GENERIC_MAPPING ObpTypeMapping = {
+ STANDARD_RIGHTS_READ,
+ STANDARD_RIGHTS_WRITE,
+ STANDARD_RIGHTS_EXECUTE,
+ 0x000F0001};
+
/* FUNCTIONS **************************************************************/
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
ObReferenceObjectByName(PUNICODE_STRING ObjectPath,
ULONG Attributes,
UNICODE_STRING RemainingPath;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
+
+ PAGED_CODE();
InitializeObjectAttributes(&ObjectAttributes,
ObjectPath,
- Attributes,
+ Attributes | OBJ_OPENIF,
NULL,
NULL);
Status = ObFindObject(&ObjectAttributes,
DPRINT("Object %p\n", Object);
*ObjectPtr = NULL;
RtlFreeUnicodeString (&RemainingPath);
- return(STATUS_UNSUCCESSFUL);
+ return(STATUS_OBJECT_NAME_NOT_FOUND);
}
*ObjectPtr = Object;
RtlFreeUnicodeString (&RemainingPath);
*
* RETURN VALUE
* Status.
+ *
+ * @implemented
*/
NTSTATUS STDCALL
-ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
- POBJECT_TYPE ObjectType,
- PVOID ParseContext,
- KPROCESSOR_MODE AccessMode,
- ACCESS_MASK DesiredAccess,
- PACCESS_STATE PassedAccessState,
- PHANDLE Handle)
+ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN POBJECT_TYPE ObjectType,
+ IN OUT PVOID ParseContext,
+ IN KPROCESSOR_MODE AccessMode,
+ IN ACCESS_MASK DesiredAccess,
+ IN PACCESS_STATE PassedAccessState,
+ OUT PHANDLE Handle)
{
UNICODE_STRING RemainingPath;
PVOID Object = NULL;
NTSTATUS Status;
+
+ PAGED_CODE();
- DPRINT("ObOpenObjectByName()\n");
+ DPRINT("ObOpenObjectByName(...)\n");
Status = ObFindObject(ObjectAttributes,
&Object,
ObjectType);
if (!NT_SUCCESS(Status))
{
+ DPRINT("ObFindObject() failed (Status %lx)\n", Status);
return Status;
}
return Status;
}
-
+VOID
+STDCALL
+ObQueryDeviceMapInformation(PEPROCESS Process,
+ PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo)
+{
+ //KIRQL OldIrql ;
+
+ /*
+ * FIXME: This is an ugly hack for now, to always return the System Device Map
+ * instead of returning the Process Device Map. Not important yet since we don't use it
+ */
+
+ /* FIXME: Acquire the DeviceMap Spinlock */
+ // KeAcquireSpinLock(DeviceMap->Lock, &OldIrql);
+
+ /* Make a copy */
+ DeviceMapInfo->Query.DriveMap = ObSystemDeviceMap->DriveMap;
+ RtlMoveMemory(DeviceMapInfo->Query.DriveType, ObSystemDeviceMap->DriveType, sizeof(ObSystemDeviceMap->DriveType));
+
+ /* FIXME: Release the DeviceMap Spinlock */
+ // KeReleasepinLock(DeviceMap->Lock, OldIrql);
+}
+
VOID
ObpAddEntryDirectory(PDIRECTORY_OBJECT Parent,
POBJECT_HEADER Header,
{
KIRQL oldlvl;
- RtlCreateUnicodeString(&Header->Name, Name);
+ RtlpCreateUnicodeString(&Header->Name, Name, NonPagedPool);
Header->Parent = Parent;
KeAcquireSpinLock(&Parent->Lock, &oldlvl);
KeReleaseSpinLock(&Parent->Lock, oldlvl);
}
+
VOID
ObpRemoveEntryDirectory(POBJECT_HEADER Header)
/*
KeReleaseSpinLock(&(Header->Parent->Lock),oldlvl);
}
+
PVOID
ObpFindEntryDirectory(PDIRECTORY_OBJECT DirectoryObject,
PWSTR Name,
while (current!=(&(DirectoryObject->head)))
{
current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,Entry);
- DPRINT("Scanning %S %S\n",current_obj->Name.Buffer, Name);
+ DPRINT(" Scanning: %S for: %S\n",current_obj->Name.Buffer, Name);
if (Attributes & OBJ_CASE_INSENSITIVE)
{
if (_wcsicmp(current_obj->Name.Buffer, Name)==0)
}
current = current->Flink;
}
- DPRINT("%s() = NULL\n",__FUNCTION__);
+ DPRINT(" Not Found: %s() = NULL\n",__FUNCTION__);
return(NULL);
}
+
NTSTATUS STDCALL
ObpParseDirectory(PVOID Object,
PVOID * NextObject,
PUNICODE_STRING FullPath,
PWSTR * Path,
- POBJECT_TYPE ObjectType,
ULONG Attributes)
{
- PWSTR end;
- PVOID FoundObject;
-
- DPRINT("ObpParseDirectory(Object %x, Path %x, *Path %S)\n",
- Object,Path,*Path);
-
- *NextObject = NULL;
-
- if ((*Path) == NULL)
- {
- return STATUS_UNSUCCESSFUL;
- }
-
- end = wcschr((*Path)+1, '\\');
- if (end != NULL)
- {
- *end = 0;
- }
-
- FoundObject = ObpFindEntryDirectory(Object, (*Path)+1, Attributes);
-
- if (FoundObject == NULL)
- {
- if (end != NULL)
- {
- *end = '\\';
- }
- return STATUS_UNSUCCESSFUL;
- }
-
- ObReferenceObjectByPointer(FoundObject,
- STANDARD_RIGHTS_REQUIRED,
- NULL,
- UserMode);
-
- if (end != NULL)
- {
- *end = '\\';
- *Path = end;
- }
- else
- {
- *Path = NULL;
- }
-
- *NextObject = FoundObject;
-
- return STATUS_SUCCESS;
+ PWSTR Start;
+ PWSTR End;
+ PVOID FoundObject;
+
+ DPRINT("ObpParseDirectory(Object %x, Path %x, *Path %S)\n",
+ Object,Path,*Path);
+
+ *NextObject = NULL;
+
+ if ((*Path) == NULL)
+ {
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ Start = *Path;
+ if (*Start == L'\\')
+ Start++;
+
+ End = wcschr(Start, L'\\');
+ if (End != NULL)
+ {
+ *End = 0;
+ }
+
+ FoundObject = ObpFindEntryDirectory(Object, Start, Attributes);
+ if (FoundObject == NULL)
+ {
+ if (End != NULL)
+ {
+ *End = L'\\';
+ }
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ ObReferenceObjectByPointer(FoundObject,
+ STANDARD_RIGHTS_REQUIRED,
+ NULL,
+ UserMode);
+
+ if (End != NULL)
+ {
+ *End = L'\\';
+ *Path = End;
+ }
+ else
+ {
+ *Path = NULL;
+ }
+
+ *NextObject = FoundObject;
+
+ return STATUS_SUCCESS;
}
+
NTSTATUS STDCALL
ObpCreateDirectory(PVOID ObjectBody,
PVOID Parent,
return(STATUS_SUCCESS);
}
-VOID ObInit(VOID)
+
+VOID INIT_FUNCTION
+ObInit(VOID)
/*
* FUNCTION: Initialize the object manager namespace
*/
{
- ObDirectoryType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
-
- ObDirectoryType->Tag = TAG('D', 'I', 'R', 'T');
- ObDirectoryType->TotalObjects = 0;
- ObDirectoryType->TotalHandles = 0;
- ObDirectoryType->MaxObjects = ULONG_MAX;
- ObDirectoryType->MaxHandles = ULONG_MAX;
- ObDirectoryType->PagedPoolCharge = 0;
- ObDirectoryType->NonpagedPoolCharge = sizeof(DIRECTORY_OBJECT);
- ObDirectoryType->Mapping = &ObpDirectoryMapping;
- ObDirectoryType->Dump = NULL;
- ObDirectoryType->Open = NULL;
- ObDirectoryType->Close = NULL;
- ObDirectoryType->Delete = NULL;
- ObDirectoryType->Parse = ObpParseDirectory;
- ObDirectoryType->Security = NULL;
- ObDirectoryType->QueryName = NULL;
- ObDirectoryType->OkayToClose = NULL;
- ObDirectoryType->Create = ObpCreateDirectory;
- ObDirectoryType->DuplicationNotify = NULL;
-
- RtlInitUnicodeString(&ObDirectoryType->TypeName,
- L"Directory");
-
- ObCreateObject(NULL,
- STANDARD_RIGHTS_REQUIRED,
- NULL,
- ObDirectoryType,
- (PVOID*)&NameSpaceRoot);
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING Name;
+ SECURITY_DESCRIPTOR SecurityDescriptor;
+
+ /* Initialize the security descriptor cache */
+ ObpInitSdCache();
+
+ /* create 'directory' object type */
+ ObDirectoryType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
+
+ ObDirectoryType->Tag = TAG('D', 'I', 'R', 'T');
+ ObDirectoryType->TotalObjects = 0;
+ ObDirectoryType->TotalHandles = 0;
+ ObDirectoryType->PeakObjects = 0;
+ ObDirectoryType->PeakHandles = 0;
+ ObDirectoryType->PagedPoolCharge = 0;
+ ObDirectoryType->NonpagedPoolCharge = sizeof(DIRECTORY_OBJECT);
+ ObDirectoryType->Mapping = &ObpDirectoryMapping;
+ ObDirectoryType->Dump = NULL;
+ ObDirectoryType->Open = NULL;
+ ObDirectoryType->Close = NULL;
+ ObDirectoryType->Delete = NULL;
+ ObDirectoryType->Parse = ObpParseDirectory;
+ ObDirectoryType->Security = NULL;
+ ObDirectoryType->QueryName = NULL;
+ ObDirectoryType->OkayToClose = NULL;
+ ObDirectoryType->Create = ObpCreateDirectory;
+ ObDirectoryType->DuplicationNotify = NULL;
+
+ RtlInitUnicodeString(&ObDirectoryType->TypeName,
+ L"Directory");
+
+ /* create 'type' object type*/
+ ObTypeObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
+
+ ObTypeObjectType->Tag = TAG('T', 'y', 'p', 'T');
+ ObTypeObjectType->TotalObjects = 0;
+ ObTypeObjectType->TotalHandles = 0;
+ ObTypeObjectType->PeakObjects = 0;
+ ObTypeObjectType->PeakHandles = 0;
+ ObTypeObjectType->PagedPoolCharge = 0;
+ ObTypeObjectType->NonpagedPoolCharge = sizeof(TYPE_OBJECT);
+ ObTypeObjectType->Mapping = &ObpTypeMapping;
+ ObTypeObjectType->Dump = NULL;
+ ObTypeObjectType->Open = NULL;
+ ObTypeObjectType->Close = NULL;
+ ObTypeObjectType->Delete = NULL;
+ ObTypeObjectType->Parse = NULL;
+ ObTypeObjectType->Security = NULL;
+ ObTypeObjectType->QueryName = NULL;
+ ObTypeObjectType->OkayToClose = NULL;
+ ObTypeObjectType->Create = NULL;
+ ObTypeObjectType->DuplicationNotify = NULL;
+
+ RtlInitUnicodeString(&ObTypeObjectType->TypeName,
+ L"ObjectType");
+
+ /* Create security descriptor */
+ RtlCreateSecurityDescriptor(&SecurityDescriptor,
+ SECURITY_DESCRIPTOR_REVISION1);
+
+ RtlSetOwnerSecurityDescriptor(&SecurityDescriptor,
+ SeAliasAdminsSid,
+ FALSE);
+
+ RtlSetGroupSecurityDescriptor(&SecurityDescriptor,
+ SeLocalSystemSid,
+ FALSE);
+
+ RtlSetDaclSecurityDescriptor(&SecurityDescriptor,
+ TRUE,
+ SePublicDefaultDacl,
+ FALSE);
+
+ /* Create root directory */
+ InitializeObjectAttributes(&ObjectAttributes,
+ NULL,
+ OBJ_PERMANENT,
+ NULL,
+ &SecurityDescriptor);
+ ObCreateObject(KernelMode,
+ ObDirectoryType,
+ &ObjectAttributes,
+ KernelMode,
+ NULL,
+ sizeof(DIRECTORY_OBJECT),
+ 0,
+ 0,
+ (PVOID*)&NameSpaceRoot);
+
+ /* Create '\ObjectTypes' directory */
+ RtlRosInitUnicodeStringFromLiteral(&Name,
+ L"\\ObjectTypes");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &Name,
+ OBJ_PERMANENT,
+ NULL,
+ &SecurityDescriptor);
+ ObCreateObject(KernelMode,
+ ObDirectoryType,
+ &ObjectAttributes,
+ KernelMode,
+ NULL,
+ sizeof(DIRECTORY_OBJECT),
+ 0,
+ 0,
+ NULL);
+
+ ObpCreateTypeObject(ObDirectoryType);
+ ObpCreateTypeObject(ObTypeObjectType);
+
+ /* Create 'symbolic link' object type */
+ ObInitSymbolicLinkImplementation();
+
+ /* FIXME: Hack Hack! */
+ ObSystemDeviceMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(*ObSystemDeviceMap), TAG('O', 'b', 'D', 'm'));
+ RtlZeroMemory(ObSystemDeviceMap, sizeof(*ObSystemDeviceMap));
+}
+
+
+NTSTATUS
+ObpCreateTypeObject(POBJECT_TYPE ObjectType)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ WCHAR NameString[120];
+ PTYPE_OBJECT TypeObject = NULL;
+ UNICODE_STRING Name;
+ NTSTATUS Status;
+
+ DPRINT("ObpCreateTypeObject(ObjectType: %wZ)\n", &ObjectType->TypeName);
+ wcscpy(NameString, L"\\ObjectTypes\\");
+ wcscat(NameString, ObjectType->TypeName.Buffer);
+ RtlInitUnicodeString(&Name,
+ NameString);
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &Name,
+ OBJ_PERMANENT,
+ NULL,
+ NULL);
+ Status = ObCreateObject(KernelMode,
+ ObTypeObjectType,
+ &ObjectAttributes,
+ KernelMode,
+ NULL,
+ sizeof(TYPE_OBJECT),
+ 0,
+ 0,
+ (PVOID*)&TypeObject);
+ if (NT_SUCCESS(Status))
+ {
+ TypeObject->ObjectType = ObjectType;
+ }
+
+ return(STATUS_SUCCESS);
}
/* EOF */