diff --git a/reactos/dll/win32/kernel32/misc/dllmain.c b/reactos/dll/win32/kernel32/misc/dllmain.c index e91c44f4a7e..6f27b58a648 100644 --- a/reactos/dll/win32/kernel32/misc/dllmain.c +++ b/reactos/dll/win32/kernel32/misc/dllmain.c @@ -66,10 +66,7 @@ OpenBaseDirectory(PHANDLE DirHandle) { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING Name = RTL_CONSTANT_STRING(L"\\BaseNamedObjects"); - UNICODE_STRING SymName = RTL_CONSTANT_STRING(L"Local"); - UNICODE_STRING SymName2 = RTL_CONSTANT_STRING(L"Global"); NTSTATUS Status; - HANDLE SymHandle; InitializeObjectAttributes(&ObjectAttributes, &Name, @@ -83,44 +80,7 @@ OpenBaseDirectory(PHANDLE DirHandle) &ObjectAttributes); if (!NT_SUCCESS(Status)) { - /* FIXME: It's not our job to create the BNO directory, csr does it */ - Status = NtCreateDirectoryObject(DirHandle, - DIRECTORY_ALL_ACCESS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtCreateDirectoryObject() failed\n"); - } - - /* Create the "local" Symbolic Link. FIXME: CSR should do this */ - InitializeObjectAttributes(&ObjectAttributes, - &SymName, - OBJ_CASE_INSENSITIVE, - *DirHandle, - NULL); - Status = NtCreateSymbolicLinkObject(&SymHandle, - SYMBOLIC_LINK_ALL_ACCESS, - &ObjectAttributes, - &Name); - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtCreateSymbolicLinkObject() failed\n"); - } - - /* Create the "global" Symbolic Link. FIXME: CSR should do this */ - InitializeObjectAttributes(&ObjectAttributes, - &SymName2, - OBJ_CASE_INSENSITIVE, - *DirHandle, - NULL); - Status = NtCreateSymbolicLinkObject(&SymHandle, - SYMBOLIC_LINK_ALL_ACCESS, - &ObjectAttributes, - &Name); - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtCreateSymbolicLinkObject() failed\n"); - } + return Status; } DPRINT("Opened BNO: %lx\n", *DirHandle); diff --git a/reactos/subsystems/win32/csrss/init.c b/reactos/subsystems/win32/csrss/init.c index 03d28112d94..010574536a9 100644 --- a/reactos/subsystems/win32/csrss/init.c +++ b/reactos/subsystems/win32/csrss/init.c @@ -339,6 +339,73 @@ CsrpCreateListenPort (IN LPWSTR Name, /* === INIT ROUTINES === */ +/********************************************************************** + * CsrpCreateBNODirectory/3 + * + * These used to be part of kernel32 startup, but that clearly wasn't a good + * idea, as races were definately possible. These are moved (as in the + * previous fixmes). + */ +static NTSTATUS +CsrpCreateBNODirectory (int argc, char ** argv, char ** envp) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING Name = RTL_CONSTANT_STRING(L"\\BaseNamedObjects"); + UNICODE_STRING SymName = RTL_CONSTANT_STRING(L"Local"); + UNICODE_STRING SymName2 = RTL_CONSTANT_STRING(L"Global"); + HANDLE DirHandle, SymHandle; + + /* Seems like a good place to create these objects which are needed by + * win32 processes */ + InitializeObjectAttributes(&ObjectAttributes, + &Name, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtCreateDirectoryObject(&DirHandle, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtCreateDirectoryObject() failed %08x\n", Status); + } + + /* Create the "local" Symbolic Link. + * FIXME: CSR should do this -- Fixed */ + InitializeObjectAttributes(&ObjectAttributes, + &SymName, + OBJ_CASE_INSENSITIVE, + DirHandle, + NULL); + Status = NtCreateSymbolicLinkObject(&SymHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + &Name); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtCreateDirectoryObject() failed %08x\n", Status); + } + + /* Create the "global" Symbolic Link. */ + InitializeObjectAttributes(&ObjectAttributes, + &SymName2, + OBJ_CASE_INSENSITIVE, + DirHandle, + NULL); + Status = NtCreateSymbolicLinkObject(&SymHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + &Name); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtCreateDirectoryObject() failed %08x\n", Status); + } + + return Status; +} + /********************************************************************** * CsrpCreateHeap/3 */ @@ -623,6 +690,7 @@ struct { CSR_INIT_ROUTINE EntryPoint; PCHAR ErrorMessage; } InitRoutine [] = { + {TRUE, CsrpCreateBNODirectory, "create base named objects directory"}, {TRUE, CsrpCreateCallbackPort, "create the callback port \\Windows\\SbApiPort"}, {TRUE, CsrpRegisterSubsystem, "register with SM"}, {TRUE, CsrpCreateHeap, "create the CSR heap"},