- Get rid of the intriguing idea that exported/public APIs should have prototypes...
authorAlex Ionescu <aionescu@gmail.com>
Thu, 25 May 2006 20:50:58 +0000 (20:50 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Thu, 25 May 2006 20:50:58 +0000 (20:50 +0000)
- Isolate ObFindObject into CmFindObject for the registry routines. Because of their well-known abuse of Ob, it's better to give them their internal routine so that when/if Ob ever gets fixed to parse properly, it won't force a re-write of Cm's object routines.

svn path=/trunk/; revision=22047

22 files changed:
reactos/include/ddk/winddk.h
reactos/ntoskrnl/cm/cm.h
reactos/ntoskrnl/cm/ntfunc.c
reactos/ntoskrnl/cm/registry.c
reactos/ntoskrnl/cm/regobj.c
reactos/ntoskrnl/ex/callback.c
reactos/ntoskrnl/ex/event.c
reactos/ntoskrnl/ex/evtpair.c
reactos/ntoskrnl/ex/mutant.c
reactos/ntoskrnl/ex/sem.c
reactos/ntoskrnl/ex/timer.c
reactos/ntoskrnl/io/file.c
reactos/ntoskrnl/io/iocomp.c
reactos/ntoskrnl/mm/section.c
reactos/ntoskrnl/ob/obdir.c
reactos/ntoskrnl/ob/obhandle.c
reactos/ntoskrnl/ob/symlink.c
reactos/ntoskrnl/ps/job.c
reactos/ntoskrnl/ps/process.c
reactos/ntoskrnl/ps/thread.c
reactos/subsystems/win32/win32k/ntuser/desktop.c
reactos/subsystems/win32/win32k/ntuser/winsta.c

index 2bdedea..93835a5 100644 (file)
@@ -9535,10 +9535,10 @@ DDKAPI
 ObOpenObjectByName(
   IN POBJECT_ATTRIBUTES  ObjectAttributes,
   IN POBJECT_TYPE  ObjectType,
-  IN OUT PVOID  ParseContext  OPTIONAL,
   IN KPROCESSOR_MODE  AccessMode,
-  IN ACCESS_MASK  DesiredAccess,
   IN PACCESS_STATE  PassedAccessState,
+  IN ACCESS_MASK  DesiredAccess,
+  IN OUT PVOID  ParseContext  OPTIONAL,
   OUT PHANDLE  Handle);
 
 NTOSAPI
index 56ccd06..54120aa 100644 (file)
@@ -708,4 +708,15 @@ NTSTATUS
 CmiSaveTempHive (PREGISTRY_HIVE Hive,
                 HANDLE FileHandle);
 
+NTSTATUS
+NTAPI
+CmFindObject(
+    POBJECT_CREATE_INFORMATION ObjectCreateInfo,
+    PUNICODE_STRING ObjectName,
+    PVOID* ReturnedObject,
+    PUNICODE_STRING RemainingPath,
+    POBJECT_TYPE ObjectType,
+    IN PACCESS_STATE AccessState,
+    IN PVOID ParseContext
+);
 #endif /*__INCLUDE_CM_H*/
index f675a94..149e53b 100644 (file)
@@ -199,7 +199,6 @@ NtCreateKey(OUT PHANDLE KeyHandle,
   KPROCESSOR_MODE PreviousMode;
   UNICODE_STRING CapturedClass = {0};
   HANDLE hKey;
-  OBP_LOOKUP_CONTEXT Context;
 
   PAGED_CODE();
 
@@ -259,12 +258,11 @@ NtCreateKey(OUT PHANDLE KeyHandle,
       goto Cleanup;
     }
     
-  Status = ObFindObject(&ObjectCreateInfo,
+  Status = CmFindObject(&ObjectCreateInfo,
                         &ObjectName,
                         (PVOID*)&Object,
                         &RemainingPath,
                         CmiKeyType,
-                        &Context,
                         NULL,
                         NULL);
   if (!NT_SUCCESS(Status))
@@ -1266,7 +1264,6 @@ NtOpenKey(OUT PHANDLE KeyHandle,
   OBJECT_CREATE_INFORMATION ObjectCreateInfo;
   REG_PRE_OPEN_KEY_INFORMATION PreOpenKeyInfo;
   REG_POST_OPEN_KEY_INFORMATION PostOpenKeyInfo;
-  OBP_LOOKUP_CONTEXT Context;
 
   PAGED_CODE();
 
@@ -1330,12 +1327,11 @@ NtOpenKey(OUT PHANDLE KeyHandle,
 
   RemainingPath.Buffer = NULL;
 
-  Status = ObFindObject(&ObjectCreateInfo,
+  Status = CmFindObject(&ObjectCreateInfo,
                         &ObjectName,
                        (PVOID*)&Object,
                         &RemainingPath,
                         CmiKeyType,
-                        &Context,
                         NULL,
                         NULL);
   if (!NT_SUCCESS(Status))
index f6ab4fd..fd85543 100644 (file)
@@ -704,7 +704,6 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
   PWSTR SubName;
   UNICODE_STRING ObjectName;
   OBJECT_CREATE_INFORMATION ObjectCreateInfo;
-  OBP_LOOKUP_CONTEXT Context;
 
   DPRINT("CmiConnectHive(%p, %p) called.\n",
         KeyObjectAttributes, RegistryHive);
@@ -722,12 +721,11 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
        return Status;
      }
 
-  Status = ObFindObject(&ObjectCreateInfo,
+  Status = CmFindObject(&ObjectCreateInfo,
                         &ObjectName,
                                    (PVOID*)&ParentKey,
                         &RemainingPath,
                         CmiKeyType,
-                        &Context,
                         NULL,
                         NULL);
      ObpReleaseCapturedAttributes(&ObjectCreateInfo);
@@ -857,8 +855,8 @@ CmiDisconnectHive (IN POBJECT_ATTRIBUTES KeyObjectAttributes,
 
   Status = ObOpenObjectByName (KeyObjectAttributes,
                               CmiKeyType,
-                              NULL,
                               KernelMode,
+                              NULL,
                               STANDARD_RIGHTS_REQUIRED,
                               NULL,
                               &KeyHandle);
index b6ba47c..bbc2cdc 100644 (file)
@@ -23,7 +23,202 @@ CmiGetLinkTarget(PREGISTRY_HIVE RegistryHive,
                 PUNICODE_STRING TargetPath);
 
 /* FUNCTONS *****************************************************************/
+NTSTATUS
+NTAPI
+CmFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
+             PUNICODE_STRING ObjectName,
+             PVOID* ReturnedObject,
+             PUNICODE_STRING RemainingPath,
+             POBJECT_TYPE ObjectType,
+             IN PACCESS_STATE AccessState,
+             IN PVOID ParseContext)
+{
+    PVOID NextObject;
+    PVOID CurrentObject;
+    PVOID RootObject;
+    POBJECT_HEADER CurrentHeader;
+    NTSTATUS Status;
+    PWSTR current;
+    UNICODE_STRING PathString;
+    ULONG Attributes;
+    UNICODE_STRING CurrentUs;
+    OBP_LOOKUP_CONTEXT Context;
+
+    PAGED_CODE();
+
+    DPRINT("CmindObject(ObjectCreateInfo %x, ReturnedObject %x, "
+        "RemainingPath %x)\n",ObjectCreateInfo,ReturnedObject,RemainingPath);
+
+    RtlInitUnicodeString (RemainingPath, NULL);
+
+    if (ObjectCreateInfo->RootDirectory == NULL)
+    {
+        ObReferenceObjectByPointer(NameSpaceRoot,
+            DIRECTORY_TRAVERSE,
+            NULL,
+            ObjectCreateInfo->ProbeMode);
+        CurrentObject = NameSpaceRoot;
+    }
+    else
+    {
+        Status = ObReferenceObjectByHandle(ObjectCreateInfo->RootDirectory,
+            0,
+            NULL,
+            ObjectCreateInfo->ProbeMode,
+            &CurrentObject,
+            NULL);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
+    }
+
+    if (ObjectName->Length == 0 ||
+        ObjectName->Buffer[0] == UNICODE_NULL)
+    {
+        *ReturnedObject = CurrentObject;
+        return STATUS_SUCCESS;
+    }
 
+    if (ObjectCreateInfo->RootDirectory == NULL &&
+        ObjectName->Buffer[0] != L'\\')
+    {
+        ObDereferenceObject (CurrentObject);
+        DPRINT1("failed\n");
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    /* Create a zero-terminated copy of the object name */
+    PathString.Length = ObjectName->Length;
+    PathString.MaximumLength = ObjectName->Length + sizeof(WCHAR);
+    PathString.Buffer = ExAllocatePool (NonPagedPool,
+        PathString.MaximumLength);
+    if (PathString.Buffer == NULL)
+    {
+        ObDereferenceObject (CurrentObject);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    RtlCopyMemory (PathString.Buffer,
+        ObjectName->Buffer,
+        ObjectName->Length);
+    PathString.Buffer[PathString.Length / sizeof(WCHAR)] = UNICODE_NULL;
+
+    current = PathString.Buffer;
+
+    RootObject = CurrentObject;
+    Attributes = ObjectCreateInfo->Attributes;
+    if (ObjectType == ObSymbolicLinkType)
+        Attributes |= OBJ_OPENLINK;
+
+    while (TRUE)
+    {
+        CurrentHeader = OBJECT_TO_OBJECT_HEADER(CurrentObject);
+
+        /* Loop as long as we're dealing with a directory */
+        while (CurrentHeader->Type == ObDirectoryType)
+        {
+            PWSTR Start, End;
+            PVOID FoundObject;
+            UNICODE_STRING StartUs;
+            NextObject = NULL;
+
+            if (!current) goto Next;
+
+            Start = current;
+            if (*Start == L'\\') Start++;
+
+            End = wcschr(Start, L'\\');
+            if (End != NULL) *End = 0;
+
+            RtlInitUnicodeString(&StartUs, Start);
+            Context.DirectoryLocked = TRUE;
+            Context.Directory = CurrentObject;
+            FoundObject = ObpLookupEntryDirectory(CurrentObject, &StartUs, Attributes, FALSE, &Context);
+            if (FoundObject == NULL)
+            {
+                if (End != NULL)
+                {
+                    *End = L'\\';
+                }
+                 goto Next;
+            }
+
+            ObReferenceObjectByPointer(FoundObject,
+                STANDARD_RIGHTS_REQUIRED,
+                NULL,
+                UserMode);
+            if (End != NULL)
+            {
+                *End = L'\\';
+                current = End;
+            }
+            else
+            {
+                current = NULL;
+            }
+
+            NextObject = FoundObject;
+
+Next:
+            if (NextObject == NULL)
+            {
+                break;
+            }
+            ObDereferenceObject(CurrentObject);
+            CurrentObject = NextObject;
+            CurrentHeader = OBJECT_TO_OBJECT_HEADER(CurrentObject);
+        }
+
+        if (CurrentHeader->Type->TypeInfo.ParseProcedure == NULL)
+        {
+            DPRINT("Current object can't parse\n");
+            break;
+        }
+
+        RtlInitUnicodeString(&CurrentUs, current);
+        Status = CurrentHeader->Type->TypeInfo.ParseProcedure(CurrentObject,
+            CurrentHeader->Type,
+            AccessState,
+            ExGetPreviousMode(), // fixme: should be a parameter, since caller decides.
+            Attributes,
+            &PathString,
+            &CurrentUs,
+            ParseContext,
+            NULL, // fixme: where do we get this from? captured OBP?
+            &NextObject);
+        current = CurrentUs.Buffer;
+        if (Status == STATUS_REPARSE)
+        {
+            /* reparse the object path */
+            NextObject = NameSpaceRoot;
+            current = PathString.Buffer;
+
+            ObReferenceObjectByPointer(NextObject,
+                DIRECTORY_TRAVERSE,
+                NULL,
+                ObjectCreateInfo->ProbeMode);
+        }
+
+
+        if (NextObject == NULL)
+        {
+            break;
+        }
+        ObDereferenceObject(CurrentObject);
+        CurrentObject = NextObject;
+    }
+
+    if (current)
+    {
+        RtlpCreateUnicodeString (RemainingPath, current, NonPagedPool);
+    }
+
+    RtlFreeUnicodeString (&PathString);
+    *ReturnedObject = CurrentObject;
+
+    return STATUS_SUCCESS;
+}
 
 NTSTATUS STDCALL
 CmiObjectParse(IN PVOID ParsedObject,
index a2df1a5..caf8743 100644 (file)
@@ -205,8 +205,8 @@ ExCreateCallback(
    {
       Status = ObOpenObjectByName(ObjectAttributes,
                                   ExCallbackObjectType,
-                                  NULL,
                                   KernelMode,
+                                  NULL,
                                   0,
                                   NULL,
                                   &Handle);
index 143df16..a233112 100644 (file)
@@ -212,8 +212,8 @@ NtOpenEvent(OUT PHANDLE EventHandle,
     /* Open the Object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ExEventObjectType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hEvent);
index 2378610..7d066be 100644 (file)
@@ -164,8 +164,8 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
     /* Open the Object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ExEventPairObjectType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hEventPair);
index a74e762..7e42078 100644 (file)
@@ -194,8 +194,8 @@ NtOpenMutant(OUT PHANDLE MutantHandle,
     /* Open the Object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ExMutantObjectType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hMutant);
index 11dcc29..fc441b9 100644 (file)
@@ -188,8 +188,8 @@ NtOpenSemaphore(OUT PHANDLE SemaphoreHandle,
     /* Open the Object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ExSemaphoreObjectType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hSemaphore);
index d8ba7e0..e3047a3 100644 (file)
@@ -508,8 +508,8 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
     /* Open the Timer */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ExTimerType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hTimer);
index 9943de5..7c384c8 100644 (file)
@@ -930,9 +930,9 @@ IoCreateFile(OUT PHANDLE  FileHandle,
 
    /* First try to open an existing named object */
    Status = ObOpenObjectByName(ObjectAttributes,
-                               NULL,
                                NULL,
                                AccessMode,
+                               NULL,
                                DesiredAccess,
                                NULL,
                                &LocalHandle);
index 946dfb4..d61a6d9 100644 (file)
@@ -322,8 +322,8 @@ NtOpenIoCompletion(OUT PHANDLE IoCompletionHandle,
     /* Open the Object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 IoCompletionType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hIoCompletionHandle);
index e9ae6ac..ba98ca4 100644 (file)
@@ -3463,8 +3463,8 @@ NtOpenSection(PHANDLE   SectionHandle,
 
    Status = ObOpenObjectByName(ObjectAttributes,
                                MmSectionObjectType,
-                               NULL,
                                PreviousMode,
+                               NULL,
                                DesiredAccess,
                                NULL,
                                &hSection);
index e8c5272..0612874 100644 (file)
@@ -334,8 +334,8 @@ NtOpenDirectoryObject (OUT PHANDLE DirectoryHandle,
     /* Open the directory object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ObDirectoryType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hDirectory);
index 9b0f554..a8d7415 100644 (file)
@@ -748,10 +748,10 @@ NTSTATUS
 NTAPI
 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,
+                   IN ACCESS_MASK DesiredAccess,
+                   IN OUT PVOID ParseContext,
                    OUT PHANDLE Handle)
 {
     UNICODE_STRING RemainingPath;
index b57b830..ec145b4 100644 (file)
@@ -403,8 +403,8 @@ NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
     /* Open the object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ObSymbolicLinkType,
-                                NULL,
                                 PreviousMode,
+                                NULL,
                                 DesiredAccess,
                                 NULL,
                                 &hLink);
index 0568633..2b3f9e9 100644 (file)
@@ -413,8 +413,8 @@ NtOpenJobObject (
     {
         Status = ObOpenObjectByName(ObjectAttributes,
             PsJobType,
-            NULL,
             PreviousMode,
+            NULL,
             DesiredAccess,
             NULL,
             &hJob);
index d8b42bd..17abd55 100644 (file)
@@ -1004,8 +1004,8 @@ NtOpenProcess(OUT PHANDLE ProcessHandle,
         DPRINT("Opening by name\n");
         Status = ObOpenObjectByName(ObjectAttributes,
                                     PsProcessType,
-                                    NULL,
                                     PreviousMode,
+                                    NULL,
                                     DesiredAccess,
                                     NULL,
                                     &hProcess);
index edc77b8..c96bb95 100644 (file)
@@ -720,8 +720,8 @@ NtOpenThread(OUT PHANDLE ThreadHandle,
         /* Open it */
         Status = ObOpenObjectByName(ObjectAttributes,
                                     PsThreadType,
-                                    NULL,
                                     PreviousMode,
+                                    NULL,
                                     DesiredAccess,
                                     NULL,
                                     &hThread);
index 51e3e08..a0dc58b 100644 (file)
@@ -345,8 +345,8 @@ IntParseDesktopPath(PEPROCESS Process,
 
       Status = ObOpenObjectByName(&ObjectAttributes,
                                   ExWindowStationObjectType,
-                                  NULL,
                                   KernelMode,
+                                  NULL,
                                   0,
                                   NULL,
                                   (HANDLE*)hWinSta);
@@ -379,8 +379,8 @@ IntParseDesktopPath(PEPROCESS Process,
 
       Status = ObOpenObjectByName(&ObjectAttributes,
                                   ExDesktopObjectType,
-                                  NULL,
                                   KernelMode,
+                                  NULL,
                                   0,
                                   NULL,
                                   (HANDLE*)hDesktop);
@@ -926,10 +926,10 @@ NtUserCreateDesktop(
    Status = ObOpenObjectByName(
                &ObjectAttributes,
                ExDesktopObjectType,
-               (PVOID)&DummyContext,
                KernelMode,
-               dwDesiredAccess,
                NULL,
+               dwDesiredAccess,
+               (PVOID)&DummyContext,
                (HANDLE*)&Desktop);
    if (!NT_SUCCESS(Status)) RETURN(NULL);
    if (Status == STATUS_OBJECT_NAME_EXISTS)
@@ -1129,8 +1129,8 @@ NtUserOpenDesktop(
    Status = ObOpenObjectByName(
                &ObjectAttributes,
                ExDesktopObjectType,
-               NULL,
                KernelMode,
+               NULL,
                dwDesiredAccess,
                NULL,
                (HANDLE*)&Desktop);
index d0ca93e..b2cbe13 100644 (file)
@@ -444,8 +444,8 @@ NtUserCreateWindowStation(
    Status = ObOpenObjectByName(
                &ObjectAttributes,
                ExWindowStationObjectType,
-               NULL,
                KernelMode,
+               NULL,
                dwDesiredAccess,
                NULL,
                (PVOID*)&WindowStation);
@@ -603,8 +603,8 @@ NtUserOpenWindowStation(
    Status = ObOpenObjectByName(
                &ObjectAttributes,
                ExWindowStationObjectType,
-               NULL,
                UserMode,
+               NULL,
                dwDesiredAccess,
                NULL,
                (PVOID*)&WindowStation);