https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6ce2ca540b8755ce214360...
commit 6ce2ca540b8755ce2143601b25327284f4f95936 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sat Jun 2 16:11:10 2018 +0200 Commit: Eric Kohl eric.kohl@reactos.org CommitDate: Sat Jun 2 16:11:50 2018 +0200
[SYSDM] Improvements to the user profile page
- Store the full profile user name in the listview item for later use in the delete and copy functions. - Change the button state according to the selected profile. - Fix some hard-coded string sizes. --- dll/cpl/sysdm/userprofile.c | 193 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 150 insertions(+), 43 deletions(-)
diff --git a/dll/cpl/sysdm/userprofile.c b/dll/cpl/sysdm/userprofile.c index 203505cbef..e0868a8fbb 100644 --- a/dll/cpl/sysdm/userprofile.c +++ b/dll/cpl/sysdm/userprofile.c @@ -14,6 +14,7 @@
typedef struct _PROFILEDATA { + BOOL bMyProfile; PWSTR pszFullName; } PROFILEDATA, *PPROFILEDATA;
@@ -34,43 +35,45 @@ SetListViewColumns(HWND hwndListView) column.fmt = LVCFMT_LEFT; column.cx = (INT)((rect.right - rect.left) * 0.40); column.iSubItem = 0; - LoadString(hApplet, IDS_USERPROFILE_NAME, szStr, 32); + LoadString(hApplet, IDS_USERPROFILE_NAME, szStr, ARRAYSIZE(szStr)); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 0, &column);
column.fmt = LVCFMT_RIGHT; column.cx = (INT)((rect.right - rect.left) * 0.15); column.iSubItem = 1; - LoadString(hApplet, IDS_USERPROFILE_SIZE, szStr, 32); + LoadString(hApplet, IDS_USERPROFILE_SIZE, szStr, ARRAYSIZE(szStr)); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 1, &column);
column.fmt = LVCFMT_LEFT; column.cx = (INT)((rect.right - rect.left) * 0.15); column.iSubItem = 2; - LoadString(hApplet, IDS_USERPROFILE_TYPE, szStr, 32); + LoadString(hApplet, IDS_USERPROFILE_TYPE, szStr, ARRAYSIZE(szStr)); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 2, &column);
column.fmt = LVCFMT_LEFT; column.cx = (INT)((rect.right - rect.left) * 0.15); column.iSubItem = 3; - LoadString(hApplet, IDS_USERPROFILE_STATUS, szStr, 32); + LoadString(hApplet, IDS_USERPROFILE_STATUS, szStr, ARRAYSIZE(szStr)); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 3, &column);
column.fmt = LVCFMT_LEFT; column.cx = (INT)((rect.right - rect.left) * 0.15) - GetSystemMetrics(SM_CYHSCROLL); column.iSubItem = 4; - LoadString(hApplet, IDS_USERPROFILE_MODIFIED, szStr, 32); + LoadString(hApplet, IDS_USERPROFILE_MODIFIED, szStr, ARRAYSIZE(szStr)); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 4, &column); }
static VOID -AddUserProfile(HWND hwndListView, - LPTSTR lpProfileSid) +AddUserProfile( + _In_ HWND hwndListView, + _In_ LPTSTR lpProfileSid, + _In_ PSID pMySid) { PPROFILEDATA pProfileData = NULL; PWSTR pszAccountName = NULL; @@ -129,25 +132,25 @@ AddUserProfile(HWND hwndListView, if (pProfileData == NULL) goto done;
+ pProfileData->bMyProfile = EqualSid(pMySid, pSid); + ptr = (PWSTR)((ULONG_PTR)pProfileData + sizeof(PROFILEDATA)); pProfileData->pszFullName = ptr;
wsprintf(pProfileData->pszFullName, L"%s\%s", pszDomainName, pszAccountName);
memset(&lvi, 0x00, sizeof(lvi)); - lvi.mask = LVIF_TEXT | LVIF_STATE; + lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; lvi.pszText = pProfileData->pszFullName; lvi.state = 0; + lvi.lParam = (LPARAM)pProfileData; ListView_InsertItem(hwndListView, &lvi);
done: - if (pProfileData == NULL) - HeapFree(GetProcessHeap(), 0, pProfileData); - - if (pszDomainName == NULL) + if (pszDomainName != NULL) HeapFree(GetProcessHeap(), 0, pszDomainName);
- if (pszAccountName == NULL) + if (pszAccountName != NULL) HeapFree(GetProcessHeap(), 0, pszAccountName);
if (pSid != NULL) @@ -158,36 +161,64 @@ done: static VOID AddUserProfiles(HWND hwndListView) { - HKEY hKeyUserProfiles; + HKEY hKeyUserProfiles = INVALID_HANDLE_VALUE; DWORD dwIndex; - TCHAR szProfileSid[64]; + WCHAR szProfileSid[64]; DWORD dwSidLength; FILETIME ftLastWrite; + DWORD dwSize; + HANDLE hToken = NULL; + PTOKEN_USER pTokenUser = NULL;
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - _T("Software\Microsoft\Windows NT\CurrentVersion\ProfileList"), - 0, - KEY_READ, - &hKeyUserProfiles)) + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) return;
+ GetTokenInformation(hToken, TokenUser, NULL, 0, &dwSize); + if (dwSize == 0) + goto done; + + pTokenUser = HeapAlloc(GetProcessHeap(), 0, dwSize); + if (pTokenUser == NULL) + goto done; + + if (!GetTokenInformation(hToken, TokenUser, pTokenUser, dwSize, &dwSize)) + goto done; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"Software\Microsoft\Windows NT\CurrentVersion\ProfileList", + 0, + KEY_READ, + &hKeyUserProfiles)) + goto done; + for (dwIndex = 0; ; dwIndex++) { - dwSidLength = 64; - if (RegEnumKeyEx(hKeyUserProfiles, - dwIndex, - szProfileSid, - &dwSidLength, - NULL, - NULL, - NULL, - &ftLastWrite)) + dwSidLength = ARRAYSIZE(szProfileSid); + if (RegEnumKeyExW(hKeyUserProfiles, + dwIndex, + szProfileSid, + &dwSidLength, + NULL, + NULL, + NULL, + &ftLastWrite)) break;
- AddUserProfile(hwndListView, szProfileSid); + AddUserProfile(hwndListView, szProfileSid, pTokenUser->User.Sid); }
- RegCloseKey(hKeyUserProfiles); + if (ListView_GetItemCount(hwndListView) != 0) + ListView_SetItemState(hwndListView, 0, LVIS_SELECTED, LVIS_SELECTED); + +done: + if (hKeyUserProfiles != INVALID_HANDLE_VALUE) + RegCloseKey(hKeyUserProfiles); + + if (pTokenUser != NULL) + HeapFree(GetProcessHeap(), 0, pTokenUser); + + if (hToken != NULL) + CloseHandle(hToken); }
@@ -208,6 +239,80 @@ OnInitUserProfileDialog(HWND hwndDlg) }
+static +VOID +OnDestroy( + _In_ HWND hwndDlg) +{ + HWND hwndList; + INT nItems, i; + LVITEM Item; + + hwndList = GetDlgItem(hwndDlg, IDC_USERPROFILE_LIST); + + nItems = ListView_GetItemCount(hwndList); + for (i = 0; i < nItems; i++) + { + Item.iItem = i; + Item.iSubItem = 0; + if (ListView_GetItem(hwndList, &Item)) + { + if (Item.lParam != 0) + HeapFree(GetProcessHeap(), 0, (PVOID)Item.lParam); + } + } +} + + +static +VOID +OnNotify( + _In_ HWND hwndDlg, + _In_ NMHDR *nmhdr) +{ + if (nmhdr->idFrom == IDC_USERACCOUNT_LINK && nmhdr->code == NM_CLICK) + { + ShellExecuteW(hwndDlg, NULL, L"usrmgr.cpl", NULL, NULL, 0); + } + else if (nmhdr->idFrom == IDC_USERPROFILE_LIST && nmhdr->code == LVN_ITEMCHANGED) + { + if (ListView_GetSelectedCount(nmhdr->hwndFrom) == 0) + { + EnableWindow(GetDlgItem(hwndDlg, IDC_USERPROFILE_CHANGE), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_USERPROFILE_DELETE), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_USERPROFILE_COPY), FALSE); + } + else + { + LVITEM Item; + INT iSelected; + BOOL bMyProfile = FALSE; + + iSelected = ListView_GetNextItem(nmhdr->hwndFrom, -1, LVNI_SELECTED); + if (iSelected != -1) + { + Item.iItem = iSelected; + Item.iSubItem = 0; + if (ListView_GetItem(nmhdr->hwndFrom, &Item)) + { + if (Item.lParam != 0) + { + bMyProfile = ((PPROFILEDATA)Item.lParam)->bMyProfile; + } + } + } + + EnableWindow(GetDlgItem(hwndDlg, IDC_USERPROFILE_CHANGE), TRUE); + if (IsUserAnAdmin() && !bMyProfile) + { + EnableWindow(GetDlgItem(hwndDlg, IDC_USERPROFILE_DELETE), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_USERPROFILE_COPY), TRUE); + } + } + } +} + + /* Property page dialog callback */ INT_PTR CALLBACK UserProfileDlgProc(HWND hwndDlg, @@ -221,25 +326,27 @@ UserProfileDlgProc(HWND hwndDlg, OnInitUserProfileDialog(hwndDlg); break;
+ case WM_DESTROY: + OnDestroy(hwndDlg); + break; + case WM_COMMAND: - if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) + switch (LOWORD(wParam)) { - EndDialog(hwndDlg, - LOWORD(wParam)); - return TRUE; + case IDOK: + case IDCANCEL: + EndDialog(hwndDlg, + LOWORD(wParam)); + return TRUE; + + case IDC_USERPROFILE_DELETE: + break; } break;
case WM_NOTIFY: - { - NMHDR *nmhdr = (NMHDR *)lParam; - - if (nmhdr->idFrom == IDC_USERACCOUNT_LINK && nmhdr->code == NM_CLICK) - { - ShellExecuteW(hwndDlg, NULL, L"usrmgr.cpl", NULL, NULL, 0); - } + OnNotify(hwndDlg, (NMHDR *)lParam); break; - } }
return FALSE;