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=59... ============================================================================== --- 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! */