@@ -127,6 +127,14 @@ int GetDomainFromToken ( HANDLE *hAccessToken, UCHAR *domain, DWORD dwSize)
127
127
* RETURNS: pointer to static string with homedir or NULL if fails.
128
128
*/
129
129
130
+ #define SET_USER_ENV (folder_id , evn_variable ) do { \
131
+ if (SHGetKnownFolderPath(&folder_id,0,token,&path) == S_OK) \
132
+ { \
133
+ SetEnvironmentVariableW(evn_variable, path); \
134
+ CoTaskMemFree(path); \
135
+ } \
136
+ } while (0)
137
+
130
138
char * GetHomeDirFromToken (char * userName , HANDLE token )
131
139
{
132
140
UCHAR InfoBuffer [1000 ];
@@ -156,16 +164,62 @@ char *GetHomeDirFromToken(char *userName, HANDLE token)
156
164
if (reg_key )
157
165
RegCloseKey (reg_key );
158
166
159
- /* TODO - populate APPDATA, LOCALADPPDATA, TEMP, etc */
160
- SetEnvironmentVariableW (L"LOCALAPPDATA" , L"" );
161
- SetEnvironmentVariableW (L"APPDATA" , L"" );
162
- SetEnvironmentVariableW (L"TEMP" , L"" );
163
- SetEnvironmentVariableW (L"TMP" , L"" );
164
- SetEnvironmentVariableW (L"USERDNSDOMAIN" , L"" );
165
- SetEnvironmentVariableW (L"USERDOMAIN" , L"" );
166
- SetEnvironmentVariableW (L"USERDOMAIN_ROAMINGPROFILE" , L"" );
167
- SetEnvironmentVariableW (L"USERPROFILE" , L"" );
168
-
167
+ { /* retrieve and set env variables. */
168
+ /* TODO - Get away with fixed limits and dynamically allocated required memory*/
169
+ #define MAX_VALUE_LEN 1000
170
+ #define MAX_DATA_LEN 2000
171
+ #define MAX_EXPANDED_DATA_LEN 5000
172
+ wchar_t * path ;
173
+ wchar_t value_name [MAX_VALUE_LEN ];
174
+ wchar_t value_data [MAX_DATA_LEN ], value_data_expanded [MAX_EXPANDED_DATA_LEN ], * to_apply ;
175
+ DWORD value_type , name_len , data_len ;
176
+ int i ;
177
+ LONG ret ;
178
+
179
+ ImpersonateLoggedOnUser (token );
180
+ SET_USER_ENV (FOLDERID_LocalAppData , L"LOCALAPPDATA" );
181
+ SET_USER_ENV (FOLDERID_Profile , L"USERPROFILE" );
182
+ SET_USER_ENV (FOLDERID_RoamingAppData , L"APPDATA" );
183
+ reg_key = 0 ;
184
+ if (RegOpenKeyExW (HKEY_CURRENT_USER , L"Environment" , 0 , KEY_QUERY_VALUE , & reg_key ) == ERROR_SUCCESS ) {
185
+ i = 0 ;
186
+ while (1 ) {
187
+ name_len = MAX_VALUE_LEN * 2 ;
188
+ data_len = MAX_DATA_LEN * 2 ;
189
+ to_apply = NULL ;
190
+ if (RegEnumValueW (reg_key , i ++ , & value_name , & name_len , 0 , & value_type , & value_data , & data_len ) != ERROR_SUCCESS )
191
+ break ;
192
+ if (value_type == REG_SZ )
193
+ to_apply = value_data ;
194
+ else if (value_type == REG_EXPAND_SZ ) {
195
+ ExpandEnvironmentStringsW (value_data , value_data_expanded , MAX_EXPANDED_DATA_LEN );
196
+ to_apply = value_data_expanded ;
197
+ }
198
+
199
+ if (wcsicmp (value_name , L"PATH" ) == 0 ) {
200
+ DWORD size ;
201
+ if ((size = GetEnvironmentVariableW (L"PATH" , NULL , 0 )) != ERROR_ENVVAR_NOT_FOUND ) {
202
+ memcpy (value_data_expanded + size , to_apply , (wcslen (to_apply ) + 1 )* 2 );
203
+ GetEnvironmentVariableW (L"PATH" , value_data_expanded , MAX_EXPANDED_DATA_LEN );
204
+ value_data_expanded [size - 1 ] = L';' ;
205
+ to_apply = value_data_expanded ;
206
+ }
207
+
208
+ }
209
+ if (to_apply )
210
+ SetEnvironmentVariableW (value_name , to_apply );
211
+
212
+
213
+ }
214
+ RegCloseKey (reg_key );
215
+ }
216
+
217
+
218
+ RevertToSelf ();
219
+ }
220
+
221
+
222
+
169
223
debug ("<- GetHomeDirFromToken()..." );
170
224
171
225
return pw_homedir ;
0 commit comments