Author: hbelusca
Date: Fri Aug 23 21:18:46 2013
New Revision: 59803
URL:
http://svn.reactos.org/svn/reactos?rev=59803&view=rev
Log:
[NTOSKRNL]
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.
Modified:
trunk/reactos/ntoskrnl/ob/obname.c
Modified: trunk/reactos/ntoskrnl/ob/obname.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obname.c?rev=5…
==============================================================================
--- trunk/reactos/ntoskrnl/ob/obname.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ob/obname.c [iso-8859-1] Fri Aug 23 21:18:46 2013
@@ -37,25 +37,48 @@
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;
-
- /* Initialize the GLOBALROOT path */
+ 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 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 @@
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 @@
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 @@
Status = NtCreateSymbolicLinkObject(&SymHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
- &Name);
+ &RootName);
if (NT_SUCCESS(Status)) NtClose(SymHandle);
/* FIXME: Hack Hack! */