[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.

svn path=/trunk/; revision=59803
This commit is contained in:
Hermès Bélusca-Maïto 2013-08-23 21:18:46 +00:00
parent 7efba3bbfc
commit 0f375710aa

View file

@ -37,56 +37,27 @@ INIT_FUNCTION
ObpCreateDosDevicesDirectory(VOID) ObpCreateDosDevicesDirectory(VOID)
{ {
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING Name, LinkName; UNICODE_STRING RootName, TargetName, LinkName;
HANDLE Handle, SymHandle; HANDLE Handle, SymHandle;
NTSTATUS Status; NTSTATUS Status;
/* Create the '\??' directory */ /* Create the global DosDevices directory \?? */
RtlInitUnicodeString(&Name, L"\\??"); RtlInitUnicodeString(&RootName, L"\\GLOBAL??");
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&Name, &RootName,
OBJ_PERMANENT, OBJ_PERMANENT,
NULL, NULL,
NULL); NULL);
Status = NtCreateDirectoryObject(&Handle, Status = NtCreateDirectoryObject(&Handle,
DIRECTORY_ALL_ACCESS, DIRECTORY_ALL_ACCESS,
&ObjectAttributes); &ObjectAttributes);
if (!NT_SUCCESS(Status)) return FALSE;
/* Initialize the GLOBALROOT path */
RtlInitUnicodeString(&LinkName, L"GLOBALROOT");
RtlInitUnicodeString(&Name, L"");
InitializeObjectAttributes(&ObjectAttributes,
&LinkName,
OBJ_PERMANENT,
Handle,
NULL);
Status = NtCreateSymbolicLinkObject(&SymHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
&Name);
if (NT_SUCCESS(Status)) NtClose(SymHandle);
/* Link \??\Global to \?? */
RtlInitUnicodeString(&LinkName, L"Global");
RtlInitUnicodeString(&Name, L"\\??");
InitializeObjectAttributes(&ObjectAttributes,
&LinkName,
OBJ_PERMANENT,
Handle,
NULL);
Status = NtCreateSymbolicLinkObject(&SymHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
&Name);
if (NT_SUCCESS(Status)) NtClose(SymHandle);
/* Close the directory handle */
NtClose(Handle);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
/* Create link from '\DosDevices' to '\??' directory */ /*********************************************\
RtlCreateUnicodeString(&LinkName, L"\\DosDevices"); |*** HACK until we support device mappings ***|
|*** Add a symlink \??\ <--> \GLOBAL??\ ***|
\*********************************************/
RtlInitUnicodeString(&LinkName, L"\\??");
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&LinkName, &LinkName,
OBJ_PERMANENT, OBJ_PERMANENT,
@ -95,7 +66,68 @@ ObpCreateDosDevicesDirectory(VOID)
Status = NtCreateSymbolicLinkObject(&SymHandle, Status = NtCreateSymbolicLinkObject(&SymHandle,
SYMBOLIC_LINK_ALL_ACCESS, SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes, &ObjectAttributes,
&Name); &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(&TargetName, L"");
InitializeObjectAttributes(&ObjectAttributes,
&LinkName,
OBJ_PERMANENT,
Handle,
NULL);
Status = NtCreateSymbolicLinkObject(&SymHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
&TargetName);
if (NT_SUCCESS(Status)) NtClose(SymHandle);
/*
* 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");
InitializeObjectAttributes(&ObjectAttributes,
&LinkName,
OBJ_PERMANENT,
Handle,
NULL);
Status = NtCreateSymbolicLinkObject(&SymHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
&RootName);
if (NT_SUCCESS(Status)) NtClose(SymHandle);
/* Close the directory handle */
NtClose(Handle);
if (!NT_SUCCESS(Status)) return Status;
/*
* 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,
NULL,
NULL);
Status = NtCreateSymbolicLinkObject(&SymHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
&RootName);
if (NT_SUCCESS(Status)) NtClose(SymHandle); if (NT_SUCCESS(Status)) NtClose(SymHandle);
/* FIXME: Hack Hack! */ /* FIXME: Hack Hack! */