|
|
/****************************************************************************
PROGRAM: SECEDIT.C
PURPOSE: Displays the usrs current token and eventually allows the user to edit parts of it.
****************************************************************************/
#include "SECEDIT.h"
#include "string.h"
static char pszMainWindowClass[] = "Main Window Class";
HANDLE hInst;
// Global used to store handle to MYTOKEN
HANDLE hMyToken;
BOOL InitApplication(HANDLE); BOOL InitInstance(HANDLE, INT); LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM); BOOL EditWindowContext(HWND, HWND); INT_PTR APIENTRY MainDlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR APIENTRY MoreDlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR APIENTRY ListDlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR APIENTRY ActiveWindowDlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR APIENTRY AboutDlgProc(HWND, UINT, WPARAM, LPARAM); BOOL MainDlgInit(HWND, LPARAM); BOOL MainDlgEnd(HWND, BOOL); BOOL EnablePrivilege(HWND, BOOL); BOOL EnableGroup(HWND, BOOL); BOOL SetDefaultOwner(HWND); BOOL SetPrimaryGroup(HWND); BOOL MoreDlgInit(HWND hDlg); BOOL DisplayMyToken(HWND, HANDLE); BOOL ListDlgInit(HWND); BOOL APIENTRY WindowEnum(HWND, LPARAM); HWND ListDlgEnd(HWND);
/****************************************************************************
FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
PURPOSE: calls initialization function, processes message loop
****************************************************************************/
INT __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow ) { MSG Message;
if (!hPrevInstance) { if (!InitApplication(hInstance)) { DbgPrint("SECEDIT - InitApplication failed\n"); return (FALSE); } }
if (!InitInstance(hInstance, nCmdShow)) { DbgPrint("SECEDIT - InitInstance failed\n"); return (FALSE); }
while (GetMessage(&Message, NULL, 0, 0)) { TranslateMessage(&Message); DispatchMessage(&Message); }
return ((int)Message.wParam); }
/****************************************************************************
FUNCTION: InitApplication(HANDLE)
PURPOSE: Initializes window data and registers window class
****************************************************************************/
BOOL InitApplication( HANDLE hInstance ) { WNDCLASS wc; NTSTATUS Status;
// Register the main window class
wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPICON)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = (LPSTR)IDM_MAINMENU; wc.lpszClassName = pszMainWindowClass;
return (RegisterClass(&wc)); }
/****************************************************************************
FUNCTION: InitInstance(HANDLE, int)
PURPOSE: Saves instance handle and creates main window
****************************************************************************/
BOOL InitInstance( HANDLE hInstance, INT nCmdShow ) { HWND hwnd;
// Store instance in global
hInst = hInstance;
// Create the main window
hwnd = CreateWindow( pszMainWindowClass, "Security Context Editor", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (hwnd == NULL) { return(FALSE); }
ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);
return (TRUE); }
/****************************************************************************
FUNCTION: MainWndProc(HWND, UINT, WPARAM, LONG)
PURPOSE: Processes messages for main window
COMMENTS:
****************************************************************************/
LRESULT APIENTRY MainWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { HWND hwndEdit; WNDPROC lpProc;
switch (message) {
case WM_CREATE: SetHooks(hwnd); return(0); // Continue creating window
break;
case WM_COMMAND: switch (LOWORD(wParam)) {
case IDM_PROGRAMMANAGER:
hwndEdit = FindWindow(NULL, "Program Manager"); if (hwndEdit == NULL) { DbgPrint("SECEDIT : Failed to find program manager window\n"); break; }
EditWindowContext(hwnd, hwndEdit); break;
case IDM_WINDOWLIST:
lpProc = (WNDPROC)MakeProcInstance(ListDlgProc, hInst); hwndEdit = (HWND)DialogBox(hInst,(LPSTR)IDD_WINDOWLIST, hwnd, lpProc); FreeProcInstance(lpProc);
EditWindowContext(hwnd, hwndEdit); break;
case IDM_ACTIVEWINDOW:
lpProc = (WNDPROC)MakeProcInstance(ActiveWindowDlgProc, hInst); hwndEdit = (HWND)DialogBox(hInst,(LPSTR)IDD_ACTIVEWINDOW, hwnd, lpProc); FreeProcInstance(lpProc); break;
case IDM_ABOUT:
lpProc = (WNDPROC)MakeProcInstance(AboutDlgProc, hInst); DialogBox(hInst,(LPSTR)IDD_ABOUT, hwnd, lpProc); FreeProcInstance(lpProc); break;
default: break; } break;
case WM_SECEDITNOTIFY: // Our hook proc posted us a message
SetForegroundWindow(hwnd); EditWindowContext(hwnd, (HWND)wParam); break;
case WM_DESTROY: ReleaseHooks(hwnd); PostQuitMessage(0); break;
default: return(DefWindowProc(hwnd, message, wParam, lParam));
}
return 0; }
/****************************************************************************
FUNCTION: EditWindowContext
PURPOSE: Displays and allows the user to edit the security context of the specified window.
Currently this means editting the security context of the process that owns this window
RETURNS: TRUE on success, FALSE on failure
****************************************************************************/
BOOL EditWindowContext( HWND hwndParent, HWND hwndEdit ) { WNDPROC lpProc;
if (hwndEdit == NULL) { DbgPrint("SECEDIT : hwndEdit = NULL\n"); return(FALSE); }
lpProc = (WNDPROC)MakeProcInstance(MainDlgProc, hInst); DialogBoxParam(hInst,(LPSTR)IDD_MAIN, hwndParent, lpProc, (LONG_PTR)hwndEdit); FreeProcInstance(lpProc);
return(TRUE); }
/****************************************************************************
FUNCTION: MainDlgProc(HWND, unsigned, WORD, LONG)
PURPOSE: Processes messages
MESSAGES:
WM_COMMAND - application menu (About dialog box) WM_DESTROY - destroy window
COMMENTS:
****************************************************************************/
INT_PTR APIENTRY MainDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { WNDPROC lpProc;
switch (message) {
case WM_INITDIALOG:
if (!MainDlgInit(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:
MainDlgEnd(hDlg, LOWORD(wParam) == IDOK);
EndDialog(hDlg, TRUE); return TRUE; break;
case IDB_DISABLEPRIVILEGE: case IDB_ENABLEPRIVILEGE: EnablePrivilege(hDlg, LOWORD(wParam) == IDB_ENABLEPRIVILEGE); return(TRUE); break;
case IDB_DISABLEGROUP: case IDB_ENABLEGROUP: EnableGroup(hDlg, LOWORD(wParam) == IDB_ENABLEGROUP); return(TRUE); break;
case IDC_DEFAULTOWNER: SetDefaultOwner(hDlg); return(TRUE);
case IDC_PRIMARYGROUP: SetPrimaryGroup(hDlg); return(TRUE);
case IDB_MORE:
lpProc = (WNDPROC)MakeProcInstance(MoreDlgProc, hInst); DialogBox(hInst,(LPSTR)IDD_MORE, hDlg, lpProc); FreeProcInstance(lpProc); return(TRUE);
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;
#ifdef NTBUILD
DBG_UNREFERENCED_PARAMETER(lParam); #endif
}
/****************************************************************************
FUNCTION: MainDlgInit(HWND)
PURPOSE: Initialises the controls in the main dialog window.
RETURNS: TRUE on success, FALSE if dialog should be terminated.
****************************************************************************/ BOOL MainDlgInit( HWND hDlg, LPARAM lParam ) { HWND hwnd = (HWND)lParam; CHAR string[MAX_STRING_BYTES]; INT length;
// Since we use a global to store the pointer to our MYTOKEN
// structure, check we don't get called again before we have
// quit out of the last dialog.
if (hMyToken != NULL) { DbgPrint("SECEDIT: Already editting a context\n"); return(FALSE); }
if (hwnd == NULL) { DbgPrint("SECEDIT: Window handle is NULL\n"); return(FALSE); }
if (!LsaInit()) { DbgPrint("SECEDIT - LsaInit failed\n"); return(FALSE); }
hMyToken = OpenMyToken(hwnd); if (hMyToken == NULL) { DbgPrint("SECEDIT: Failed to open mytoken\n");
strcpy(string, "Unable to access security context for\n<"); length = strlen(string); GetWindowText(hwnd, &(string[length]), MAX_STRING_BYTES - length); strcat(string, ">"); MessageBox(hDlg, string, NULL, MB_ICONSTOP | MB_APPLMODAL | MB_OK);
LsaTerminate(); return(FALSE); }
DisplayMyToken(hDlg, hMyToken);
// Set the dialog caption appropriately
GetWindowText(hDlg, string, MAX_STRING_BYTES); strcat(string, " for <"); length = strlen(string); GetWindowText(hwnd, &string[length], MAX_STRING_BYTES - length); strcat(string, ">"); SetWindowText(hDlg, string);
return(TRUE); }
/****************************************************************************
FUNCTION: MainDlgEnd(HWND)
PURPOSE: Do whatever we have to do to clean up when dialog ends
RETURNS: TRUE on success, FALSE on failure.
****************************************************************************/ BOOL MainDlgEnd( HWND hDlg, BOOL fSaveChanges ) { BOOL Success;
LsaTerminate();
Success = CloseMyToken(hDlg, hMyToken, fSaveChanges);
hMyToken = NULL;
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 ) { PMYTOKEN pMyToken = (PMYTOKEN)hMyToken; CHAR string[MAX_STRING_BYTES]; UINT GroupIndex; UINT PrivIndex;
if (pMyToken == NULL) { return(FALSE); }
//
// Authentication ID
//
if (pMyToken->TokenStats != NULL) {
wsprintf(string, "0x%lx-%lx", pMyToken->TokenStats->AuthenticationId.HighPart, pMyToken->TokenStats->AuthenticationId.LowPart);
SetDlgItemText(hDlg, IDS_LOGONSESSION, string);
} else { DbgPrint("SECEDIT : No token statistics in mytoken\n"); }
//
// 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, (LONG_PTR)Sid); }
// Add this group to primary group combo box
AddCBItem(hDlg, IDC_PRIMARYGROUP, string, (LONG_PTR)Sid);
} else { DbgPrint("SECEDIT: Failed to convert Group sid to string\n"); } } } else { DbgPrint("SECEDIT : 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, (LONG_PTR)Sid);
// Add to primary group combo box
AddCBItem(hDlg, IDC_PRIMARYGROUP, string, (LONG_PTR)Sid);
} else { DbgPrint("SECEDIT: Failed to convert User ID SID to string\n"); }
} else { DbgPrint("SECEDIT: 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("SECEDIT: Default Owner is not userID or one of our groups\n"); }
} else { DbgPrint("SECEDIT: Failed to convert Default Owner SID to string\n"); } } else { DbgPrint("SECEDIT: 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, (LONG_PTR)Sid); }
// Select the primary group
SendMessage(GetDlgItem(hDlg, IDC_PRIMARYGROUP), CB_SETCURSEL, iItem, 0);
} else { DbgPrint("SECEDIT: Failed to convert primary group SID to string\n"); } } else { DbgPrint("SECEDIT: 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("SECEDIT: Failed to convert privilege to string\n"); } } } else { DbgPrint("SECEDIT: No privelege 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 ) { HWND hwndFrom; HWND hwndTo; USHORT idFrom; USHORT idTo; INT cItems; PINT pItems; PMYTOKEN pMyToken = (PMYTOKEN)hMyToken; PTOKEN_PRIVILEGES Privileges;
if (pMyToken == NULL) { return(FALSE); }
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, (LONG)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 ) { HWND hwndFrom; HWND hwndTo; USHORT idFrom; USHORT idTo; INT cItems; PINT pItems; PMYTOKEN pMyToken = (PMYTOKEN)hMyToken; PTOKEN_GROUPS Groups;
if (pMyToken == NULL) { return(FALSE); }
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 ) { HWND hwnd; INT iItem; PMYTOKEN pMyToken = (PMYTOKEN)hMyToken; PTOKEN_OWNER DefaultOwner;
if (pMyToken == NULL) { return(FALSE); }
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 ) { HWND hwnd; INT iItem; PMYTOKEN pMyToken = (PMYTOKEN)hMyToken; PTOKEN_PRIMARY_GROUP PrimaryGroup;
if (pMyToken == NULL) { return(FALSE); }
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, unsigned, WORD, LONG)
PURPOSE: Processes messages
****************************************************************************/
INT_PTR APIENTRY MoreDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) {
switch (message) {
case WM_INITDIALOG:
if (!MoreDlgInit(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: 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;
DBG_UNREFERENCED_PARAMETER(lParam); }
/****************************************************************************
FUNCTION: MoreDlgInit(HWND)
PURPOSE: Initialises the controls in the more dialog window.
RETURNS: TRUE on success, FALSE on failure
****************************************************************************/ BOOL MoreDlgInit( HWND hDlg ) { CHAR string[MAX_STRING_BYTES]; PMYTOKEN pMyToken = (PMYTOKEN)hMyToken; PTOKEN_STATISTICS Statistics;
if (pMyToken == NULL) { return(FALSE); }
Statistics = pMyToken->TokenStats; if (Statistics == NULL) { DbgPrint("SECEDIT: No token statistics in mytoken\n"); return(FALSE); }
if (LUID2String(Statistics->TokenId, string, MAX_STRING_BYTES)) { SetDlgItemText(hDlg, IDS_TOKENID, string); } else { DbgPrint("SECEDIT: Failed to convert tokenid luid to string\n"); }
if (Time2String(Statistics->ExpirationTime, string, MAX_STRING_BYTES)) { SetDlgItemText(hDlg, IDS_EXPIRATIONTIME, string); } else { DbgPrint("SECEDIT: Failed to convert expiration time to string\n"); }
if (TokenType2String(Statistics->TokenType, string, MAX_STRING_BYTES)) { SetDlgItemText(hDlg, IDS_TOKENTYPE, string); } else { DbgPrint("SECEDIT: 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("SECEDIT: Failed to convert impersonation level to string\n"); } }
if (Dynamic2String(Statistics->DynamicCharged, string, MAX_STRING_BYTES)) { SetDlgItemText(hDlg, IDS_DYNAMICCHARGED, string); } else { DbgPrint("SECEDIT: Failed to convert dynamic charged to string\n"); }
if (Dynamic2String(Statistics->DynamicAvailable, string, MAX_STRING_BYTES)) { SetDlgItemText(hDlg, IDS_DYNAMICAVAILABLE, string); } else { DbgPrint("SECEDIT: Failed to convert dynamic available to string\n"); }
if (LUID2String(Statistics->ModifiedId, string, MAX_STRING_BYTES)) { SetDlgItemText(hDlg, IDS_MODIFIEDID, string); } else { DbgPrint("SECEDIT: Failed to convert modifiedid luid to string\n"); }
return(TRUE); }
/****************************************************************************
FUNCTION: ListDlgProc(HWND, unsigned, WORD, LONG)
PURPOSE: Processes messages
****************************************************************************/
INT_PTR APIENTRY ListDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { HWND hwndEdit = NULL;
switch (message) {
case WM_INITDIALOG:
if (!ListDlgInit(hDlg)) { // Failed to initialize dialog, get out
EndDialog(hDlg, FALSE); }
return (TRUE);
case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: hwndEdit = ListDlgEnd(hDlg);
// We're done, drop through to enddialog...
case IDCANCEL: EndDialog(hDlg, (INT_PTR)hwndEdit); 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;
DBG_UNREFERENCED_PARAMETER(lParam); }
/****************************************************************************
FUNCTION: ListDlgInit(HWND)
PURPOSE: Initialise the window list dialog
RETURNS: TRUE on success, FALSE on failure
****************************************************************************/ BOOL ListDlgInit( HWND hDlg ) { // Fill the list box with top-level windows and their handles
EnumWindows(WindowEnum, (LONG_PTR)hDlg);
return(TRUE); }
/****************************************************************************
FUNCTION: WindowEnum
PURPOSE: Window enumeration call-back function. Adds each window to the window list-box
RETURNS: TRUE to continue enumeration, FALSE to stop.
****************************************************************************/ BOOL APIENTRY WindowEnum( HWND hwnd, LPARAM lParam ) { HWND hDlg = (HWND)lParam; CHAR string[MAX_STRING_BYTES];
if (GetWindowText(hwnd, string, MAX_STRING_BYTES) != 0) {
// This window has a caption, so add it to the list-box
AddLBItem(hDlg, IDLB_WINDOWLIST, string, (LONG_PTR)hwnd); }
return(TRUE); }
/****************************************************************************
FUNCTION: ListDlgEnd(HWND)
PURPOSE: Cleans up after window list dialog
RETURNS: handle to window the user has selected or NULL
****************************************************************************/ HWND ListDlgEnd( HWND hDlg ) { HWND hwndListBox = GetDlgItem(hDlg, IDLB_WINDOWLIST); HWND hwndEdit; INT iItem;
// Read selection from list-box and get its hwnd
iItem = (INT)SendMessage(hwndListBox, LB_GETCURSEL, 0, 0);
if (iItem == LB_ERR) { // No selection
hwndEdit = NULL; } else { hwndEdit = (HWND)SendMessage(hwndListBox, LB_GETITEMDATA, iItem, 0); }
return (hwndEdit); }
/****************************************************************************
FUNCTION: AboutDlgProc(HWND, unsigned, WORD, LONG)
PURPOSE: Processes messages for About dialog
****************************************************************************/
INT_PTR APIENTRY AboutDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) {
switch (message) {
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;
DBG_UNREFERENCED_PARAMETER(lParam); }
/****************************************************************************
FUNCTION: ActiveWindowDlgProc(HWND, unsigned, WORD, LONG)
PURPOSE: Processes messages for Active Window Dialog
****************************************************************************/
INT_PTR APIENTRY ActiveWindowDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { switch (message) { 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;
DBG_UNREFERENCED_PARAMETER(lParam); }
|