mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +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)
|
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! */
|
||||||
|
|
Loading…
Reference in a new issue