2 * PROJECT: ReactOS Session Manager
3 * LICENSE: GPL v2 or later - See COPYING in the top level directory
4 * FILE: base/system/smss/initenv.c
5 * PURPOSE: Environment initialization.
6 * PROGRAMMERS: ReactOS Development Team
9 /* INCLUDES ******************************************************************/
17 PWSTR SmSystemEnvironment
= NULL
;
23 SmCreateEnvironment(VOID
)
25 return RtlCreateEnvironment(FALSE
, &SmSystemEnvironment
);
30 SmpSetEnvironmentVariable(IN PVOID Context
,
34 UNICODE_STRING EnvVariable
;
35 UNICODE_STRING EnvValue
;
37 RtlInitUnicodeString(&EnvVariable
,
39 RtlInitUnicodeString(&EnvValue
,
41 return RtlSetEnvironmentVariable(Context
,
48 SmpEnvironmentQueryRoutine(IN PWSTR ValueName
,
53 IN PVOID EntryContext
)
55 DPRINT("ValueName '%S' Type %lu Length %lu\n", ValueName
, ValueType
, ValueLength
);
57 if (ValueType
!= REG_SZ
&& ValueType
!= REG_EXPAND_SZ
)
58 return STATUS_SUCCESS
;
60 DPRINT("ValueData '%S'\n", (PWSTR
)ValueData
);
61 return SmpSetEnvironmentVariable(Context
,ValueName
,(PWSTR
)ValueData
);
66 SmSetEnvironmentVariables(VOID
)
68 SYSTEM_BASIC_INFORMATION BasicInformation
;
70 RTL_QUERY_REGISTRY_TABLE QueryTable
[3];
71 UNICODE_STRING Identifier
;
72 UNICODE_STRING VendorIdentifier
;
75 UNICODE_STRING EnvironmentKeyName
;
76 OBJECT_ATTRIBUTES ObjectAttributes
;
77 HANDLE EnvironmentKey
;
78 UNICODE_STRING VariableName
;
84 Status
= NtQuerySystemInformation(SystemBasicInformation
,
86 sizeof(SYSTEM_BASIC_INFORMATION
),
88 if (!NT_SUCCESS(Status
))
90 DPRINT1("SM: Failed to retrieve system basic information (Status %08lx)", Status
);
94 RtlInitUnicodeString(&EnvironmentKeyName
,
95 L
"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager\\Environment");
96 InitializeObjectAttributes(&ObjectAttributes
,
102 /* Open the system environment key */
103 Status
= NtOpenKey(&EnvironmentKey
,
106 if (!NT_SUCCESS(Status
))
108 DPRINT1("SM: Failed to open the environment key (Status %08lx)", Status
);
112 /* Set the 'NUMBER_OF_PROCESSORS' system environment variable */
113 RtlInitUnicodeString(&VariableName
,
114 L
"NUMBER_OF_PROCESSORS");
116 swprintf(Buffer
, L
"%lu", BasicInformation
.NumberOfProcessors
);
118 Status
= NtSetValueKey(EnvironmentKey
,
123 (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
124 if (!NT_SUCCESS(Status
))
126 DPRINT1("SM: Failed to set the NUMBER_OF_PROCESSORS environment variable (Status %08lx)", Status
);
130 /* Set the 'OS' system environment variable */
131 RtlInitUnicodeString(&VariableName
,
134 VariableData
= L
"ReactOS";
136 Status
= NtSetValueKey(EnvironmentKey
,
141 (wcslen(VariableData
) + 1) * sizeof(WCHAR
));
142 if (!NT_SUCCESS(Status
))
144 DPRINT1("SM: Failed to set the OS environment variable (Status %08lx)", Status
);
148 /* Set the 'PROCESSOR_ARCHITECTURE' system environment variable */
149 RtlInitUnicodeString(&VariableName
,
150 L
"PROCESSOR_ARCHITECTURE");
153 VariableData
= L
"x86";
155 VariableData
= L
"AMD64";
157 VariableData
= L
"ARM";
159 VariableData
= L
"PPC";
161 #error "Unsupported Architecture!\n"
164 Status
= NtSetValueKey(EnvironmentKey
,
169 (wcslen(VariableData
) + 1) * sizeof(WCHAR
));
170 if (!NT_SUCCESS(Status
))
172 DPRINT1("SM: Failed to set the PROCESSOR_ARCHITECTURE environment variable (Status %08lx)", Status
);
177 NtClose(EnvironmentKey
);
180 /* Set the 'PROCESSOR_IDENTIFIER' system environment variable */
181 RtlInitUnicodeString(&Identifier
, NULL
);
182 RtlInitUnicodeString(&VendorIdentifier
, NULL
);
184 RtlZeroMemory(&QueryTable
,
187 QueryTable
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
;
188 QueryTable
[0].Name
= L
"Identifier";
189 QueryTable
[0].EntryContext
= &Identifier
;
191 QueryTable
[1].Flags
= RTL_QUERY_REGISTRY_DIRECT
;
192 QueryTable
[1].Name
= L
"VendorIdentifier";
193 QueryTable
[1].EntryContext
= &VendorIdentifier
;
195 Status
= RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE
,
196 L
"\\Registry\\Machine\\Hardware\\Description\\System\\CentralProcessor\\0",
200 if (NT_SUCCESS(Status
))
202 DPRINT("SM: szIdentifier: %wZ\n", &Identifier
);
203 DPRINT("SM: szVendorIdentifier: %wZ\n", &VendorIdentifier
);
205 swprintf(Buffer
, L
"%wZ, %wZ", &Identifier
, &VendorIdentifier
);
207 RtlWriteRegistryValue(RTL_REGISTRY_CONTROL
,
208 L
"Session Manager\\Environment",
209 L
"PROCESSOR_IDENTIFIER",
212 (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
215 RtlFreeUnicodeString(&Identifier
);
216 RtlFreeUnicodeString(&VendorIdentifier
);
218 return STATUS_SUCCESS
;
222 /**********************************************************************
223 * Set environment variables from registry
226 SmUpdateEnvironment(VOID
)
228 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
229 WCHAR ValueBuffer
[MAX_PATH
];
233 * The following environment variables must be set prior to reading
234 * other variables from the registry.
236 * Variables (example):
237 * SystemRoot = "C:\reactos"
241 /* Copy system root into value buffer */
243 SharedUserData
->NtSystemRoot
);
245 /* Set SystemRoot = "C:\reactos" */
246 SmpSetEnvironmentVariable(&SmSystemEnvironment
, L
"SystemRoot", ValueBuffer
);
248 /* Cut off trailing path */
251 /* Set SystemDrive = "C:" */
252 SmpSetEnvironmentVariable(&SmSystemEnvironment
, L
"SystemDrive", ValueBuffer
);
254 /* Read system environment from the registry. */
255 RtlZeroMemory(&QueryTable
,
258 QueryTable
[0].QueryRoutine
= SmpEnvironmentQueryRoutine
;
260 Status
= RtlQueryRegistryValues(RTL_REGISTRY_CONTROL
,
261 L
"Session Manager\\Environment",
263 &SmSystemEnvironment
,
264 SmSystemEnvironment
);