BOOL WINAPI GetAllUsersProfileDirectoryA(LPSTR lpProfileDir, LPDWORD lpcchSize) { LPWSTR lpBuffer; BOOL bResult; lpBuffer = GlobalAlloc(GMEM_FIXED, *lpcchSize * sizeof(WCHAR)); if (lpBuffer == NULL) return FALSE; bResult = GetAllUsersProfileDirectoryW(lpBuffer, lpcchSize); if (bResult) { WideCharToMultiByte(CP_ACP, 0, lpBuffer, -1, lpProfileDir, *lpcchSize, NULL, NULL); } GlobalFree(lpBuffer); return bResult; }
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit) { NTSTATUS Status; LONG lError; PWSTR* Environment = (PWSTR*)lpEnvironment; DWORD Length; DWORD dwType; HKEY hKey; HKEY hKeyUser; LPWSTR lpUserName = NULL; LPWSTR lpDomainName = NULL; WCHAR Buffer[MAX_PATH]; WCHAR szValue[1024]; DPRINT("CreateEnvironmentBlock() called\n"); if (lpEnvironment == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } Status = RtlCreateEnvironment((BOOLEAN)bInherit, Environment); if (!NT_SUCCESS(Status)) { DPRINT1("RtlCreateEnvironment() failed (Status %lx)\n", Status); SetLastError(RtlNtStatusToDosError(Status)); return FALSE; } /* Set 'SystemRoot' variable */ Length = ARRAYSIZE(Buffer); if (GetEnvironmentVariableW(L"SystemRoot", Buffer, Length)) { SetUserEnvironmentVariable(Environment, L"SystemRoot", Buffer, FALSE); } /* Set 'SystemDrive' variable */ if (GetEnvironmentVariableW(L"SystemDrive", Buffer, Length)) { SetUserEnvironmentVariable(Environment, L"SystemDrive", Buffer, FALSE); } /* Set variables from Session Manager */ if (!SetSystemEnvironment(Environment)) { RtlDestroyEnvironment(*Environment); return FALSE; } /* Set 'COMPUTERNAME' variable */ Length = ARRAYSIZE(Buffer); if (GetComputerNameW(Buffer, &Length)) { SetUserEnvironmentVariable(Environment, L"COMPUTERNAME", Buffer, FALSE); } /* Set 'ALLUSERSPROFILE' variable */ Length = ARRAYSIZE(Buffer); if (GetAllUsersProfileDirectoryW(Buffer, &Length)) { SetUserEnvironmentVariable(Environment, L"ALLUSERSPROFILE", Buffer, FALSE); } /* Set 'USERPROFILE' variable to the default users profile */ Length = ARRAYSIZE(Buffer); if (GetDefaultUserProfileDirectoryW(Buffer, &Length)) { SetUserEnvironmentVariable(Environment, L"USERPROFILE", Buffer, TRUE); } lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0, KEY_READ, &hKey); if (lError == ERROR_SUCCESS) { Length = sizeof(szValue); lError = RegQueryValueExW(hKey, L"ProgramFilesDir", NULL, &dwType, (LPBYTE)szValue, &Length); if (lError == ERROR_SUCCESS) { SetUserEnvironmentVariable(Environment, L"ProgramFiles", szValue, FALSE); } Length = sizeof(szValue); lError = RegQueryValueExW(hKey, L"CommonFilesDir", NULL, &dwType, (LPBYTE)szValue, &Length); if (lError == ERROR_SUCCESS) { SetUserEnvironmentVariable(Environment, L"CommonProgramFiles", szValue, FALSE); } RegCloseKey(hKey); } /* * If no user token is specified, the system environment variables are set * and we stop here, otherwise continue setting the user-specific variables. */ if (hToken == NULL) return TRUE; hKeyUser = GetCurrentUserKey(hToken); if (hKeyUser == NULL) { DPRINT1("GetCurrentUserKey() failed\n"); RtlDestroyEnvironment(*Environment); return FALSE; } /* Set 'USERPROFILE' variable */ Length = ARRAYSIZE(Buffer); if (GetUserProfileDirectoryW(hToken, Buffer, &Length)) { DWORD MinLen = 2; SetUserEnvironmentVariable(Environment, L"USERPROFILE", Buffer, FALSE); // FIXME: Strangely enough the following two environment variables // are not set by userenv.dll in Windows... See r68284 / CORE-9875 // FIXME2: This is done by msgina.dll !! /* At least <drive letter>:<path> */ if (Length > MinLen) { /* Set 'HOMEDRIVE' variable */ StringCchCopyNW(szValue, ARRAYSIZE(Buffer), Buffer, MinLen); SetUserEnvironmentVariable(Environment, L"HOMEDRIVE", szValue, FALSE); /* Set 'HOMEPATH' variable */ StringCchCopyNW(szValue, ARRAYSIZE(Buffer), Buffer + MinLen, Length - MinLen); SetUserEnvironmentVariable(Environment, L"HOMEPATH", szValue, FALSE); } } else { DPRINT1("GetUserProfileDirectoryW failed with error %lu\n", GetLastError()); } if (GetUserAndDomainName(hToken, &lpUserName, &lpDomainName)) { /* Set 'USERNAME' variable */ SetUserEnvironmentVariable(Environment, L"USERNAME", lpUserName, FALSE); /* Set 'USERDOMAIN' variable */ SetUserEnvironmentVariable(Environment, L"USERDOMAIN", lpDomainName, FALSE); if (lpUserName != NULL) LocalFree(lpUserName); if (lpDomainName != NULL) LocalFree(lpDomainName); } /* Set user environment variables */ SetUserEnvironment(Environment, hKeyUser, L"Environment"); /* Set user volatile environment variables */ SetUserEnvironment(Environment, hKeyUser, L"Volatile Environment"); RegCloseKey(hKeyUser); return TRUE; }