mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
[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:
parent
7efba3bbfc
commit
0f375710aa
1 changed files with 71 additions and 39 deletions
|
@ -37,56 +37,27 @@ 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;
|
||||
|
||||
/* 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;
|
||||
|
||||
/* 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,
|
||||
&LinkName,
|
||||
OBJ_PERMANENT,
|
||||
|
@ -95,7 +66,68 @@ ObpCreateDosDevicesDirectory(VOID)
|
|||
Status = NtCreateSymbolicLinkObject(&SymHandle,
|
||||
SYMBOLIC_LINK_ALL_ACCESS,
|
||||
&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);
|
||||
|
||||
/* FIXME: Hack Hack! */
|
||||
|
|
Loading…
Reference in a new issue