[NTOSKRNL]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Fri, 23 Aug 2013 21:18:46 +0000 (21:18 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Fri, 23 Aug 2013 21:18:46 +0000 (21:18 +0000)
We aim at being compatible with Windows Server 2003... Do it better! Use the \GLOBAL?? dos-devices object directory instead of \??, as used in Windows NT and 2000 (which becomes per-session in Windows >= XP), but add a temporary hack (i.e. create a symbolic link \?? <---> \GLOBAL??) since we don't support yet Ob device mappings which are needed for this mapping, in particular.
As a side-effect, fix starting of DeviceTree v2.30 on ReactOS. Now it works correctly, as on Win2k3 :)

CORE-6572 #resolve #comment Finally fix loading of the objinfo driver, which failed at creating a symbolic link in \GLOBAL??\ for its device.

svn path=/trunk/; revision=59803

reactos/ntoskrnl/ob/obname.c

index 38e0574..0744da0 100644 (file)
@@ -37,25 +37,48 @@ INIT_FUNCTION
 ObpCreateDosDevicesDirectory(VOID)
 {
     OBJECT_ATTRIBUTES ObjectAttributes;
-    UNICODE_STRING Name, LinkName;
+    UNICODE_STRING RootName, TargetName, LinkName;
     HANDLE Handle, SymHandle;
     NTSTATUS Status;
 
-    /* Create the '\??' directory */
-    RtlInitUnicodeString(&Name, L"\\??");
+    /* Create the global DosDevices directory \?? */
+    RtlInitUnicodeString(&RootName, L"\\GLOBAL??");
     InitializeObjectAttributes(&ObjectAttributes,
-                               &Name,
+                               &RootName,
                                OBJ_PERMANENT,
                                NULL,
                                NULL);
     Status = NtCreateDirectoryObject(&Handle,
                                      DIRECTORY_ALL_ACCESS,
                                      &ObjectAttributes);
-    if (!NT_SUCCESS(Status)) return FALSE;
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /*********************************************\
+    |*** HACK until we support device mappings ***|
+    |*** Add a symlink \??\ <--> \GLOBAL??\    ***|
+    \*********************************************/
+    RtlInitUnicodeString(&LinkName, L"\\??");
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &LinkName,
+                               OBJ_PERMANENT,
+                               NULL,
+                               NULL);
+    Status = NtCreateSymbolicLinkObject(&SymHandle,
+                                        SYMBOLIC_LINK_ALL_ACCESS,
+                                        &ObjectAttributes,
+                                        &RootName);
+    if (NT_SUCCESS(Status)) NtClose(SymHandle);
+    /*********************************************\
+    \*********************************************/
+
+    // FIXME: Create a device mapping for the global \?? directory
 
-    /* Initialize the GLOBALROOT path */
+    /*
+     * Initialize the \??\GLOBALROOT symbolic link
+     * pointing to the root directory \ .
+     */
     RtlInitUnicodeString(&LinkName, L"GLOBALROOT");
-    RtlInitUnicodeString(&Name, L"");
+    RtlInitUnicodeString(&TargetName, L"");
     InitializeObjectAttributes(&ObjectAttributes,
                                &LinkName,
                                OBJ_PERMANENT,
@@ -64,12 +87,16 @@ ObpCreateDosDevicesDirectory(VOID)
     Status = NtCreateSymbolicLinkObject(&SymHandle,
                                         SYMBOLIC_LINK_ALL_ACCESS,
                                         &ObjectAttributes,
-                                        &Name);
+                                        &TargetName);
     if (NT_SUCCESS(Status)) NtClose(SymHandle);
 
-    /* Link \??\Global to \?? */
+    /*
+     * Initialize the \??\Global symbolic link pointing to the global
+     * DosDevices directory \?? . It is used to access the global \??
+     * by user-mode components which, by default, use a per-session
+     * DosDevices directory.
+     */
     RtlInitUnicodeString(&LinkName, L"Global");
-    RtlInitUnicodeString(&Name, L"\\??");
     InitializeObjectAttributes(&ObjectAttributes,
                                &LinkName,
                                OBJ_PERMANENT,
@@ -78,15 +105,20 @@ ObpCreateDosDevicesDirectory(VOID)
     Status = NtCreateSymbolicLinkObject(&SymHandle,
                                         SYMBOLIC_LINK_ALL_ACCESS,
                                         &ObjectAttributes,
-                                        &Name);
+                                        &RootName);
     if (NT_SUCCESS(Status)) NtClose(SymHandle);
 
     /* Close the directory handle */
     NtClose(Handle);
     if (!NT_SUCCESS(Status)) return Status;
 
-    /* Create link from '\DosDevices' to '\??' directory */
+    /*
+     * Initialize the \DosDevices symbolic link pointing to the global
+     * DosDevices directory \?? , for backward compatibility with
+     * Windows NT-2000 systems.
+     */
     RtlCreateUnicodeString(&LinkName, L"\\DosDevices");
+    RtlInitUnicodeString(&RootName, (PCWSTR)&ObpDosDevicesShortNameRoot);
     InitializeObjectAttributes(&ObjectAttributes,
                                &LinkName,
                                OBJ_PERMANENT,
@@ -95,7 +127,7 @@ ObpCreateDosDevicesDirectory(VOID)
     Status = NtCreateSymbolicLinkObject(&SymHandle,
                                         SYMBOLIC_LINK_ALL_ACCESS,
                                         &ObjectAttributes,
-                                        &Name);
+                                        &RootName);
     if (NT_SUCCESS(Status)) NtClose(SymHandle);
 
     /* FIXME: Hack Hack! */