[SMSS]
authorEric Kohl <eric.kohl@reactos.org>
Sat, 30 Apr 2011 22:09:16 +0000 (22:09 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 30 Apr 2011 22:09:16 +0000 (22:09 +0000)
Fix for the loading of the "KnownDlls" in SMSS. Patch by Hermès BÉLUSCA - MAÏTO.
The patch was applied without changes to comments, indentation and coding style.

See issue #6159 for more details.

svn path=/trunk/; revision=51511

reactos/base/system/smss/init.c
reactos/base/system/smss/initenv.c

index 6d5bc64..146a441 100644 (file)
@@ -30,10 +30,10 @@ struct {
        {TRUE,  SmInitDosDevices,             "create dos device links"},
        {TRUE,  SmRunBootApplications,        "run boot applications"},
        {TRUE,  SmProcessFileRenameList,      "process the file rename list"},
+       {FALSE, SmUpdateEnvironment,          "update environment variables"},
        {FALSE, SmLoadKnownDlls,              "preload system DLLs"},
        {TRUE,  SmCreatePagingFiles,          "create paging files"},
        {TRUE,  SmInitializeRegistry,         "initialize the registry"},
-       {FALSE, SmUpdateEnvironment,          "update environment variables"},
        {TRUE,  SmInitializeClientManagement, "initialize client management"},
        {TRUE,  SmLoadSubsystems,             "load subsystems"}
 };
index 24ccc3b..21874e3 100644 (file)
@@ -227,10 +227,6 @@ SmSetEnvironmentVariables(VOID)
         goto done;
     }
 
-done:
-    NtClose(EnvironmentKey);
-
-
     /* Set the 'PROCESSOR_IDENTIFIER' system environment variable */
     RtlInitUnicodeString(&Identifier, NULL);
     RtlInitUnicodeString(&VendorIdentifier, NULL);
@@ -251,25 +247,37 @@ done:
                                     QueryTable,
                                     NULL,
                                     NULL);
-    if (NT_SUCCESS(Status))
+    if (!NT_SUCCESS(Status))
     {
-        DPRINT("SM: szIdentifier: %wZ\n", &Identifier);
-        DPRINT("SM: szVendorIdentifier: %wZ\n", &VendorIdentifier);
+        DPRINT1("SM: Failed to retrieve processor Identifier and/or VendorIdentifier (Status %08lx)", Status);
+        goto done;
+    }
 
-        swprintf(Buffer, L"%wZ, %wZ", &Identifier, &VendorIdentifier);
+    DPRINT("SM: szIdentifier: %wZ\n"      , &Identifier);
+    DPRINT("SM: szVendorIdentifier: %wZ\n", &VendorIdentifier);
 
-        RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
-                              L"Session Manager\\Environment",
-                              L"PROCESSOR_IDENTIFIER",
-                              REG_SZ,
-                              Buffer,
-                              (wcslen(Buffer) + 1) * sizeof(WCHAR));
+    RtlInitUnicodeString(&VariableName, L"PROCESSOR_IDENTIFIER");
+    swprintf(Buffer, L"%wZ, %wZ", &Identifier, &VendorIdentifier);
+    RtlFreeUnicodeString(&VendorIdentifier);
+    RtlFreeUnicodeString(&Identifier);
+
+    Status = NtSetValueKey(EnvironmentKey,
+                           &VariableName,
+                           0,
+                           REG_SZ,
+                           Buffer,
+                           (wcslen(Buffer) + 1) * sizeof(WCHAR));
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("SM: Failed to set the PROCESSOR_IDENTIFIER environment variable (Status %08lx)", Status);
+        goto done;
     }
 
-    RtlFreeUnicodeString(&Identifier);
-    RtlFreeUnicodeString(&VendorIdentifier);
+done:
+    /* Close the handle */
+    NtClose(EnvironmentKey);
 
-    return STATUS_SUCCESS;
+    return Status;
 }
 
 
@@ -282,6 +290,10 @@ SmUpdateEnvironment(VOID)
     RTL_QUERY_REGISTRY_TABLE QueryTable[2];
     WCHAR ValueBuffer[MAX_PATH];
     NTSTATUS Status;
+#ifndef NDEBUG
+    ULONG ii;
+    PWSTR envp;
+#endif
 
     /*
      * The following environment variables must be set prior to reading
@@ -317,6 +329,18 @@ SmUpdateEnvironment(VOID)
                                     &SmSystemEnvironment,
                                     SmSystemEnvironment);
 
+#ifndef NDEBUG
+    /* Print all environment varaibles */
+    ii = 0;
+    envp = SmSystemEnvironment;
+    DbgPrint("SmUpdateEnvironment:\n");
+    while (*envp)
+    {
+        DbgPrint("  %u: %S\n", ii++, envp);
+        envp += wcslen(envp) + 1;
+    }
+#endif
+
     return Status;
 }