From f2d0f12dc0f4dc8d7f207eb148237025a0a8a7fb Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 9 Jun 2007 23:17:33 +0000 Subject: [PATCH] Add a user manager control panel application since the 0.3.2 release has been canceled. svn path=/trunk/; revision=27097 --- reactos/dll/cpl/cpl.rbuild | 3 + reactos/dll/cpl/usrmgr/extra.c | 33 ++++ reactos/dll/cpl/usrmgr/groups.c | 185 ++++++++++++++++++ reactos/dll/cpl/usrmgr/lang/en-US.rc | 90 +++++++++ reactos/dll/cpl/usrmgr/resource.h | 55 ++++++ reactos/dll/cpl/usrmgr/resources/applet.ico | Bin 0 -> 17542 bytes reactos/dll/cpl/usrmgr/users.c | 200 ++++++++++++++++++++ reactos/dll/cpl/usrmgr/usrmgr.c | 123 ++++++++++++ reactos/dll/cpl/usrmgr/usrmgr.def | 6 + reactos/dll/cpl/usrmgr/usrmgr.h | 34 ++++ reactos/dll/cpl/usrmgr/usrmgr.rbuild | 24 +++ reactos/dll/cpl/usrmgr/usrmgr.rc | 17 ++ 12 files changed, 770 insertions(+) create mode 100644 reactos/dll/cpl/usrmgr/extra.c create mode 100644 reactos/dll/cpl/usrmgr/groups.c create mode 100644 reactos/dll/cpl/usrmgr/lang/en-US.rc create mode 100644 reactos/dll/cpl/usrmgr/resource.h create mode 100644 reactos/dll/cpl/usrmgr/resources/applet.ico create mode 100644 reactos/dll/cpl/usrmgr/users.c create mode 100644 reactos/dll/cpl/usrmgr/usrmgr.c create mode 100644 reactos/dll/cpl/usrmgr/usrmgr.def create mode 100644 reactos/dll/cpl/usrmgr/usrmgr.h create mode 100644 reactos/dll/cpl/usrmgr/usrmgr.rbuild create mode 100644 reactos/dll/cpl/usrmgr/usrmgr.rc diff --git a/reactos/dll/cpl/cpl.rbuild b/reactos/dll/cpl/cpl.rbuild index 90af08b7f8b..55dae51aec4 100644 --- a/reactos/dll/cpl/cpl.rbuild +++ b/reactos/dll/cpl/cpl.rbuild @@ -37,3 +37,6 @@ + + + diff --git a/reactos/dll/cpl/usrmgr/extra.c b/reactos/dll/cpl/usrmgr/extra.c new file mode 100644 index 00000000000..048df172a1e --- /dev/null +++ b/reactos/dll/cpl/usrmgr/extra.c @@ -0,0 +1,33 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS User Manager Control Panel + * FILE: dll/cpl/usrmgr/extra.c + * PURPOSE: Extra property page + * + * PROGRAMMERS: Eric Kohl + */ + +#include "usrmgr.h" + +INT_PTR CALLBACK +ExtraPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + UNREFERENCED_PARAMETER(lParam); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(hwndDlg); + + switch (uMsg) + { + case WM_INITDIALOG: + break; + + case WM_COMMAND: + break; + } + + return FALSE; +} diff --git a/reactos/dll/cpl/usrmgr/groups.c b/reactos/dll/cpl/usrmgr/groups.c new file mode 100644 index 00000000000..fbb3475e268 --- /dev/null +++ b/reactos/dll/cpl/usrmgr/groups.c @@ -0,0 +1,185 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS User Manager Control Panel + * FILE: dll/cpl/usrmgr/groups.c + * PURPOSE: Groups property page + * + * PROGRAMMERS: Eric Kohl + */ + +#include "usrmgr.h" + +typedef struct _GROUP_DATA +{ + HMENU hPopupMenu; + + INT iCurrentItem; + +} GROUP_DATA, *PGROUP_DATA; + + +static VOID +SetGroupsListColumns(HWND hwndListView) +{ + LV_COLUMN column; + RECT rect; + TCHAR szStr[32]; + + GetClientRect(hwndListView, &rect); + + memset(&column, 0x00, sizeof(column)); + column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; + column.fmt=LVCFMT_LEFT; + column.cx = (INT)((rect.right - rect.left) * 0.40); + column.iSubItem = 0; + LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0])); + column.pszText = szStr; + (void)ListView_InsertColumn(hwndListView, 0, &column); + + column.cx = (INT)((rect.right - rect.left) * 0.60); + column.iSubItem = 1; + LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0])); + column.pszText = szStr; + (void)ListView_InsertColumn(hwndListView, 1, &column); +} + + +static VOID +UpdateGroupsList(HWND hwndListView) +{ + NET_API_STATUS netStatus; + PLOCALGROUP_INFO_1 pBuffer; + DWORD entriesread; + DWORD totalentries; + DWORD resume_handle = 0; + DWORD i; + + LV_ITEM lvi; + INT iItem; + + + for (;;) + { + netStatus = NetLocalGroupEnum(NULL, 1, (LPBYTE*)&pBuffer, + 1024, &entriesread, + &totalentries, &resume_handle); + if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA) + break; + + for (i = 0; i < entriesread; i++) + { + memset(&lvi, 0x00, sizeof(lvi)); + lvi.mask = LVIF_TEXT | LVIF_STATE; // | LVIF_PARAM; +// lvi.lParam = (LPARAM)VarData; + lvi.pszText = pBuffer[i].lgrpi1_name; + lvi.state = 0; //(i == 0) ? LVIS_SELECTED : 0; + iItem = ListView_InsertItem(hwndListView, &lvi); + + ListView_SetItemText(hwndListView, iItem, 1, + pBuffer[i].lgrpi1_comment); + } + + NetApiBufferFree(&pBuffer); + + /* No more data left */ + if (netStatus != ERROR_MORE_DATA) + break; + } + +} + + +static VOID +OnInitDialog(HWND hwndDlg) +{ + HWND hwndListView; + + hwndListView = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); + + (void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT); + + SetGroupsListColumns(hwndListView); + + UpdateGroupsList(hwndListView); + +// (void)ListView_SetColumnWidth(hwndListView, 3, LVSCW_AUTOSIZE_USEHEADER); +// (void)ListView_Update(hwndListView, 0); +} + + +static VOID +OnNotify(HWND hwndDlg, PGROUP_DATA pGroupData, NMHDR *phdr) +{ + LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr; + + switch (phdr->idFrom) + { + case IDC_GROUPS_LIST: + switch(phdr->code) + { + case NM_CLICK: + pGroupData->iCurrentItem = lpnmlv->iItem; + if (lpnmlv->iItem == -1) + { + } + else + { + } + break; + + case NM_DBLCLK: + break; + + case NM_RCLICK: + ClientToScreen(GetDlgItem(hwndDlg, IDC_GROUPS_LIST), &lpnmlv->ptAction); + TrackPopupMenu(GetSubMenu(pGroupData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1), + TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL); + break; + } + break; + } +} + + +INT_PTR CALLBACK +GroupsPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PGROUP_DATA pGroupData; + + UNREFERENCED_PARAMETER(lParam); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(hwndDlg); + + + pGroupData = (PGROUP_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER); + + switch (uMsg) + { + case WM_INITDIALOG: + pGroupData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GROUP_DATA)); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGroupData); + + pGroupData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_GROUP)); + + OnInitDialog(hwndDlg); + break; + + case WM_COMMAND: + break; + + case WM_NOTIFY: + OnNotify(hwndDlg, pGroupData, (NMHDR *)lParam); + break; + + case WM_DESTROY: + DestroyMenu(pGroupData->hPopupMenu); + HeapFree(GetProcessHeap(), 0, pGroupData); + break; + } + + return FALSE; +} diff --git a/reactos/dll/cpl/usrmgr/lang/en-US.rc b/reactos/dll/cpl/usrmgr/lang/en-US.rc new file mode 100644 index 00000000000..a26cba49faf --- /dev/null +++ b/reactos/dll/cpl/usrmgr/lang/en-US.rc @@ -0,0 +1,90 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +/* + * Attention Translators: + * DO NOT TRANSLATE THESE RESOURCES YET! + */ + +/* Dialogs */ + +IDD_USERS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Users" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_GROUPS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Groups" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_EXTRA DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Extra" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "This space is intentionally left blank", IDC_STATIC, 66, 90, 112, 8 +END + + +/* Menus */ + +IDM_POPUP_GROUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "New Group...", IDM_GROUP_NEW + END + POPUP "" + BEGIN + MENUITEM "Add Member", IDM_GROUP_ADD_MEMBER + MENUITEM SEPARATOR + MENUITEM "Delete", IDM_GROUP_DELETE + MENUITEM "Rename", IDM_GROUP_RENAME + MENUITEM SEPARATOR + MENUITEM "Properties", IDM_GROUP_PROPERTIES + END +END + + +IDM_POPUP_USER MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "New User...", IDM_USER_NEW + END + POPUP "" + BEGIN + MENUITEM "Change Password", IDM_USER_CHANGE_PASSWORD + MENUITEM SEPARATOR + MENUITEM "Delete", IDM_USER_DELETE + MENUITEM "Rename", IDM_USER_RENAME + MENUITEM SEPARATOR + MENUITEM "Properties", IDM_USER_PROPERTIES + END +END + + +/* Strings */ + +STRINGTABLE +BEGIN + IDS_CPLNAME "User Accounts" + IDS_CPLDESCRIPTION "Manages Users and Groups." +END + +STRINGTABLE +BEGIN + IDS_NAME "Name" + IDS_FULLNAME "Full Name" + IDS_DESCRIPTION "Description" +END diff --git a/reactos/dll/cpl/usrmgr/resource.h b/reactos/dll/cpl/usrmgr/resource.h new file mode 100644 index 00000000000..27779466a70 --- /dev/null +++ b/reactos/dll/cpl/usrmgr/resource.h @@ -0,0 +1,55 @@ +#ifndef __CPL_USRMGR_RESOURCE_H__ +#define __CPL_USRMGR_RESOURCE_H__ + +#include + +/* metrics */ +#define PROPSHEETWIDTH 246 +#define PROPSHEETHEIGHT 228 +#define PROPSHEETPADDING 6 + +#define SYSTEM_COLUMN (18 * PROPSHEETPADDING) +#define LABELLINE(x) (((PROPSHEETPADDING + 2) * x) + (x + 2)) + +#define ICONSIZE 16 + +/* ids */ + +#define IDC_USRMGR_ICON 40 +#define IDC_USRMGR_ICON2 100 // Needed for theme compatability with Windows. + +#define IDD_USERS 100 +#define IDD_GROUPS 101 +#define IDD_EXTRA 102 + +#define IDC_USERS_LIST 200 + +#define IDC_GROUPS_LIST 300 + +#define IDC_STATIC -1 + + +#define IDS_CPLNAME 2000 +#define IDS_CPLDESCRIPTION 2001 + +#define IDS_NAME 2100 +#define IDS_FULLNAME 2101 +#define IDS_DESCRIPTION 2102 + +/* Menus */ +#define IDM_POPUP_GROUP 120 +#define IDM_GROUP_ADD_MEMBER 121 +#define IDM_GROUP_NEW 122 +#define IDM_GROUP_DELETE 123 +#define IDM_GROUP_RENAME 124 +#define IDM_GROUP_PROPERTIES 125 + +#define IDM_POPUP_USER 130 +#define IDM_USER_CHANGE_PASSWORD 131 +#define IDM_USER_NEW 132 +#define IDM_USER_DELETE 133 +#define IDM_USER_RENAME 134 +#define IDM_USER_PROPERTIES 135 + +#endif /* __CPL_USRMGR_RESOURCE_H__ */ + diff --git a/reactos/dll/cpl/usrmgr/resources/applet.ico b/reactos/dll/cpl/usrmgr/resources/applet.ico new file mode 100644 index 0000000000000000000000000000000000000000..9a20e3261377dda49974b1c84485b1ac09d72363 GIT binary patch literal 17542 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 Is|Le=0*L6!i2wiq literal 0 HcmV?d00001 diff --git a/reactos/dll/cpl/usrmgr/users.c b/reactos/dll/cpl/usrmgr/users.c new file mode 100644 index 00000000000..f0d60ad492d --- /dev/null +++ b/reactos/dll/cpl/usrmgr/users.c @@ -0,0 +1,200 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS User Manager Control Panel + * FILE: dll/cpl/usrmgr/users.c + * PURPOSE: Users property page + * + * PROGRAMMERS: Eric Kohl + */ + +#include "usrmgr.h" + + +typedef struct _USER_DATA +{ + HMENU hPopupMenu; + + INT iCurrentItem; + +} USER_DATA, *PUSER_DATA; + + +static VOID +SetUsersListColumns(HWND hwndListView) +{ + LV_COLUMN column; + RECT rect; + TCHAR szStr[32]; + + GetClientRect(hwndListView, &rect); + + memset(&column, 0x00, sizeof(column)); + column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; + column.fmt=LVCFMT_LEFT; + column.cx = (INT)((rect.right - rect.left) * 0.25); + column.iSubItem = 0; + LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0])); + column.pszText = szStr; + (void)ListView_InsertColumn(hwndListView, 0, &column); + + column.cx = (INT)((rect.right - rect.left) * 0.50); + column.iSubItem = 1; + LoadString(hApplet, IDS_FULLNAME, szStr, sizeof(szStr) / sizeof(szStr[0])); + column.pszText = szStr; + (void)ListView_InsertColumn(hwndListView, 1, &column); + + column.cx = (INT)((rect.right - rect.left) * 0.25); + column.iSubItem = 2; + LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0])); + column.pszText = szStr; + (void)ListView_InsertColumn(hwndListView, 2, &column); +} + + +static VOID +UpdateUsersList(HWND hwndListView) +{ + NET_API_STATUS netStatus; + PUSER_INFO_20 pBuffer; + DWORD entriesread; + DWORD totalentries; + DWORD resume_handle = 0; + DWORD i; + + LV_ITEM lvi; + INT iItem; + + + for (;;) + { + netStatus = NetUserEnum(NULL, 20, FILTER_NORMAL_ACCOUNT, + (LPBYTE*)&pBuffer, + 1024, &entriesread, + &totalentries, &resume_handle); + if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA) + break; + + for (i = 0; i < entriesread; i++) + { + memset(&lvi, 0x00, sizeof(lvi)); + lvi.mask = LVIF_TEXT | LVIF_STATE; // | LVIF_PARAM; +// lvi.lParam = (LPARAM)VarData; + lvi.pszText = pBuffer[i].usri20_name; + lvi.state = 0; //(i == 0) ? LVIS_SELECTED : 0; + iItem = ListView_InsertItem(hwndListView, &lvi); + + ListView_SetItemText(hwndListView, iItem, 1, + pBuffer[i].usri20_full_name); + + ListView_SetItemText(hwndListView, iItem, 2, + pBuffer[i].usri20_comment); + } + + NetApiBufferFree(&pBuffer); + + /* No more data left */ + if (netStatus != ERROR_MORE_DATA) + break; + } + +} + + +static VOID +OnInitDialog(HWND hwndDlg) +{ + HWND hwndListView; + + /* Set user environment variables */ + hwndListView = GetDlgItem(hwndDlg, IDC_USERS_LIST); + + (void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT); + + SetUsersListColumns(hwndListView); + + UpdateUsersList(hwndListView); + +// (void)ListView_SetColumnWidth(hwndListView, 3, LVSCW_AUTOSIZE_USEHEADER); +// (void)ListView_Update(hwndListView, 0); +} + + +static VOID +OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr) +{ + LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr; + + switch (phdr->idFrom) + { + case IDC_USERS_LIST: + switch(phdr->code) + { + case NM_CLICK: + pUserData->iCurrentItem = lpnmlv->iItem; + if (lpnmlv->iItem == -1) + { + } + else + { + } + break; + + case NM_DBLCLK: + break; + + case NM_RCLICK: + ClientToScreen(GetDlgItem(hwndDlg, IDC_USERS_LIST), &lpnmlv->ptAction); + TrackPopupMenu(GetSubMenu(pUserData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1), + TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL); + break; + } + break; + } +} + + +INT_PTR CALLBACK +UsersPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PUSER_DATA pUserData; + + UNREFERENCED_PARAMETER(wParam); + + pUserData = (PUSER_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER); + + switch (uMsg) + { + case WM_INITDIALOG: + pUserData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(USER_DATA)); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pUserData); + + pUserData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_USER)); + + OnInitDialog(hwndDlg); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDM_USER_PROPERTIES: + MessageBeep(-1); + break; + } + break; + + case WM_NOTIFY: + OnNotify(hwndDlg, pUserData, (NMHDR *)lParam); + break; + + case WM_DESTROY: + DestroyMenu(pUserData->hPopupMenu); + HeapFree(GetProcessHeap(), 0, pUserData); + break; + } + + return FALSE; +} diff --git a/reactos/dll/cpl/usrmgr/usrmgr.c b/reactos/dll/cpl/usrmgr/usrmgr.c new file mode 100644 index 00000000000..e04aebae5ea --- /dev/null +++ b/reactos/dll/cpl/usrmgr/usrmgr.c @@ -0,0 +1,123 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS User Manager Control Panel + * FILE: dll/cpl/usrmgr/extra.c + * PURPOSE: Main functions + * + * PROGRAMMERS: Eric Kohl + */ + +#include "usrmgr.h" + +#define NUM_APPLETS 1 + +LONG APIENTRY UsrmgrApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam); + +HINSTANCE hApplet = 0; + +/* Applets */ +APPLET Applets[NUM_APPLETS] = +{ + { + IDC_USRMGR_ICON, + IDS_CPLNAME, + IDS_CPLDESCRIPTION, + UsrmgrApplet + } +}; + + +static VOID +InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) +{ + ZeroMemory(psp, sizeof(PROPSHEETPAGE)); + psp->dwSize = sizeof(PROPSHEETPAGE); + psp->dwFlags = PSP_DEFAULT; + psp->hInstance = hApplet; + psp->pszTemplate = MAKEINTRESOURCE(idDlg); + psp->pfnDlgProc = DlgProc; +} + + +/* Display Applet */ +LONG APIENTRY +UsrmgrApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam) +{ + PROPSHEETPAGE psp[3]; + PROPSHEETHEADER psh; + TCHAR Caption[1024]; + + UNREFERENCED_PARAMETER(lParam); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(uMsg); + UNREFERENCED_PARAMETER(hwnd); + + LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR)); + + ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_PROPSHEETPAGE; + psh.hwndParent = NULL; + psh.hInstance = hApplet; + psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_USRMGR_ICON)); + psh.pszCaption = Caption; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); + psh.nStartPage = 0; + psh.ppsp = psp; + + InitPropSheetPage(&psp[0], IDD_USERS, (DLGPROC)UsersPageProc); + InitPropSheetPage(&psp[1], IDD_GROUPS, (DLGPROC)GroupsPageProc); + InitPropSheetPage(&psp[2], IDD_EXTRA, (DLGPROC)ExtraPageProc); + + return (LONG)(PropertySheet(&psh) != -1); +} + + +/* Control Panel Callback */ +LONG CALLBACK +CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2) +{ + int i = (int)lParam1; + + switch (uMsg) + { + case CPL_INIT: + return TRUE; + + case CPL_GETCOUNT: + return NUM_APPLETS; + + case CPL_INQUIRE: + { + CPLINFO *CPlInfo = (CPLINFO*)lParam2; + CPlInfo->lData = 0; + CPlInfo->idIcon = Applets[i].idIcon; + CPlInfo->idName = Applets[i].idName; + CPlInfo->idInfo = Applets[i].idDescription; + } + break; + + case CPL_DBLCLK: + Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); + break; + } + + return FALSE; +} + + +BOOL WINAPI +DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) +{ + UNREFERENCED_PARAMETER(lpvReserved); + + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + hApplet = hinstDLL; + break; + } + + return TRUE; +} diff --git a/reactos/dll/cpl/usrmgr/usrmgr.def b/reactos/dll/cpl/usrmgr/usrmgr.def new file mode 100644 index 00000000000..f7876b55592 --- /dev/null +++ b/reactos/dll/cpl/usrmgr/usrmgr.def @@ -0,0 +1,6 @@ +LIBRARY usrmgr.cpl + +EXPORTS +CPlApplet + +; EOF diff --git a/reactos/dll/cpl/usrmgr/usrmgr.h b/reactos/dll/cpl/usrmgr/usrmgr.h new file mode 100644 index 00000000000..8192fa58cea --- /dev/null +++ b/reactos/dll/cpl/usrmgr/usrmgr.h @@ -0,0 +1,34 @@ +#ifndef __CPL_DESK_H__ +#define __CPL_DESK_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "resource.h" + +typedef struct _APPLET +{ + int idIcon; + int idName; + int idDescription; + APPLET_PROC AppletProc; +} APPLET, *PAPPLET; + +extern HINSTANCE hApplet; + + +INT_PTR CALLBACK UsersPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK GroupsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK ExtraPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + + +#endif /* __CPL_DESK_H__ */ + diff --git a/reactos/dll/cpl/usrmgr/usrmgr.rbuild b/reactos/dll/cpl/usrmgr/usrmgr.rbuild new file mode 100644 index 00000000000..def4b7fff07 --- /dev/null +++ b/reactos/dll/cpl/usrmgr/usrmgr.rbuild @@ -0,0 +1,24 @@ + + + . + + + + + 0x600 + 0x501 + + + kernel32 + user32 + gdi32 + comctl32 + ntdll + netapi32 + msvcrt + extra.c + groups.c + users.c + usrmgr.c + usrmgr.rc + diff --git a/reactos/dll/cpl/usrmgr/usrmgr.rc b/reactos/dll/cpl/usrmgr/usrmgr.rc new file mode 100644 index 00000000000..2116290a6f9 --- /dev/null +++ b/reactos/dll/cpl/usrmgr/usrmgr.rc @@ -0,0 +1,17 @@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS User Manager Panel\0" +#define REACTOS_STR_INTERNAL_NAME "usrmgr\0" +#define REACTOS_STR_ORIGINAL_FILENAME "usrmgr.cpl\0" + +#include + +IDC_USRMGR_ICON ICON "resources/applet.ico" +IDC_USRMGR_ICON2 ICON "resources/applet.ico" + + +#include "lang/en-US.rc"