📄 profile.c
字号:
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 = sizeof(szBuffer);
Error = RegQueryValueExW (hKey,
L"ProfilesDirectory",
NULL,
NULL,
(LPBYTE)szBuffer,
&dwLength);
if (Error != ERROR_SUCCESS)
{
DPRINT1("Error: %lu\n", Error);
RegCloseKey (hKey);
SetLastError((DWORD)Error);
return FALSE;
}
/* Expand it */
if (!ExpandEnvironmentStringsW (szBuffer,
szProfilePath,
MAX_PATH))
{
DPRINT1("Error: %lu\n", GetLastError());
RegCloseKey (hKey);
return FALSE;
}
/* Get 'DefaultUserProfile' name */
dwLength = sizeof(szBuffer);
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);
wcscat (szProfilePath, L"\\");
wcscat (szProfilePath, szBuffer);
dwLength = wcslen (szProfilePath) + 1;
if (lpProfileDir != NULL)
{
if (*lpcchSize < dwLength)
{
*lpcchSize = dwLength;
SetLastError (ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
wcscpy (lpProfileDir, szProfilePath);
}
*lpcchSize = dwLength;
return TRUE;
}
BOOL WINAPI
GetProfilesDirectoryA (LPSTR lpProfileDir,
LPDWORD lpcchSize)
{
LPWSTR lpBuffer;
BOOL bResult;
lpBuffer = GlobalAlloc (GMEM_FIXED,
*lpcchSize * sizeof(WCHAR));
if (lpBuffer == NULL)
return FALSE;
bResult = GetProfilesDirectoryW (lpBuffer,
lpcchSize);
if (bResult)
{
WideCharToMultiByte (CP_ACP,
0,
lpBuffer,
-1,
lpProfileDir,
*lpcchSize,
NULL,
NULL);
}
GlobalFree (lpBuffer);
return bResult;
}
BOOL WINAPI
GetProfilesDirectoryW (LPWSTR lpProfilesDir,
LPDWORD lpcchSize)
{
WCHAR szProfilesPath[MAX_PATH];
WCHAR szBuffer[MAX_PATH];
DWORD dwLength;
HKEY hKey;
LONG Error;
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 = sizeof(szBuffer);
Error = RegQueryValueExW (hKey,
L"ProfilesDirectory",
NULL,
NULL,
(LPBYTE)szBuffer,
&dwLength);
if (Error != ERROR_SUCCESS)
{
DPRINT1("Error: %lu\n", Error);
RegCloseKey (hKey);
SetLastError((DWORD)Error);
return FALSE;
}
RegCloseKey (hKey);
/* Expand it */
if (!ExpandEnvironmentStringsW (szBuffer,
szProfilesPath,
MAX_PATH))
{
DPRINT1("Error: %lu\n", GetLastError());
return FALSE;
}
dwLength = wcslen (szProfilesPath) + 1;
if (lpProfilesDir != NULL)
{
if (*lpcchSize < dwLength)
{
*lpcchSize = dwLength;
SetLastError (ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
wcscpy (lpProfilesDir, szProfilesPath);
}
*lpcchSize = dwLength;
return TRUE;
}
BOOL WINAPI
GetUserProfileDirectoryA (HANDLE hToken,
LPSTR lpProfileDir,
LPDWORD lpcchSize)
{
LPWSTR lpBuffer;
BOOL bResult;
lpBuffer = GlobalAlloc (GMEM_FIXED,
*lpcchSize * sizeof(WCHAR));
if (lpBuffer == NULL)
return FALSE;
bResult = GetUserProfileDirectoryW (hToken,
lpBuffer,
lpcchSize);
if (bResult)
{
WideCharToMultiByte (CP_ACP,
0,
lpBuffer,
-1,
lpProfileDir,
*lpcchSize,
NULL,
NULL);
}
GlobalFree (lpBuffer);
return bResult;
}
BOOL WINAPI
GetUserProfileDirectoryW (HANDLE hToken,
LPWSTR lpProfileDir,
LPDWORD lpcchSize)
{
UNICODE_STRING SidString;
WCHAR szKeyName[MAX_PATH];
WCHAR szRawImagePath[MAX_PATH];
WCHAR szImagePath[MAX_PATH];
DWORD dwLength;
HKEY hKey;
LONG Error;
if (!GetUserSidFromToken (hToken,
&SidString))
{
DPRINT1 ("GetUserSidFromToken() failed\n");
return FALSE;
}
DPRINT ("SidString: '%wZ'\n", &SidString);
wcscpy (szKeyName,
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\");
wcscat (szKeyName,
SidString.Buffer);
RtlFreeUnicodeString (&SidString);
DPRINT ("KeyName: '%S'\n", szKeyName);
Error = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
szKeyName,
0,
KEY_QUERY_VALUE,
&hKey);
if (Error != ERROR_SUCCESS)
{
DPRINT1 ("Error: %lu\n", Error);
SetLastError((DWORD)Error);
return FALSE;
}
dwLength = sizeof(szRawImagePath);
Error = RegQueryValueExW (hKey,
L"ProfileImagePath",
NULL,
NULL,
(LPBYTE)szRawImagePath,
&dwLength);
if (Error != ERROR_SUCCESS)
{
DPRINT1 ("Error: %lu\n", Error);
RegCloseKey (hKey);
SetLastError((DWORD)Error);
return FALSE;
}
RegCloseKey (hKey);
DPRINT ("RawImagePath: '%S'\n", szRawImagePath);
/* Expand it */
if (!ExpandEnvironmentStringsW (szRawImagePath,
szImagePath,
MAX_PATH))
{
DPRINT1 ("Error: %lu\n", GetLastError());
return FALSE;
}
DPRINT ("ImagePath: '%S'\n", szImagePath);
dwLength = wcslen (szImagePath) + 1;
if (*lpcchSize < dwLength)
{
DPRINT1 ("Buffer too small\n");
SetLastError (ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
*lpcchSize = dwLength;
wcscpy (lpProfileDir,
szImagePath);
return TRUE;
}
static BOOL
CheckForLoadedProfile (HANDLE hToken)
{
UNICODE_STRING SidString;
HKEY hKey;
DPRINT ("CheckForLoadedProfile() called \n");
if (!GetUserSidFromToken (hToken,
&SidString))
{
DPRINT1 ("GetUserSidFromToken() failed\n");
return FALSE;
}
if (RegOpenKeyExW (HKEY_USERS,
SidString.Buffer,
0,
MAXIMUM_ALLOWED,
&hKey))
{
DPRINT ("Profile not loaded\n");
RtlFreeUnicodeString (&SidString);
return FALSE;
}
RegCloseKey (hKey);
RtlFreeUnicodeString (&SidString);
DPRINT ("Profile already loaded\n");
return TRUE;
}
BOOL WINAPI
LoadUserProfileA (HANDLE hToken,
LPPROFILEINFOA lpProfileInfo)
{
DPRINT ("LoadUserProfileA() not implemented\n");
return FALSE;
}
BOOL WINAPI
LoadUserProfileW (HANDLE hToken,
LPPROFILEINFOW lpProfileInfo)
{
WCHAR szUserHivePath[MAX_PATH];
UNICODE_STRING SidString;
LONG Error;
DWORD dwLength = sizeof(szUserHivePath) / sizeof(szUserHivePath[0]);
DPRINT ("LoadUserProfileW() called\n");
/* Check profile info */
if (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 (!GetProfilesDirectoryW (szUserHivePath,
&dwLength))
{
DPRINT1("GetProfilesDirectoryW() failed\n", GetLastError());
return FALSE;
}
wcscat (szUserHivePath, L"\\");
wcscat (szUserHivePath, lpProfileInfo->lpUserName);
if (!AppendSystemPostfix (szUserHivePath, MAX_PATH))
{
DPRINT1("AppendSystemPostfix() failed\n", GetLastError());
return FALSE;
}
/* Create user hive name */
wcscat (szUserHivePath, L"\\ntuser.dat");
DPRINT ("szUserHivePath: %S\n", szUserHivePath);
if (!GetUserSidFromToken (hToken,
&SidString))
{
DPRINT1 ("GetUserSidFromToken() failed\n");
return FALSE;
}
DPRINT ("SidString: '%wZ'\n", &SidString);
Error = RegLoadKeyW (HKEY_USERS,
SidString.Buffer,
szUserHivePath);
if (Error != ERROR_SUCCESS)
{
DPRINT1 ("RegLoadKeyW() failed (Error %ld)\n", Error);
RtlFreeUnicodeString (&SidString);
SetLastError((DWORD)Error);
return FALSE;
}
Error = RegOpenKeyExW (HKEY_USERS,
SidString.Buffer,
0,
MAXIMUM_ALLOWED,
(PHKEY)&lpProfileInfo->hProfile);
if (Error != ERROR_SUCCESS)
{
DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", Error);
RtlFreeUnicodeString (&SidString);
SetLastError((DWORD)Error);
return FALSE;
}
RtlFreeUnicodeString (&SidString);
DPRINT ("LoadUserProfileW() done\n");
return TRUE;
}
BOOL WINAPI
UnloadUserProfile (HANDLE hToken,
HANDLE hProfile)
{
UNICODE_STRING SidString;
LONG Error;
DPRINT ("UnloadUserProfile() called\n");
if (hProfile == NULL)
{
DPRINT1 ("Invalide profile handle\n");
SetLastError (ERROR_INVALID_PARAMETER);
return FALSE;
}
RegCloseKey (hProfile);
if (!GetUserSidFromToken (hToken,
&SidString))
{
DPRINT1 ("GetUserSidFromToken() failed\n");
return FALSE;
}
DPRINT ("SidString: '%wZ'\n", &SidString);
Error = RegUnLoadKeyW (HKEY_USERS,
SidString.Buffer);
if (Error != ERROR_SUCCESS)
{
DPRINT1 ("RegUnLoadKeyW() failed (Error %ld)\n", Error);
RtlFreeUnicodeString (&SidString);
SetLastError((DWORD)Error);
return FALSE;
}
RtlFreeUnicodeString (&SidString);
DPRINT ("UnloadUserProfile() done\n");
return TRUE;
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -