mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 18:02:56 +00:00
[USERENV] Implement CopySystemProfile Part 1 (Add a new profile subkey and values to the profile list)
CORE-12541
This commit is contained in:
parent
d65c0d5ada
commit
334fe302a1
3 changed files with 108 additions and 2 deletions
|
@ -106,6 +106,111 @@ AcquireRemoveRestorePrivilege(IN BOOL bAcquire)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
CopySystemProfile(
|
||||||
|
IN ULONG Unused)
|
||||||
|
{
|
||||||
|
WCHAR szKeyName[MAX_PATH];
|
||||||
|
WCHAR szImagePath[MAX_PATH];
|
||||||
|
UNICODE_STRING SidString = {0, 0, NULL};
|
||||||
|
HANDLE hToken = NULL;
|
||||||
|
PSID pUserSid = NULL;
|
||||||
|
HKEY hProfileKey = NULL;
|
||||||
|
DWORD dwDisposition;
|
||||||
|
BOOL bResult = FALSE;
|
||||||
|
DWORD dwError;
|
||||||
|
|
||||||
|
DPRINT1("CopySystemProfile()\n");
|
||||||
|
|
||||||
|
if (!OpenProcessToken(GetCurrentProcess(),
|
||||||
|
TOKEN_QUERY | TOKEN_IMPERSONATE,
|
||||||
|
&hToken))
|
||||||
|
{
|
||||||
|
DPRINT1("Failed to open the process token (Error %lu)\n", GetLastError());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pUserSid = GetUserSid(hToken);
|
||||||
|
if (pUserSid == NULL)
|
||||||
|
{
|
||||||
|
DPRINT1("Failed to get the users SID (Error %lu)\n", GetLastError());
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the user SID string */
|
||||||
|
if (!GetUserSidStringFromToken(hToken, &SidString))
|
||||||
|
{
|
||||||
|
DPRINT1("GetUserSidStringFromToken() failed\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringCbCopyW(szKeyName, sizeof(szKeyName),
|
||||||
|
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\");
|
||||||
|
StringCbCatW(szKeyName, sizeof(szKeyName), SidString.Buffer);
|
||||||
|
|
||||||
|
RtlFreeUnicodeString(&SidString);
|
||||||
|
|
||||||
|
dwError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
|
||||||
|
szKeyName,
|
||||||
|
0, NULL, 0,
|
||||||
|
KEY_WRITE,
|
||||||
|
NULL,
|
||||||
|
&hProfileKey,
|
||||||
|
&dwDisposition);
|
||||||
|
if (dwError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT1("Failed to create the profile key for the %s profile (Error %lu)\n",
|
||||||
|
SidString.Buffer, dwError);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
dwError = RegSetValueExW(hProfileKey,
|
||||||
|
L"Sid",
|
||||||
|
0,
|
||||||
|
REG_BINARY,
|
||||||
|
(PBYTE)pUserSid,
|
||||||
|
RtlLengthSid(pUserSid));
|
||||||
|
if (dwError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT1("Failed to set the SID value (Error %lu)\n", dwError);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
wcscpy(szImagePath,
|
||||||
|
L"%systemroot%\\system32\\config\\systemprofile");
|
||||||
|
|
||||||
|
dwError = RegSetValueExW(hProfileKey,
|
||||||
|
L"ProfileImagePath",
|
||||||
|
0,
|
||||||
|
REG_EXPAND_SZ,
|
||||||
|
(PBYTE)szImagePath,
|
||||||
|
(wcslen(szImagePath) + 1) * sizeof(WCHAR));
|
||||||
|
if (dwError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT1("Failed to set the ProfileImagePath value (Error %lu)\n", dwError);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bResult = TRUE;
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (hProfileKey != NULL)
|
||||||
|
RegCloseKey(hProfileKey);
|
||||||
|
|
||||||
|
RtlFreeUnicodeString(&SidString);
|
||||||
|
|
||||||
|
if (pUserSid != NULL)
|
||||||
|
LocalFree(pUserSid);
|
||||||
|
|
||||||
|
if (hToken != NULL)
|
||||||
|
CloseHandle(hToken);
|
||||||
|
|
||||||
|
return bResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
CreateUserProfileA(
|
CreateUserProfileA(
|
||||||
|
@ -1030,7 +1135,7 @@ GetUserProfileDirectoryW(
|
||||||
szImagePath,
|
szImagePath,
|
||||||
ARRAYSIZE(szImagePath)))
|
ARRAYSIZE(szImagePath)))
|
||||||
{
|
{
|
||||||
DPRINT1 ("Error: %lu\n", GetLastError());
|
DPRINT1("Error: %lu\n", GetLastError());
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@
|
||||||
152 stub -noname IsSyncForegroundPolicyRefresh #stdcall -noname IsSyncForegroundPolicyRefresh(8)
|
152 stub -noname IsSyncForegroundPolicyRefresh #stdcall -noname IsSyncForegroundPolicyRefresh(8)
|
||||||
153 stdcall -noname CreateUserProfileExA(ptr str str str long long)
|
153 stdcall -noname CreateUserProfileExA(ptr str str str long long)
|
||||||
154 stdcall -noname CreateUserProfileExW(ptr wstr wstr wstr long long)
|
154 stdcall -noname CreateUserProfileExW(ptr wstr wstr wstr long long)
|
||||||
155 stub -noname CopySystemProfile #stdcall -noname CopySystemProfile(4)
|
155 stdcall -noname CopySystemProfile(long)
|
||||||
156 stub -noname GetUserProfileDirFromSidA #stdcall -noname GetUserProfileDirFromSidA(12)
|
156 stub -noname GetUserProfileDirFromSidA #stdcall -noname GetUserProfileDirFromSidA(12)
|
||||||
157 stub -noname GetUserProfileDirFromSidW #stdcall -noname GetUserProfileDirFromSidW(12)
|
157 stub -noname GetUserProfileDirFromSidW #stdcall -noname GetUserProfileDirFromSidW(12)
|
||||||
158 stub -noname SetNextFgPolicyRefreshInfo #stdcall -noname SetNextFgPolicyRefreshInfo(12)
|
158 stub -noname SetNextFgPolicyRefreshInfo #stdcall -noname SetNextFgPolicyRefreshInfo(12)
|
||||||
|
|
|
@ -106,6 +106,7 @@ BOOL WINAPI DeleteItemW (LPCWSTR, BOOL, LPCWSTR, BOOL);
|
||||||
BOOL WINAPI CopyProfileDirectoryA(LPCSTR, LPCSTR, DWORD);
|
BOOL WINAPI CopyProfileDirectoryA(LPCSTR, LPCSTR, DWORD);
|
||||||
BOOL WINAPI CopyProfileDirectoryW(LPCWSTR, LPCWSTR, DWORD);
|
BOOL WINAPI CopyProfileDirectoryW(LPCWSTR, LPCWSTR, DWORD);
|
||||||
PSID WINAPI GetUserSid(HANDLE);
|
PSID WINAPI GetUserSid(HANDLE);
|
||||||
|
BOOL WINAPI CopySystemProfile(ULONG);
|
||||||
/* end private */
|
/* end private */
|
||||||
BOOL WINAPI LoadUserProfileA (HANDLE, LPPROFILEINFOA);
|
BOOL WINAPI LoadUserProfileA (HANDLE, LPPROFILEINFOA);
|
||||||
BOOL WINAPI LoadUserProfileW (HANDLE, LPPROFILEINFOW);
|
BOOL WINAPI LoadUserProfileW (HANDLE, LPPROFILEINFOW);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue