static BOOL LoadHive(HWND hWnd) { OPENFILENAME ofn; WCHAR Caption[128]; LPCWSTR pszKeyPath; WCHAR xPath[LOADHIVE_KEYNAMELENGTH]; HKEY hRootKey; WCHAR Filter[1024]; FILTERPAIR filter; /* get the item key to load the hive in */ pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); /* initialize the "open file" dialog */ InitOpenFileName(hWnd, &ofn); /* build the "All Files" filter up */ filter.DisplayID = IDS_FLT_ALLFILES; filter.FilterID = IDS_FLT_ALLFILES_FLT; BuildFilterStrings(Filter, &filter, 1); ofn.lpstrFilter = Filter; /* load and set the caption and flags for dialog */ LoadStringW(hInst, IDS_LOAD_HIVE, Caption, COUNT_OF(Caption)); ofn.lpstrTitle = Caption; ofn.Flags |= OFN_ENABLESIZING; /* ofn.lCustData = ;*/ /* now load the hive */ if (GetOpenFileName(&ofn)) { if (DialogBoxParamW(hInst, MAKEINTRESOURCEW(IDD_LOADHIVE), hWnd, &LoadHive_KeyNameInHookProc, (LPARAM)xPath)) { LONG regLoadResult; /* Enable the 'restore' privilege, load the hive, disable the privilege */ EnablePrivilege(SE_RESTORE_NAME, NULL, TRUE); regLoadResult = RegLoadKeyW(hRootKey, xPath, ofn.lpstrFile); EnablePrivilege(SE_RESTORE_NAME, NULL, FALSE); if(regLoadResult == ERROR_SUCCESS) { /* refresh tree and list views */ RefreshTreeView(g_pChildWnd->hTreeWnd); pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); RefreshListView(g_pChildWnd->hListWnd, hRootKey, pszKeyPath); } else { ErrorMessageBox(hWnd, Caption, regLoadResult); return FALSE; } } } else { CheckCommDlgError(hWnd); } return TRUE; }
LONG Win32U_RegLoadKey(HKEY keyName, // IN: LPCSTR subKey, // IN: LPCSTR regFile) // IN: { LONG ret; utf16_t *subKeyW = Unicode_GetAllocUTF16(subKey); utf16_t *regFileW = Unicode_GetAllocUTF16(regFile); ret = RegLoadKeyW(keyName, subKeyW, regFileW); free(subKeyW); free(regFileW); return ret; }
BOOL WINAPI CreateUserProfileW(PSID Sid, LPCWSTR lpUserName) { WCHAR szRawProfilesPath[MAX_PATH]; WCHAR szProfilesPath[MAX_PATH]; WCHAR szUserProfilePath[MAX_PATH]; WCHAR szDefaultUserPath[MAX_PATH]; WCHAR szUserProfileName[MAX_PATH]; WCHAR szBuffer[MAX_PATH]; LPWSTR SidString; DWORD dwLength; DWORD dwDisposition; UINT i; HKEY hKey; BOOL bRet = TRUE; LONG Error; DPRINT("CreateUserProfileW() called\n"); Error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList", 0, KEY_QUERY_VALUE, &hKey); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); SetLastError((DWORD)Error); return FALSE; } /* Get profiles path */ dwLength = MAX_PATH * sizeof(WCHAR); Error = RegQueryValueExW(hKey, L"ProfilesDirectory", NULL, NULL, (LPBYTE)szRawProfilesPath, &dwLength); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); RegCloseKey(hKey); SetLastError((DWORD)Error); return FALSE; } /* Expand it */ if (!ExpandEnvironmentStringsW(szRawProfilesPath, szProfilesPath, MAX_PATH)) { DPRINT1("Error: %lu\n", GetLastError()); RegCloseKey(hKey); return FALSE; } /* create the profiles directory if it does not yet exist */ if (!CreateDirectoryW(szProfilesPath, NULL)) { if (GetLastError() != ERROR_ALREADY_EXISTS) { DPRINT1("Error: %lu\n", GetLastError()); return FALSE; } } /* Get default user path */ dwLength = MAX_PATH * sizeof(WCHAR); Error = RegQueryValueExW(hKey, L"DefaultUserProfile", NULL, NULL, (LPBYTE)szBuffer, &dwLength); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); RegCloseKey(hKey); SetLastError((DWORD)Error); return FALSE; } RegCloseKey (hKey); wcscpy(szUserProfileName, lpUserName); wcscpy(szUserProfilePath, szProfilesPath); wcscat(szUserProfilePath, L"\\"); wcscat(szUserProfilePath, szUserProfileName); wcscpy(szDefaultUserPath, szProfilesPath); wcscat(szDefaultUserPath, L"\\"); wcscat(szDefaultUserPath, szBuffer); /* Create user profile directory */ if (!CreateDirectoryW(szUserProfilePath, NULL)) { if (GetLastError() != ERROR_ALREADY_EXISTS) { DPRINT1("Error: %lu\n", GetLastError()); return FALSE; } for (i = 0; i < 1000; i++) { swprintf(szUserProfileName, L"%s.%03u", lpUserName, i); wcscpy(szUserProfilePath, szProfilesPath); wcscat(szUserProfilePath, L"\\"); wcscat(szUserProfilePath, szUserProfileName); if (CreateDirectoryW(szUserProfilePath, NULL)) break; if (GetLastError() != ERROR_ALREADY_EXISTS) { DPRINT1("Error: %lu\n", GetLastError()); return FALSE; } } } /* Copy default user directory */ if (!CopyDirectory(szUserProfilePath, szDefaultUserPath)) { DPRINT1("Error: %lu\n", GetLastError()); return FALSE; } /* Add profile to profile list */ if (!ConvertSidToStringSidW(Sid, &SidString)) { DPRINT1("Error: %lu\n", GetLastError()); return FALSE; } wcscpy(szBuffer, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\"); wcscat(szBuffer, SidString); /* Create user profile key */ Error = RegCreateKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); bRet = FALSE; goto Done; } /* Create non-expanded user profile path */ wcscpy(szBuffer, szRawProfilesPath); wcscat(szBuffer, L"\\"); wcscat(szBuffer, szUserProfileName); /* Set 'ProfileImagePath' value (non-expanded) */ Error = RegSetValueExW(hKey, L"ProfileImagePath", 0, REG_EXPAND_SZ, (LPBYTE)szBuffer, (wcslen (szBuffer) + 1) * sizeof(WCHAR)); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); RegCloseKey(hKey); bRet = FALSE; goto Done; } /* Set 'Sid' value */ Error = RegSetValueExW(hKey, L"Sid", 0, REG_BINARY, Sid, GetLengthSid(Sid)); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); RegCloseKey(hKey); bRet = FALSE; goto Done; } RegCloseKey(hKey); /* Create user hive name */ wcscpy(szBuffer, szUserProfilePath); wcscat(szBuffer, L"\\ntuser.dat"); /* Acquire restore privilege */ if (!AcquireRemoveRestorePrivilege(TRUE)) { Error = GetLastError(); DPRINT1("Error: %lu\n", Error); bRet = FALSE; goto Done; } /* Create new user hive */ Error = RegLoadKeyW(HKEY_USERS, SidString, szBuffer); AcquireRemoveRestorePrivilege(FALSE); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); bRet = FALSE; goto Done; } /* Initialize user hive */ if (!CreateUserHive(SidString, szUserProfilePath)) { Error = GetLastError(); DPRINT1("Error: %lu\n", Error); bRet = FALSE; } /* Unload the hive */ AcquireRemoveRestorePrivilege(TRUE); RegUnLoadKeyW(HKEY_USERS, SidString); AcquireRemoveRestorePrivilege(FALSE); Done: LocalFree((HLOCAL)SidString); SetLastError((DWORD)Error); DPRINT("CreateUserProfileW() done\n"); return bRet; }
BOOL WINAPI LoadUserProfileW(IN HANDLE hToken, IN OUT LPPROFILEINFOW lpProfileInfo) { WCHAR szUserHivePath[MAX_PATH]; LPWSTR UserName = NULL, Domain = NULL; DWORD UserNameLength = 0, DomainLength = 0; PTOKEN_USER UserSid = NULL; SID_NAME_USE AccountType; UNICODE_STRING SidString = { 0, 0, NULL }; LONG Error; BOOL ret = FALSE; DWORD dwLength = sizeof(szUserHivePath) / sizeof(szUserHivePath[0]); DPRINT("LoadUserProfileW() called\n"); /* Check profile info */ if (!lpProfileInfo || (lpProfileInfo->dwSize != sizeof(PROFILEINFOW)) || (lpProfileInfo->lpUserName == NULL) || (lpProfileInfo->lpUserName[0] == 0)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } /* Don't load a profile twice */ if (CheckForLoadedProfile(hToken)) { DPRINT ("Profile already loaded\n"); lpProfileInfo->hProfile = NULL; return TRUE; } if (lpProfileInfo->lpProfilePath) { wcscpy(szUserHivePath, lpProfileInfo->lpProfilePath); } else { /* FIXME: check if MS Windows allows lpProfileInfo->lpProfilePath to be NULL */ if (!GetProfilesDirectoryW(szUserHivePath, &dwLength)) { DPRINT1("GetProfilesDirectoryW() failed (error %ld)\n", GetLastError()); return FALSE; } } /* Create user hive name */ wcscat(szUserHivePath, L"\\"); wcscat(szUserHivePath, lpProfileInfo->lpUserName); wcscat(szUserHivePath, L"\\ntuser.dat"); DPRINT("szUserHivePath: %S\n", szUserHivePath); /* Create user profile directory if needed */ if (GetFileAttributesW(szUserHivePath) == INVALID_FILE_ATTRIBUTES) { /* Get user sid */ if (GetTokenInformation(hToken, TokenUser, NULL, 0, &dwLength) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) { DPRINT1 ("GetTokenInformation() failed\n"); return FALSE; } UserSid = (PTOKEN_USER)HeapAlloc(GetProcessHeap(), 0, dwLength); if (!UserSid) { DPRINT1("HeapAlloc() failed\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); goto cleanup; } if (!GetTokenInformation(hToken, TokenUser, UserSid, dwLength, &dwLength)) { DPRINT1("GetTokenInformation() failed\n"); goto cleanup; } /* Get user name */ do { if (UserNameLength > 0) { HeapFree(GetProcessHeap(), 0, UserName); UserName = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, UserNameLength * sizeof(WCHAR)); if (!UserName) { DPRINT1("HeapAlloc() failed\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); goto cleanup; } } if (DomainLength > 0) { HeapFree(GetProcessHeap(), 0, Domain); Domain = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, DomainLength * sizeof(WCHAR)); if (!Domain) { DPRINT1("HeapAlloc() failed\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); goto cleanup; } } ret = LookupAccountSidW(NULL, UserSid->User.Sid, UserName, &UserNameLength, Domain, &DomainLength, &AccountType); } while (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER); if (!ret) { DPRINT1("LookupAccountSidW() failed\n"); goto cleanup; } /* Create profile */ /* FIXME: ignore Domain? */ DPRINT("UserName %S, Domain %S\n", UserName, Domain); ret = CreateUserProfileW(UserSid->User.Sid, UserName); if (!ret) { DPRINT1("CreateUserProfileW() failed\n"); goto cleanup; } } /* Get user SID string */ ret = GetUserSidFromToken(hToken, &SidString); if (!ret) { DPRINT1("GetUserSidFromToken() failed\n"); goto cleanup; } ret = FALSE; /* Acquire restore privilege */ if (!AcquireRemoveRestorePrivilege(TRUE)) { DPRINT1("AcquireRemoveRestorePrivilege() failed (Error %ld)\n", GetLastError()); goto cleanup; } /* Load user registry hive */ Error = RegLoadKeyW(HKEY_USERS, SidString.Buffer, szUserHivePath); AcquireRemoveRestorePrivilege(FALSE); if (Error != ERROR_SUCCESS) { DPRINT1("RegLoadKeyW() failed (Error %ld)\n", Error); SetLastError((DWORD)Error); goto cleanup; } /* Open future HKEY_CURRENT_USER */ Error = RegOpenKeyExW(HKEY_USERS, SidString.Buffer, 0, MAXIMUM_ALLOWED, (PHKEY)&lpProfileInfo->hProfile); if (Error != ERROR_SUCCESS) { DPRINT1("RegOpenKeyExW() failed (Error %ld)\n", Error); SetLastError((DWORD)Error); goto cleanup; } ret = TRUE; cleanup: HeapFree(GetProcessHeap(), 0, UserSid); HeapFree(GetProcessHeap(), 0, UserName); HeapFree(GetProcessHeap(), 0, Domain); RtlFreeUnicodeString(&SidString); DPRINT("LoadUserProfileW() done\n"); return ret; }