883 lines
23 KiB
C
883 lines
23 KiB
C
|
/****************************************************************************
|
||
|
|
||
|
PROGRAM: TOKEDIT.C
|
||
|
|
||
|
PURPOSE: Displays and allows the user to edit the contents of a token
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
|
||
|
#include "PVIEWP.h"
|
||
|
#include "string.h"
|
||
|
|
||
|
|
||
|
INT_PTR APIENTRY TokenEditDlgProc(HWND, UINT, WPARAM, LPARAM);
|
||
|
INT_PTR APIENTRY MoreDlgProc(HWND, UINT, WPARAM, LPARAM);
|
||
|
BOOL TokenEditDlgInit(HWND);
|
||
|
BOOL TokenEditDlgEnd(HWND, BOOL);
|
||
|
BOOL EnablePrivilege(HWND, BOOL);
|
||
|
BOOL EnableGroup(HWND, BOOL);
|
||
|
BOOL SetDefaultOwner(HWND);
|
||
|
BOOL SetPrimaryGroup(HWND);
|
||
|
BOOL MoreDlgInit(HWND hDlg, LPARAM lParam);
|
||
|
BOOL DisplayMyToken(HWND);
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: EditToken
|
||
|
|
||
|
PURPOSE: Displays and allows the user to edit a token
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
BOOL EditToken(
|
||
|
HWND hwndParent,
|
||
|
HANDLE Token,
|
||
|
LPWSTR Name
|
||
|
)
|
||
|
{
|
||
|
DLGPROC lpProc;
|
||
|
int Result;
|
||
|
HANDLE hMyToken;
|
||
|
HANDLE Instance;
|
||
|
|
||
|
hMyToken = OpenMyToken(Token, Name);
|
||
|
if (hMyToken == NULL) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
//
|
||
|
// Get the application instance handle
|
||
|
//
|
||
|
|
||
|
Instance = (HANDLE)(NtCurrentPeb()->ImageBaseAddress);
|
||
|
ASSERT(Instance != 0);
|
||
|
|
||
|
lpProc = (DLGPROC)MakeProcInstance(TokenEditDlgProc, Instance);
|
||
|
Result = (int)DialogBoxParam(Instance,(LPSTR)IDD_MAIN, hwndParent, lpProc, (LPARAM)hMyToken);
|
||
|
FreeProcInstance(lpProc);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: TokenEditDlgProc(HWND, unsigned, WORD, LONG)
|
||
|
|
||
|
PURPOSE: Processes messages
|
||
|
|
||
|
MESSAGES:
|
||
|
|
||
|
WM_COMMAND - application menu (About dialog box)
|
||
|
WM_DESTROY - destroy window
|
||
|
|
||
|
COMMENTS:
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
INT_PTR APIENTRY TokenEditDlgProc(hDlg, message, wParam, lParam)
|
||
|
HWND hDlg;
|
||
|
UINT message;
|
||
|
WPARAM wParam;
|
||
|
LPARAM lParam;
|
||
|
{
|
||
|
DLGPROC lpProc;
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
|
||
|
switch (message) {
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
|
||
|
SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam);
|
||
|
|
||
|
if (!TokenEditDlgInit(hDlg)) {
|
||
|
// Failed to initialize dialog, get out
|
||
|
EndDialog(hDlg, FALSE);
|
||
|
}
|
||
|
|
||
|
return (TRUE);
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam)) {
|
||
|
case IDOK:
|
||
|
// we're done, drop through to quit dialog....
|
||
|
|
||
|
case IDCANCEL:
|
||
|
|
||
|
TokenEditDlgEnd(hDlg, LOWORD(wParam) == IDOK);
|
||
|
|
||
|
EndDialog(hDlg, TRUE);
|
||
|
return TRUE;
|
||
|
|
||
|
case IDB_DISABLEPRIVILEGE:
|
||
|
case IDB_ENABLEPRIVILEGE:
|
||
|
EnablePrivilege(hDlg, LOWORD(wParam) == IDB_ENABLEPRIVILEGE);
|
||
|
return(TRUE);
|
||
|
|
||
|
case IDB_DISABLEGROUP:
|
||
|
case IDB_ENABLEGROUP:
|
||
|
EnableGroup(hDlg, LOWORD(wParam) == IDB_ENABLEGROUP);
|
||
|
return(TRUE);
|
||
|
|
||
|
case IDC_DEFAULTOWNER:
|
||
|
SetDefaultOwner(hDlg);
|
||
|
return(TRUE);
|
||
|
|
||
|
case IDC_PRIMARYGROUP:
|
||
|
SetPrimaryGroup(hDlg);
|
||
|
return(TRUE);
|
||
|
|
||
|
case IDB_MORE:
|
||
|
{
|
||
|
HANDLE Instance = (HANDLE)(NtCurrentPeb()->ImageBaseAddress);
|
||
|
|
||
|
lpProc = (DLGPROC)MakeProcInstance(MoreDlgProc, Instance);
|
||
|
DialogBoxParam(Instance,(LPSTR)IDD_MORE, hDlg, lpProc, (LPARAM)hMyToken);
|
||
|
FreeProcInstance(lpProc);
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
case IDB_DEFAULT_DACL:
|
||
|
{
|
||
|
HANDLE Token = ((PMYTOKEN)hMyToken)->Token;
|
||
|
LPWSTR Name = ((PMYTOKEN)hMyToken)->Name;
|
||
|
|
||
|
EditTokenDefaultDacl(hDlg, Token, Name);
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
default:
|
||
|
// We didn't process this message
|
||
|
return FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// We didn't process this message
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
// We processed the message
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: TokenEditDlgInit(HWND)
|
||
|
|
||
|
PURPOSE: Initialises the controls in the main dialog window.
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE if dialog should be terminated.
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL TokenEditDlgInit(
|
||
|
HWND hDlg
|
||
|
)
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
WCHAR string[MAX_STRING_LENGTH];
|
||
|
HCURSOR OldCursor;
|
||
|
|
||
|
if (!LsaInit()) {
|
||
|
DbgPrint("PVIEW - LsaInit failed\n");
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
OldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
||
|
DisplayMyToken(hDlg);
|
||
|
SetCursor(OldCursor);
|
||
|
|
||
|
//
|
||
|
// Set the dialog caption appropriately
|
||
|
//
|
||
|
|
||
|
GetWindowTextW(hDlg, string, sizeof(string)/sizeof(*string));
|
||
|
lstrcatW(string, L" for <");
|
||
|
lstrcatW(string, ((PMYTOKEN)hMyToken)->Name);
|
||
|
lstrcatW(string, L">");
|
||
|
SetWindowTextW(hDlg, string);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: TokenEditDlgEnd(HWND)
|
||
|
|
||
|
PURPOSE: Do whatever we have to do to clean up when dialog ends
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure.
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL TokenEditDlgEnd(
|
||
|
HWND hDlg,
|
||
|
BOOL fSaveChanges)
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
BOOL Success;
|
||
|
|
||
|
Success = CloseMyToken(hDlg, hMyToken, fSaveChanges);
|
||
|
|
||
|
LsaTerminate();
|
||
|
|
||
|
return(Success);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: DisplayMyToken
|
||
|
|
||
|
PURPOSE: Reads data out of mytoken and puts in dialog controls.
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL DisplayMyToken(
|
||
|
HWND hDlg
|
||
|
)
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
PMYTOKEN pMyToken = (PMYTOKEN)hMyToken;
|
||
|
CHAR string[MAX_STRING_BYTES];
|
||
|
UINT GroupIndex;
|
||
|
UINT PrivIndex;
|
||
|
|
||
|
//
|
||
|
// Groups
|
||
|
//
|
||
|
if (pMyToken->Groups != NULL) {
|
||
|
|
||
|
for (GroupIndex=0; GroupIndex < pMyToken->Groups->GroupCount; GroupIndex++ ) {
|
||
|
|
||
|
PSID Sid = pMyToken->Groups->Groups[GroupIndex].Sid;
|
||
|
ULONG Attributes = pMyToken->Groups->Groups[GroupIndex].Attributes;
|
||
|
USHORT ControlID;
|
||
|
|
||
|
if (Attributes & SE_GROUP_ENABLED) {
|
||
|
ControlID = IDL_ENABLEDGROUPS;
|
||
|
} else {
|
||
|
ControlID = IDL_DISABLEDGROUPS;
|
||
|
}
|
||
|
|
||
|
if (SID2Name(Sid, string, MAX_STRING_BYTES)) {
|
||
|
|
||
|
// Add to disable or enabled group box
|
||
|
AddLBItem(hDlg, ControlID, string, GroupIndex);
|
||
|
|
||
|
// Add this group to default owner combo box if it's valid
|
||
|
if (Attributes & SE_GROUP_OWNER) {
|
||
|
AddCBItem(hDlg, IDC_DEFAULTOWNER, string, (LPARAM)Sid);
|
||
|
}
|
||
|
|
||
|
// Add this group to primary group combo box
|
||
|
AddCBItem(hDlg, IDC_PRIMARYGROUP, string, (LPARAM)Sid);
|
||
|
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert Group sid to string\n");
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
DbgPrint("PVIEW : No group info in mytoken\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// User ID
|
||
|
//
|
||
|
if (pMyToken->UserId != NULL) {
|
||
|
|
||
|
PSID Sid = pMyToken->UserId->User.Sid;
|
||
|
|
||
|
if (SID2Name(Sid, string, MAX_STRING_BYTES)) {
|
||
|
|
||
|
// Set user-name static text
|
||
|
SetDlgItemText(hDlg, IDS_USERID, string);
|
||
|
|
||
|
// Add to default owner combo box
|
||
|
AddCBItem(hDlg, IDC_DEFAULTOWNER, string, (LPARAM)Sid);
|
||
|
|
||
|
// Add to primary group combo box
|
||
|
AddCBItem(hDlg, IDC_PRIMARYGROUP, string, (LPARAM)Sid);
|
||
|
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert User ID SID to string\n");
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: No user id in mytoken\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Default Owner
|
||
|
//
|
||
|
if (pMyToken->DefaultOwner != NULL) {
|
||
|
|
||
|
PSID Sid = pMyToken->DefaultOwner->Owner;
|
||
|
|
||
|
if (SID2Name(Sid, string, MAX_STRING_BYTES)) {
|
||
|
|
||
|
INT iItem;
|
||
|
|
||
|
iItem = FindCBSid(hDlg, IDC_DEFAULTOWNER, Sid);
|
||
|
|
||
|
if (iItem >= 0) {
|
||
|
SendMessage(GetDlgItem(hDlg, IDC_DEFAULTOWNER), CB_SETCURSEL, iItem, 0);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Default Owner is not userID or one of our groups\n");
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert Default Owner SID to string\n");
|
||
|
}
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: No default owner in mytoken\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Primary group
|
||
|
//
|
||
|
|
||
|
if (pMyToken->PrimaryGroup != NULL) {
|
||
|
|
||
|
PSID Sid = pMyToken->PrimaryGroup->PrimaryGroup;
|
||
|
|
||
|
if (SID2Name(Sid, string, MAX_STRING_BYTES)) {
|
||
|
INT iItem;
|
||
|
|
||
|
iItem = FindCBSid(hDlg, IDC_PRIMARYGROUP, Sid);
|
||
|
|
||
|
if (iItem < 0) {
|
||
|
// Group is not already in combo-box, add it
|
||
|
iItem = AddCBItem(hDlg, IDC_PRIMARYGROUP, string, (LPARAM)Sid);
|
||
|
}
|
||
|
|
||
|
// Select the primary group
|
||
|
SendMessage(GetDlgItem(hDlg, IDC_PRIMARYGROUP), CB_SETCURSEL, iItem, 0);
|
||
|
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert primary group SID to string\n");
|
||
|
}
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: No primary group in mytoken\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Privileges
|
||
|
//
|
||
|
|
||
|
if (pMyToken->Privileges != NULL) {
|
||
|
|
||
|
for (PrivIndex=0; PrivIndex < pMyToken->Privileges->PrivilegeCount; PrivIndex++ ) {
|
||
|
|
||
|
LUID Privilege = pMyToken->Privileges->Privileges[PrivIndex].Luid;
|
||
|
ULONG Attributes = pMyToken->Privileges->Privileges[PrivIndex].Attributes;
|
||
|
USHORT ControlID;
|
||
|
|
||
|
if (Attributes & SE_PRIVILEGE_ENABLED) {
|
||
|
ControlID = IDL_ENABLEDPRIVILEGES;
|
||
|
} else {
|
||
|
ControlID = IDL_DISABLEDPRIVILEGES;
|
||
|
}
|
||
|
|
||
|
if (PRIV2Name(Privilege, string, MAX_STRING_BYTES)) {
|
||
|
|
||
|
// Add this privelege to the appropriate list-box
|
||
|
AddLBItem(hDlg, ControlID, string, PrivIndex);
|
||
|
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert privilege to string\n");
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: No privilege info in mytoken\n");
|
||
|
}
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: EnablePrivilege(HWND, fEnable)
|
||
|
|
||
|
PURPOSE: Enables or disables one or more privileges.
|
||
|
If fEnable = TRUE, the selected privileges in the disabled
|
||
|
privilege control are enabled.
|
||
|
Vice versa for fEnable = FALSE
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL EnablePrivilege(
|
||
|
HWND hDlg,
|
||
|
BOOL fEnable)
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
PMYTOKEN pMyToken = (PMYTOKEN)hMyToken;
|
||
|
HWND hwndFrom;
|
||
|
HWND hwndTo;
|
||
|
USHORT idFrom;
|
||
|
USHORT idTo;
|
||
|
INT cItems;
|
||
|
PINT pItems;
|
||
|
PTOKEN_PRIVILEGES Privileges;
|
||
|
|
||
|
|
||
|
Privileges = pMyToken->Privileges;
|
||
|
if (Privileges == NULL) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
// Calculate source and destination controls
|
||
|
//
|
||
|
if (fEnable) {
|
||
|
idFrom = IDL_DISABLEDPRIVILEGES;
|
||
|
idTo = IDL_ENABLEDPRIVILEGES;
|
||
|
} else {
|
||
|
idFrom = IDL_ENABLEDPRIVILEGES;
|
||
|
idTo = IDL_DISABLEDPRIVILEGES;
|
||
|
}
|
||
|
hwndFrom = GetDlgItem(hDlg, idFrom);
|
||
|
hwndTo = GetDlgItem(hDlg, idTo);
|
||
|
|
||
|
|
||
|
// Find how many items are selected
|
||
|
//
|
||
|
cItems = (INT)SendMessage(hwndFrom, LB_GETSELCOUNT, 0, 0);
|
||
|
if (cItems <= 0) {
|
||
|
// No items selected
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
// Allocate space for the item array
|
||
|
//
|
||
|
pItems = Alloc(cItems * sizeof(*pItems));
|
||
|
if (pItems == NULL) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
// Read the selected items into the array
|
||
|
//
|
||
|
cItems = (INT)SendMessage(hwndFrom, LB_GETSELITEMS, (WPARAM)cItems, (LPARAM)pItems);
|
||
|
if (cItems == LB_ERR) {
|
||
|
// Something went wrong
|
||
|
Free(pItems);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
while (cItems-- > 0) {
|
||
|
|
||
|
INT iItem;
|
||
|
UINT PrivIndex;
|
||
|
UCHAR PrivilegeName[MAX_STRING_BYTES];
|
||
|
|
||
|
iItem = pItems[cItems]; // Read the item index from the selected item array
|
||
|
|
||
|
// Read the text and data from the source item
|
||
|
//
|
||
|
PrivIndex = (UINT)SendMessage(hwndFrom, LB_GETITEMDATA, iItem, 0);
|
||
|
SendMessage(hwndFrom, LB_GETTEXT, iItem, (LPARAM)PrivilegeName);
|
||
|
|
||
|
|
||
|
// Delete item from source control
|
||
|
//
|
||
|
SendMessage(hwndFrom, LB_DELETESTRING, iItem, 0);
|
||
|
|
||
|
|
||
|
// Add privilege to destination control
|
||
|
//
|
||
|
iItem = (INT)SendMessage(hwndTo, LB_ADDSTRING, 0, (LPARAM)PrivilegeName);
|
||
|
SendMessage(hwndTo, LB_SETITEMDATA, iItem, (LPARAM)PrivIndex);
|
||
|
|
||
|
|
||
|
// Modify global data structure to reflect change
|
||
|
//
|
||
|
if (fEnable) {
|
||
|
Privileges->Privileges[PrivIndex].Attributes |= SE_PRIVILEGE_ENABLED;
|
||
|
} else {
|
||
|
Privileges->Privileges[PrivIndex].Attributes &= ~SE_PRIVILEGE_ENABLED;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Free up space allocated for selected item array
|
||
|
Free(pItems);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: EnableGroup(HWND, fEnable)
|
||
|
|
||
|
PURPOSE: Enables or disables one or more selected groups.
|
||
|
If fEnable = TRUE, the selected groups in the disabled
|
||
|
group control are enabled.
|
||
|
If fEnable = FALSE the selected groups in the enabled
|
||
|
group control are disabled.
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL EnableGroup(
|
||
|
HWND hDlg,
|
||
|
BOOL fEnable)
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
PMYTOKEN pMyToken = (PMYTOKEN)hMyToken;
|
||
|
HWND hwndFrom;
|
||
|
HWND hwndTo;
|
||
|
USHORT idFrom;
|
||
|
USHORT idTo;
|
||
|
INT cItems;
|
||
|
PINT pItems;
|
||
|
PTOKEN_GROUPS Groups;
|
||
|
|
||
|
|
||
|
Groups = pMyToken->Groups;
|
||
|
if (Groups == NULL) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
// Calculate source and destination controls
|
||
|
//
|
||
|
if (fEnable) {
|
||
|
idFrom = IDL_DISABLEDGROUPS;
|
||
|
idTo = IDL_ENABLEDGROUPS;
|
||
|
} else {
|
||
|
idFrom = IDL_ENABLEDGROUPS;
|
||
|
idTo = IDL_DISABLEDGROUPS;
|
||
|
}
|
||
|
hwndFrom = GetDlgItem(hDlg, idFrom);
|
||
|
hwndTo = GetDlgItem(hDlg, idTo);
|
||
|
|
||
|
// Find how many items are selected
|
||
|
//
|
||
|
cItems = (INT)SendMessage(hwndFrom, LB_GETSELCOUNT, 0, 0);
|
||
|
if (cItems <= 0) {
|
||
|
// No items selected
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
// Allocate space for the item array
|
||
|
//
|
||
|
pItems = Alloc(cItems * sizeof(*pItems));
|
||
|
if (pItems == NULL) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
// Read the selected items into the array
|
||
|
//
|
||
|
cItems = (INT)SendMessage(hwndFrom, LB_GETSELITEMS, (WPARAM)cItems, (LPARAM)pItems);
|
||
|
if (cItems == LB_ERR) {
|
||
|
// Something went wrong
|
||
|
Free(pItems);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
while (cItems-- > 0) {
|
||
|
|
||
|
INT iItem;
|
||
|
UINT GroupIndex;
|
||
|
UCHAR GroupName[MAX_STRING_BYTES];
|
||
|
|
||
|
iItem = pItems[cItems]; // Read the item index from the selected item array
|
||
|
|
||
|
// Read the text and data from the source item
|
||
|
//
|
||
|
GroupIndex = (UINT)SendMessage(hwndFrom, LB_GETITEMDATA, iItem, 0);
|
||
|
SendMessage(hwndFrom, LB_GETTEXT, iItem, (LPARAM)GroupName);
|
||
|
|
||
|
// Check it's not a mandatory group (Can-not be disabled)
|
||
|
//
|
||
|
if (Groups->Groups[GroupIndex].Attributes & SE_GROUP_MANDATORY) {
|
||
|
CHAR buf[256];
|
||
|
strcpy(buf, "'");
|
||
|
strcat(buf, GroupName);
|
||
|
strcat(buf, "' is a mandatory group and cannot be disabled");
|
||
|
MessageBox(hDlg, buf, NULL, MB_ICONSTOP | MB_APPLMODAL | MB_OK);
|
||
|
continue; // skip to next group
|
||
|
}
|
||
|
|
||
|
// Delete item from source control
|
||
|
//
|
||
|
SendMessage(hwndFrom, LB_DELETESTRING, iItem, 0);
|
||
|
|
||
|
|
||
|
// Add item to destination control
|
||
|
//
|
||
|
iItem = (INT)SendMessage(hwndTo, LB_ADDSTRING, 0, (LPARAM)GroupName);
|
||
|
SendMessage(hwndTo, LB_SETITEMDATA, iItem, (LONG)GroupIndex);
|
||
|
|
||
|
|
||
|
// Modify global data structure to reflect change
|
||
|
//
|
||
|
if (fEnable) {
|
||
|
Groups->Groups[GroupIndex].Attributes |= SE_GROUP_ENABLED;
|
||
|
} else {
|
||
|
Groups->Groups[GroupIndex].Attributes &= ~SE_GROUP_ENABLED;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Free up space allocated for selected item array
|
||
|
Free(pItems);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: SetDefaultOwner()
|
||
|
|
||
|
PURPOSE: Sets the default owner to the new value selected by the user.
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL SetDefaultOwner(
|
||
|
HWND hDlg)
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
PMYTOKEN pMyToken = (PMYTOKEN)hMyToken;
|
||
|
HWND hwnd;
|
||
|
INT iItem;
|
||
|
PTOKEN_OWNER DefaultOwner;
|
||
|
|
||
|
|
||
|
DefaultOwner = pMyToken->DefaultOwner;
|
||
|
if (DefaultOwner == NULL) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
hwnd = GetDlgItem(hDlg, IDC_DEFAULTOWNER);
|
||
|
|
||
|
iItem = (INT)SendMessage(hwnd, CB_GETCURSEL, 0, 0);
|
||
|
if (iItem == CB_ERR) {
|
||
|
// No selection ?
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
// Modify global data structure to reflect change
|
||
|
DefaultOwner->Owner = (PSID)SendMessage(hwnd, CB_GETITEMDATA, iItem, 0);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: SetPrimaryGroup()
|
||
|
|
||
|
PURPOSE: Sets the primary group to the new value selected by the user.
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL SetPrimaryGroup(
|
||
|
HWND hDlg)
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
PMYTOKEN pMyToken = (PMYTOKEN)hMyToken;
|
||
|
HWND hwnd;
|
||
|
INT iItem;
|
||
|
PTOKEN_PRIMARY_GROUP PrimaryGroup;
|
||
|
|
||
|
|
||
|
PrimaryGroup = pMyToken->PrimaryGroup;
|
||
|
if (PrimaryGroup == NULL) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
hwnd = GetDlgItem(hDlg, IDC_PRIMARYGROUP);
|
||
|
|
||
|
iItem = (INT)SendMessage(hwnd, CB_GETCURSEL, 0, 0);
|
||
|
if (iItem == CB_ERR) {
|
||
|
// No selection ?
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
// Modify global data structure to reflect change
|
||
|
PrimaryGroup->PrimaryGroup = (PSID)SendMessage(hwnd, CB_GETITEMDATA, iItem, 0);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: MoreDlgProc(HWND, UINT, WPARAM, LPARAM)
|
||
|
|
||
|
PURPOSE: Processes messages
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
INT_PTR APIENTRY MoreDlgProc(hDlg, message, wParam, lParam)
|
||
|
HWND hDlg;
|
||
|
UINT message;
|
||
|
WPARAM wParam;
|
||
|
LPARAM lParam;
|
||
|
{
|
||
|
HANDLE hMyToken = (HANDLE)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||
|
|
||
|
switch (message) {
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
|
||
|
if (!MoreDlgInit(hDlg, lParam)) {
|
||
|
// Failed to initialize dialog, get out
|
||
|
EndDialog(hDlg, FALSE);
|
||
|
}
|
||
|
|
||
|
return (TRUE);
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam)) {
|
||
|
case IDOK:
|
||
|
|
||
|
// we're done, drop through to quit dialog....
|
||
|
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hDlg, TRUE);
|
||
|
return TRUE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// We didn't process this message
|
||
|
return FALSE;
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// We didn't process this message
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
// We processed the message
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: MoreDlgInit(HWND)
|
||
|
|
||
|
PURPOSE: Initialises the controls in the more dialog window.
|
||
|
|
||
|
RETURNS: TRUE on success, FALSE on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
BOOL MoreDlgInit(
|
||
|
HWND hDlg,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
TCHAR string[MAX_STRING_LENGTH];
|
||
|
HANDLE hMyToken = (HANDLE)lParam;
|
||
|
PMYTOKEN pMyToken = (PMYTOKEN)hMyToken;
|
||
|
PTOKEN_STATISTICS Statistics;
|
||
|
PTOKEN_GROUPS Restrictions ;
|
||
|
UINT GroupIndex;
|
||
|
|
||
|
|
||
|
Statistics = pMyToken->TokenStats;
|
||
|
if (Statistics == NULL) {
|
||
|
DbgPrint("PVIEW: No token statistics in mytoken\n");
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
wsprintf(string, "0x%lx-%lx",
|
||
|
pMyToken->TokenStats->AuthenticationId.HighPart,
|
||
|
pMyToken->TokenStats->AuthenticationId.LowPart);
|
||
|
SetDlgItemText(hDlg, IDS_LOGONSESSION, string);
|
||
|
|
||
|
if (LUID2String(Statistics->TokenId, string, MAX_STRING_BYTES)) {
|
||
|
SetDlgItemText(hDlg, IDS_TOKENID, string);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert tokenid luid to string\n");
|
||
|
}
|
||
|
|
||
|
if (Time2String(Statistics->ExpirationTime, string, MAX_STRING_BYTES)) {
|
||
|
SetDlgItemText(hDlg, IDS_EXPIRATIONTIME, string);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert expiration time to string\n");
|
||
|
}
|
||
|
|
||
|
if (TokenType2String(Statistics->TokenType, string, MAX_STRING_BYTES)) {
|
||
|
SetDlgItemText(hDlg, IDS_TOKENTYPE, string);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert token type to string\n");
|
||
|
}
|
||
|
|
||
|
if (Statistics->TokenType == TokenPrimary) {
|
||
|
SetDlgItemText(hDlg, IDS_IMPERSONATION, "N/A");
|
||
|
} else {
|
||
|
if (ImpersonationLevel2String(Statistics->ImpersonationLevel, string, MAX_STRING_BYTES)) {
|
||
|
SetDlgItemText(hDlg, IDS_IMPERSONATION, string);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert impersonation level to string\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (Dynamic2String(Statistics->DynamicCharged, string, MAX_STRING_BYTES)) {
|
||
|
SetDlgItemText(hDlg, IDS_DYNAMICCHARGED, string);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert dynamic charged to string\n");
|
||
|
}
|
||
|
|
||
|
if (Dynamic2String(Statistics->DynamicAvailable, string, MAX_STRING_BYTES)) {
|
||
|
SetDlgItemText(hDlg, IDS_DYNAMICAVAILABLE, string);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert dynamic available to string\n");
|
||
|
}
|
||
|
|
||
|
if (LUID2String(Statistics->ModifiedId, string, MAX_STRING_BYTES)) {
|
||
|
SetDlgItemText(hDlg, IDS_MODIFIEDID, string);
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert modifiedid luid to string\n");
|
||
|
}
|
||
|
|
||
|
Restrictions = pMyToken->RestrictedSids ;
|
||
|
|
||
|
if ( Restrictions && (Restrictions->GroupCount) )
|
||
|
{
|
||
|
for (GroupIndex=0; GroupIndex < Restrictions->GroupCount; GroupIndex++ ) {
|
||
|
|
||
|
PSID Sid = Restrictions->Groups[GroupIndex].Sid;
|
||
|
ULONG Attributes = Restrictions->Groups[GroupIndex].Attributes;
|
||
|
|
||
|
if (SID2Name(Sid, string, MAX_STRING_BYTES)) {
|
||
|
|
||
|
// Add to disable or enabled group box
|
||
|
AddLBItem(hDlg, IDS_RESTRICTEDSIDS, string, GroupIndex);
|
||
|
|
||
|
} else {
|
||
|
DbgPrint("PVIEW: Failed to convert Group sid to string\n");
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
AddLBItem( hDlg, IDS_RESTRICTEDSIDS, TEXT("None"), 0 );
|
||
|
}
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|