/******************************************************************************* * * winspgs.cpp * * implementations for the WinStation info pages * * copyright notice: Copyright 1997, Citrix Systems Inc. * Copyright (c) 1998 - 1999 Microsoft Corporation * * $Author: donm $ Don Messerli * * $Log: N:\nt\private\utils\citrix\winutils\tsadmin\VCS\winspgs.cpp $ * * Rev 1.5 25 Apr 1998 14:32:24 donm * removed hardcoded 'bytes' * * Rev 1.4 16 Feb 1998 16:03:32 donm * modifications to support pICAsso extension * * Rev 1.3 03 Nov 1997 15:18:36 donm * Added descending sort * * Rev 1.2 13 Oct 1997 18:39:04 donm * update * * Rev 1.1 26 Aug 1997 19:15:50 donm * bug fixes/changes from WinFrame 1.7 * * Rev 1.0 30 Jul 1997 17:13:38 butchd * Initial revision. * *******************************************************************************/ #include "stdafx.h" #include "afxpriv.h" #include "winadmin.h" #include "admindoc.h" #include "winspgs.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //////////////////////////////// // MESSAGE MAP: CWinStationInfoPage // IMPLEMENT_DYNCREATE(CWinStationInfoPage, CFormView) BEGIN_MESSAGE_MAP(CWinStationInfoPage, CFormView) //{{AFX_MSG_MAP(CWinStationInfoPage) //ON_WM_SETFOCUS( ) ON_WM_SIZE() ON_COMMAND(ID_HELP1,OnCommandHelp) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////// // F'N: CWinStationInfoPage ctor // CWinStationInfoPage::CWinStationInfoPage() : CAdminPage(CWinStationInfoPage::IDD) { //{{AFX_DATA_INIT(CWinStationInfoPage) //}}AFX_DATA_INIT m_pWinStation = NULL; } // end CWinStationInfoPage ctor /* void CWinStationInfoPage::OnSetFocus( ) { */ ///////////////////////////// // F'N: CWinStationInfoPage dtor // CWinStationInfoPage::~CWinStationInfoPage() { } // end CWinStationInfoPage dtor //////////////////////////////////////// // F'N: CWinStationInfoPage::DoDataExchange // void CWinStationInfoPage::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWinStationInfoPage) //}}AFX_DATA_MAP } // end CWinStationInfoPage::DoDataExchange #ifdef _DEBUG ///////////////////////////////////// // F'N: CWinStationInfoPage::AssertValid // void CWinStationInfoPage::AssertValid() const { CFormView::AssertValid(); } // end CWinStationInfoPage::AssertValid ////////////////////////////// // F'N: CWinStationInfoPage::Dump // void CWinStationInfoPage::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } // end CWinStationInfoPage::Dump #endif //_DEBUG ////////////////////////////// // F'N: CWinStationInfoPage::OnCommandHelp // void CWinStationInfoPage::OnCommandHelp(void) { AfxGetApp()->WinHelp(CWinStationInfoPage::IDD + HID_BASE_RESOURCE); } // end CWinStationInfoPage::OnCommandHelp ////////////////////////////// // F'N: CWinStationInfoPage::OnInitialUpdate // void CWinStationInfoPage::OnInitialUpdate() { CFormView::OnInitialUpdate(); } // end CWinStationInfoPage::OnInitialUpdate ////////////////////////////// // F'N: CWinStationInfoPage::OnSize // void CWinStationInfoPage::OnSize(UINT nType, int cx, int cy) { //CFormView::OnSize(nType, cx, cy); } // end CWinStationInfoPage::OnSize ////////////////////////////// // F'N: CWinStationInfoPage::Reset // void CWinStationInfoPage::Reset(void *pWinStation) { m_pWinStation = (CWinStation*)pWinStation; DisplayInfo(); } // end CWinStationInfoPage::Reset ///////////////////////////////////// // F'N: CWinStationInfoPage::DisplayInfo // // void CWinStationInfoPage::DisplayInfo() { // We don't want to display info for the console // Even though this page is not shown for the console, // Reset() is still called and therefore, so is this function if(m_pWinStation->IsSystemConsole()) return; if(!m_pWinStation->AdditionalDone()) m_pWinStation->QueryAdditionalInformation(); SetDlgItemText(IDC_WS_INFO_USERNAME, m_pWinStation->GetUserName()); SetDlgItemText(IDC_WS_INFO_CLIENTNAME, m_pWinStation->GetClientName()); CString BuildString; BuildString.Format(TEXT("%lu"), m_pWinStation->GetClientBuildNumber()); SetDlgItemText(IDC_WS_INFO_BUILD, BuildString); SetDlgItemText(IDC_WS_INFO_DIR, m_pWinStation->GetClientDir()); CString IDString; IDString.Format(TEXT("%u"), m_pWinStation->GetClientProductId()); SetDlgItemText(IDC_WS_INFO_PRODUCT_ID, IDString); IDString.Format(TEXT("%lu"), m_pWinStation->GetClientSerialNumber()); SetDlgItemText(IDC_WS_INFO_SERIAL_NUMBER, IDString); SetDlgItemText(IDC_WS_INFO_ADDRESS, m_pWinStation->GetClientAddress()); CString BufferString; CString FormatString; FormatString.LoadString(IDS_BUFFERS_FORMAT); BufferString.Format(FormatString, m_pWinStation->GetHostBuffers(), m_pWinStation->GetBufferLength()); SetDlgItemText(IDC_WS_INFO_SERVER_BUFFERS, BufferString); BufferString.Format(FormatString, m_pWinStation->GetClientBuffers(), m_pWinStation->GetBufferLength()); SetDlgItemText(IDC_WS_INFO_CLIENT_BUFFERS, BufferString); SetDlgItemText(IDC_WS_INFO_MODEM_NAME, m_pWinStation->GetModemName()); SetDlgItemText(IDC_WS_INFO_CLIENT_LICENSE, m_pWinStation->GetClientLicense()); SetDlgItemText(IDC_WS_INFO_COLOR_DEPTH, m_pWinStation->GetColors()); IDString.Format(IDS_CLIENT_RESOLUTION, m_pWinStation->GetHRes(), m_pWinStation->GetVRes()); SetDlgItemText(IDC_WS_INFO_RESOLUTION, IDString); if(!m_pWinStation->GetEncryptionLevelString(&BuildString)) { BuildString.LoadString(IDS_NOT_APPLICABLE); } SetDlgItemText(IDC_ENCRYPTION_LEVEL, BuildString); } // end CWinStationInfoPage::DisplayInfo //////////////////////////////// // MESSAGE MAP: CWinStationNoInfoPage // IMPLEMENT_DYNCREATE(CWinStationNoInfoPage, CFormView) BEGIN_MESSAGE_MAP(CWinStationNoInfoPage, CFormView) //{{AFX_MSG_MAP(CWinStationNoInfoPage) ON_WM_SIZE( ) ON_WM_SETFOCUS( ) //}}AFX_MSG_MAP END_MESSAGE_MAP() //=--------------------------------------------------- void CWinStationNoInfoPage::OnSetFocus( CWnd * pOld ) { ODS( L"CWinStationNoInfoPage::OnSetFocus\n" ); CWnd::OnSetFocus( pOld ); } ///////////////////////////// // F'N: CWinStationNoInfoPage ctor // CWinStationNoInfoPage::CWinStationNoInfoPage() : CAdminPage(CWinStationNoInfoPage::IDD) { //{{AFX_DATA_INIT(CWinStationNoInfoPage) //}}AFX_DATA_INIT } // end CWinStationNoInfoPage ctor void CWinStationNoInfoPage::OnSize( UINT nType, int cx, int cy) { //eat it. } ///////////////////////////// // F'N: CWinStationNoInfoPage dtor // CWinStationNoInfoPage::~CWinStationNoInfoPage() { } // end CWinStationNoInfoPage dtor //////////////////////////////////////// // F'N: CWinStationNoInfoPage::DoDataExchange // void CWinStationNoInfoPage::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWinStationNoInfoPage) //}}AFX_DATA_MAP } // end CWinStationNoInfoPage::DoDataExchange #ifdef _DEBUG ///////////////////////////////////// // F'N: CWinStationNoInfoPage::AssertValid // void CWinStationNoInfoPage::AssertValid() const { CFormView::AssertValid(); } // end CWinStationNoInfoPage::AssertValid ////////////////////////////// // F'N: CWinStationNoInfoPage::Dump // void CWinStationNoInfoPage::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } // end CWinStationNoInfoPage::Dump #endif //_DEBUG //////////////////////////////// // MESSAGE MAP: CWinStationModulesPage // IMPLEMENT_DYNCREATE(CWinStationModulesPage, CFormView) BEGIN_MESSAGE_MAP(CWinStationModulesPage, CFormView) //{{AFX_MSG_MAP(CWinStationModulesPage) ON_WM_SIZE() ON_NOTIFY(LVN_COLUMNCLICK, IDC_WINSTATION_MODULE_LIST, OnColumnClick) ON_NOTIFY(NM_SETFOCUS, IDC_WINSTATION_MODULE_LIST, OnSetfocusModuleList) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////// // F'N: CWinStationModulesPage ctor // CWinStationModulesPage::CWinStationModulesPage() : CAdminPage(CWinStationModulesPage::IDD) { //{{AFX_DATA_INIT(CWinStationModulesPage) //}}AFX_DATA_INIT m_pWinStation = NULL; m_bSortAscending = TRUE; m_pExtModuleInfo = NULL; } // end CWinStationModulesPage ctor ///////////////////////////// // F'N: CWinStationModulesPage dtor // CWinStationModulesPage::~CWinStationModulesPage() { if(m_pExtModuleInfo) delete[] m_pExtModuleInfo; } // end CWinStationModulesPage dtor //////////////////////////////////////// // F'N: CWinStationModulesPage::DoDataExchange // void CWinStationModulesPage::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWinStationModulesPage) DDX_Control(pDX, IDC_WINSTATION_MODULE_LIST, m_ModuleList); //}}AFX_DATA_MAP } // end CWinStationModulesPage::DoDataExchange #ifdef _DEBUG ///////////////////////////////////// // F'N: CWinStationModulesPage::AssertValid // void CWinStationModulesPage::AssertValid() const { CFormView::AssertValid(); } // end CWinStationModulesPage::AssertValid ////////////////////////////// // F'N: CWinStationModulesPage::Dump // void CWinStationModulesPage::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } // end CWinStationModulesPage::Dump #endif //_DEBUG static ColumnDef ModuleColumns[] = { { IDS_COL_FILENAME, LVCFMT_LEFT, 150 }, { IDS_COL_FILEDATETIME, LVCFMT_LEFT, 100 }, { IDS_COL_SIZE, LVCFMT_RIGHT, 100 }, { IDS_COL_VERSIONS, LVCFMT_RIGHT, 60 } }; #define NUM_MODULE_COLUMNS sizeof(ModuleColumns)/sizeof(ColumnDef) ////////////////////////////// // F'N: CWinStationModulesPage::OnInitialUpdate // void CWinStationModulesPage::OnInitialUpdate() { CFormView::OnInitialUpdate(); BuildImageList(); // builds the image list for the list control CString columnString; for(int col = 0; col < NUM_MODULE_COLUMNS; col++) { columnString.LoadString(ModuleColumns[col].stringID); m_ModuleList.InsertColumn(col, columnString, ModuleColumns[col].format, ModuleColumns[col].width, col); } m_CurrentSortColumn = MODULES_COL_FILENAME; } // end CWinStationModulesPage::OnInitialUpdate ///////////////////////////////////// // F'N: CWinStationModulesPage::BuildImageList // // - calls m_imageList.Create(..) to create the image list // - calls AddIconToImageList(..) to add the icons themselves and save // off their indices // - attaches the image list to the list ctrl // void CWinStationModulesPage::BuildImageList() { m_imageList.Create(16, 16, TRUE, 1, 0); m_idxBlank = AddIconToImageList(IDI_BLANK); m_ModuleList.SetImageList(&m_imageList, LVSIL_SMALL); } // end CWinStationModulesPage::BuildImageList ///////////////////////////////////////// // F'N: CWinStationModulesPage::AddIconToImageList // // - loads the appropriate icon, adds it to m_imageList, and returns // the newly-added icon's index in the image list // int CWinStationModulesPage::AddIconToImageList(int iconID) { HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(iconID)); return m_imageList.Add(hIcon); } // end CWinStationModulesPage::AddIconToImageList ////////////////////////////// // F'N: CWinStationModulesPage::OnColumnClick // void CWinStationModulesPage::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // If the sort column hasn't changed, flip the ascending mode. if(m_CurrentSortColumn == pNMListView->iSubItem) m_bSortAscending = !m_bSortAscending; else // New sort column, start in ascending mode m_bSortAscending = TRUE; m_CurrentSortColumn = pNMListView->iSubItem; SortByColumn(VIEW_WINSTATION, PAGE_WS_MODULES, &m_ModuleList, m_CurrentSortColumn, m_bSortAscending); *pResult = 0; } // end CWinStationModulesPage::OnColumnClick ////////////////////////////// // F'N: CWinStationModulesPage::OnSetfocusModuleList // void CWinStationModulesPage::OnSetfocusModuleList(NMHDR* pNMHDR, LRESULT* pResult) { m_ModuleList.Invalidate(); *pResult = 0; } // end CWinStationModulesPage::OnSetfocusModuleList ////////////////////////////// // F'N: CWinStationModulesPage::OnSize // void CWinStationModulesPage::OnSize(UINT nType, int cx, int cy) { RECT rect; GetClientRect(&rect); rect.top += LIST_TOP_OFFSET; if(m_ModuleList.GetSafeHwnd()) m_ModuleList.MoveWindow(&rect, TRUE); //CFormView::OnSize(nType, cx, cy); } // end CWinStationModulesPage::OnSize ////////////////////////////// // F'N: CWinStationModulesPage::Reset // void CWinStationModulesPage::Reset(void *pWinStation) { m_pWinStation = (CWinStation*)pWinStation; if(m_pExtModuleInfo) delete[] m_pExtModuleInfo; m_pExtModuleInfo = NULL; DisplayModules(); } // end CWinStationModulesPage::Reset ///////////////////////////////////// // F'N: CWinStationModulesPage::DisplayModules // // void CWinStationModulesPage::DisplayModules() { // We don't want to display modules for the console // Even though this page is not shown for the console, // Reset() is still called and therefore, so is this function if(m_pWinStation->IsSystemConsole()) return; // Clear out the list control m_ModuleList.DeleteAllItems(); if(!m_pWinStation->AdditionalDone()) m_pWinStation->QueryAdditionalInformation(); // If this is an ICA WinStation, display the module information if(m_pWinStation->GetExtendedInfo()) { ExtModuleInfo *pExtModuleInfo = m_pWinStation->GetExtModuleInfo(); if(pExtModuleInfo) { ULONG NumModules = m_pWinStation->GetNumModules(); ExtModuleInfo *pModule = pExtModuleInfo; for(ULONG module = 0; module < NumModules; module++) { // Filename - put at the end of the list int item = m_ModuleList.InsertItem(m_ModuleList.GetItemCount(), pModule->Name, m_idxBlank); // File date and time FILETIME fTime; TCHAR szDateTime[MAX_DATE_TIME_LENGTH]; if(!DosDateTimeToFileTime(pModule->Date, pModule->Time, &fTime)) wcscpy(szDateTime, TEXT(" ")); else DateTimeString((LARGE_INTEGER *)&fTime, szDateTime); m_ModuleList.SetItemText(item, MODULES_COL_FILEDATETIME, szDateTime); // File size CString SizeString; if(pModule->Size) SizeString.Format(TEXT("%lu"), pModule->Size); else SizeString.LoadString(IDS_EMBEDDED); m_ModuleList.SetItemText(item, MODULES_COL_SIZE, SizeString); // Versions CString VersionString; VersionString.Format(TEXT("%u - %u"), pModule->LowVersion, pModule->HighVersion); m_ModuleList.SetItemText(item, MODULES_COL_VERSIONS, VersionString); m_ModuleList.SetItemData(item, (DWORD_PTR)pModule); pModule++; } } } } // end CWinStationModulesPage::DisplayModules //////////////////////////////// // MESSAGE MAP: CWinStationProcessesPage // IMPLEMENT_DYNCREATE(CWinStationProcessesPage, CFormView) BEGIN_MESSAGE_MAP(CWinStationProcessesPage, CFormView) //{{AFX_MSG_MAP(CWinStationProcessesPage) ON_WM_SIZE() ON_NOTIFY(LVN_COLUMNCLICK, IDC_WINSTATION_PROCESS_LIST, OnColumnClick) ON_NOTIFY(LVN_ITEMCHANGED, IDC_WINSTATION_PROCESS_LIST, OnProcessItemChanged) ON_WM_CONTEXTMENU() ON_NOTIFY(NM_SETFOCUS, IDC_WINSTATION_PROCESS_LIST, OnSetfocusWinstationProcessList) // ON_NOTIFY(NM_KILLFOCUS , IDC_WINSTATION_PROCESS_LIST , OnKillFocusWinstationProcessList ) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////// // F'N: CWinStationProcessesPage ctor // CWinStationProcessesPage::CWinStationProcessesPage() : CAdminPage(CWinStationProcessesPage::IDD) { //{{AFX_DATA_INIT(CWinStationProcessesPage) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_pWinStation = NULL; m_bSortAscending = TRUE; } // end CWinStationProcessesPage ctor ///////////////////////////// // F'N: CWinStationProcessesPage dtor // CWinStationProcessesPage::~CWinStationProcessesPage() { } // end CWinStationProcessesPage dtor //////////////////////////////////////// // F'N: CWinStationProcessesPage::DoDataExchange // void CWinStationProcessesPage::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWinStationProcessesPage) DDX_Control(pDX, IDC_WINSTATION_PROCESS_LIST, m_ProcessList); //}}AFX_DATA_MAP } // end CWinStationProcessesPage::DoDataExchange #ifdef _DEBUG ///////////////////////////////////// // F'N: CWinStationProcessesPage::AssertValid // void CWinStationProcessesPage::AssertValid() const { CFormView::AssertValid(); } // end CWinStationProcessesPage::AssertValid ////////////////////////////// // F'N: CWinStationProcessesPage::Dump // void CWinStationProcessesPage::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } // end CWinStationProcessesPage::Dump #endif //_DEBUG ////////////////////////////// // F'N: CWinStationProcessesPage::OnSize // void CWinStationProcessesPage::OnSize(UINT nType, int cx, int cy) { RECT rect; GetClientRect(&rect); rect.top += LIST_TOP_OFFSET; if(m_ProcessList.GetSafeHwnd()) m_ProcessList.MoveWindow(&rect, TRUE); //CFormView::OnSize(nType, cx, cy); } // end CWinStationProcessesPage::OnSize static ColumnDef ProcColumns[] = { CD_PROC_ID, CD_PROC_PID, CD_PROC_IMAGE }; #define NUM_PROC_COLUMNS sizeof(ProcColumns)/sizeof(ColumnDef) ////////////////////////////// // F'N: CWinStationProcessesPage::OnInitialUpdate // void CWinStationProcessesPage::OnInitialUpdate() { // Call the parent class CFormView::OnInitialUpdate(); CString columnString; for(int col = 0; col < NUM_PROC_COLUMNS; col++) { columnString.LoadString(ProcColumns[col].stringID); m_ProcessList.InsertColumn(col, columnString, ProcColumns[col].format, ProcColumns[col].width, col); } m_CurrentSortColumn = WS_PROC_COL_ID; // This is a major kludge!!!! // This is the last view created // We want to tell the document that all the // views have been created. // This is to allow background threads to start // doing their thing. ((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->SetMainWnd(AfxGetMainWnd()); ((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->SetAllViewsReady(); } // end CWinStationProcessesPage::OnInitialUpdate ////////////////////////////// // F'N: CWinStationProcessesPage::Reset // void CWinStationProcessesPage::Reset(void *pWinStation) { m_pWinStation = (CWinStation*)pWinStation; DisplayProcesses(); } // end CWinStationProcessesPage::Reset ////////////////////////////// // F'N: CWinStationProcessesPage::UpdateProcesses // void CWinStationProcessesPage::UpdateProcesses() { CWinAdminApp *pApp = (CWinAdminApp*)AfxGetApp(); BOOL bAnyChanged = FALSE; BOOL bAnyAdded = FALSE; CServer *pServer = m_pWinStation->GetServer(); // Loop through the processes pServer->LockProcessList(); CObList *pProcessList = pServer->GetProcessList(); POSITION pos = pProcessList->GetHeadPosition(); while(pos) { CProcess *pProcess = (CProcess*)pProcessList->GetNext(pos); // If this is a 'system' process and we aren't currently showing them, // go to the next process if(pProcess->IsSystemProcess() && !pApp->ShowSystemProcesses()) continue; // If this user is not an Admin, don't show him someone else's processes if(!pApp->IsUserAdmin() && !pProcess->IsCurrentUsers()) continue; // We only want to show process for this WinStation if(pProcess->GetLogonId() == m_pWinStation->GetLogonId()) { // If the process is new, add it to the list if(pProcess->IsNew()) { AddProcessToList(pProcess); bAnyAdded = TRUE; continue; } LV_FINDINFO FindInfo; FindInfo.flags = LVFI_PARAM; FindInfo.lParam = (LPARAM)pProcess; // Find the Process in our list int item = m_ProcessList.FindItem(&FindInfo, -1); // If the process is no longer current, // remove it from the list if(!pProcess->IsCurrent() && item != -1) { // Remove the Process from the list m_ProcessList.DeleteItem(item); } } } pServer->UnlockProcessList(); if(bAnyChanged || bAnyAdded) SortByColumn(VIEW_WINSTATION, PAGE_WS_PROCESSES, &m_ProcessList, m_CurrentSortColumn, m_bSortAscending); } // end CWinStationProcessesPage::UpdateProcesses ////////////////////////////////////////// // F'N: CWinStationProcessesPage::RemoveProcess // void CWinStationProcessesPage::RemoveProcess(CProcess *pProcess) { // Find out how many items in the list int ItemCount = m_ProcessList.GetItemCount(); // Go through the items and remove this process for(int item = 0; item < ItemCount; item++) { CProcess *pListProcess = (CProcess*)m_ProcessList.GetItemData(item); if(pListProcess == pProcess) { m_ProcessList.DeleteItem(item); break; } } } // end CWinStationProcessPage::RemoveProcess ////////////////////////////// // F'N: CWinStationProcessesPage::AddProcessToList // int CWinStationProcessesPage::AddProcessToList(CProcess *pProcess) { CWinAdminApp *pApp = (CWinAdminApp*)AfxGetApp(); // ID CString ProcString; ProcString.Format(TEXT("%lu"), pProcess->GetLogonId()); int item = m_ProcessList.InsertItem(m_ProcessList.GetItemCount(), ProcString, NULL); // PID ProcString.Format(TEXT("%lu"), pProcess->GetPID()); m_ProcessList.SetItemText(item, WS_PROC_COL_PID, ProcString); // Image m_ProcessList.SetItemText(item, WS_PROC_COL_IMAGE, pProcess->GetImageName()); m_ProcessList.SetItemData(item, (DWORD_PTR)pProcess); return item; } // end CWinStationProcessesPage::AddProcessToList ///////////////////////////////////// // F'N: CWinStationProcessesPage::DisplayProcesses // void CWinStationProcessesPage::DisplayProcesses() { CWinAdminApp *pApp = (CWinAdminApp*)AfxGetApp(); // Clear out the list control m_ProcessList.DeleteAllItems(); CServer *pServer = m_pWinStation->GetServer(); pServer->EnumerateProcesses(); CObList *pProcessList = pServer->GetProcessList(); pServer->LockProcessList(); POSITION pos = pProcessList->GetHeadPosition(); while(pos) { CProcess *pProcess = (CProcess*)pProcessList->GetNext(pos); // If this is a 'system' process and we aren't currently showing them, // go to the next process if(pProcess->IsSystemProcess() && !pApp->ShowSystemProcesses()) continue; // If this user is not an Admin, don't show him someone else's processes if(!pApp->IsUserAdmin() && !pProcess->IsCurrentUsers()) continue; // We only want to show process for this WinStation if(pProcess->GetLogonId() == m_pWinStation->GetLogonId()) { AddProcessToList(pProcess); } } m_ProcessList.SetItemState( 0 , LVIS_FOCUSED | LVIS_SELECTED , LVIS_FOCUSED | LVIS_SELECTED ); pServer->UnlockProcessList(); } // end CWinStationProcessesPage::DisplayProcesses ////////////////////////////// // F'N: CWinStationProcessesPage::OnProcessItemChanged // void CWinStationProcessesPage::OnProcessItemChanged(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW *pLV = (NM_LISTVIEW*)pNMHDR; if(pLV->uNewState & LVIS_SELECTED) { CProcess *pProcess = (CProcess*)m_ProcessList.GetItemData(pLV->iItem); pProcess->SetSelected(); } if(pLV->uOldState & LVIS_SELECTED && !(pLV->uNewState & LVIS_SELECTED)) { CProcess *pProcess = (CProcess*)m_ProcessList.GetItemData(pLV->iItem); pProcess->ClearSelected(); } *pResult = 0; } // end CWinStationProcessesPage::OnProcessItemChanged ////////////////////////////// // F'N: CWinStationProcessesPage::OnColumnClick // void CWinStationProcessesPage::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here // If the sort column hasn't changed, flip the ascending mode. if(m_CurrentSortColumn == pNMListView->iSubItem) m_bSortAscending = !m_bSortAscending; else // New sort column, start in ascending mode m_bSortAscending = TRUE; m_CurrentSortColumn = pNMListView->iSubItem; SortByColumn(VIEW_WINSTATION, PAGE_WS_PROCESSES, &m_ProcessList, m_CurrentSortColumn, m_bSortAscending); *pResult = 0; } // end CWinStationProcessesPage::OnColumnClick ////////////////////////////// // F'N: CWinStationProcessesPage::OnContextMenu // void CWinStationProcessesPage::OnContextMenu(CWnd* pWnd, CPoint ptScreen) { // TODO: Add your message handler code here UINT flags; UINT Item; CPoint ptClient = ptScreen; ScreenToClient(&ptClient); // If we got here from the keyboard, if(ptScreen.x == -1 && ptScreen.y == -1) { UINT iCount = m_ProcessList.GetItemCount( ); RECT rc; for( Item = 0 ; Item < iCount ; Item++ ) { if( m_ProcessList.GetItemState( Item , LVIS_SELECTED ) == LVIS_SELECTED ) { m_ProcessList.GetItemRect( Item , &rc , LVIR_ICON ); ptScreen.x = rc.left; ptScreen.y = rc.bottom + 5; ClientToScreen( &ptScreen ); break; } } if(ptScreen.x == -1 && ptScreen.y == -1) { return; } /* RECT rect; m_ProcessList.GetClientRect(&rect); ptScreen.x = (rect.right - rect.left) / 2; ptScreen.y = (rect.bottom - rect.top) / 2; ClientToScreen(&ptScreen); */ } else { Item = m_ProcessList.HitTest(ptClient, &flags); if((Item == 0xFFFFFFFF) || !(flags & LVHT_ONITEM)) return; } CMenu menu; menu.LoadMenu(IDR_PROCESS_POPUP); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, ptScreen.x, ptScreen.y, AfxGetMainWnd()); menu.DestroyMenu(); } // end CServerProcessesPage::OnContextMenu void CWinStationProcessesPage::OnSetfocusWinstationProcessList(NMHDR* pNMHDR, LRESULT* pResult) { ODS( L"CWinStationProcessesPage::OnSetfocusWinstationProcessList\n"); CWinAdminDoc *pDoc = (CWinAdminDoc*)GetDocument(); m_ProcessList.Invalidate( ); pDoc->RegisterLastFocus( PAGED_ITEM ); *pResult = 0; } void CWinStationProcessesPage::OnKillFocusWinstationProcessList( NMHDR* , LRESULT* pResult) { m_ProcessList.Invalidate( ); *pResult = 0; } //////////////////////////////// // MESSAGE MAP: CWinStationCachePage // IMPLEMENT_DYNCREATE(CWinStationCachePage, CFormView) BEGIN_MESSAGE_MAP(CWinStationCachePage, CFormView) //{{AFX_MSG_MAP(CWinStationCachePage) ON_WM_SIZE() ON_COMMAND(ID_HELP1,OnCommandHelp) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////// // F'N: CWinStationCachePage ctor // CWinStationCachePage::CWinStationCachePage() : CAdminPage(CWinStationCachePage::IDD) { //{{AFX_DATA_INIT(CWinStationCachePage) //}}AFX_DATA_INIT m_pWinStation = NULL; } // end CWinStationCachePage ctor ///////////////////////////// // F'N: CWinStationCachePage dtor // CWinStationCachePage::~CWinStationCachePage() { } // end CWinStationCachePage dtor //////////////////////////////////////// // F'N: CWinStationCachePage::DoDataExchange // void CWinStationCachePage::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWinStationCachePage) //}}AFX_DATA_MAP } // end CWinStationCachePage::DoDataExchange #ifdef _DEBUG ///////////////////////////////////// // F'N: CWinStationCachePage::AssertValid // void CWinStationCachePage::AssertValid() const { CFormView::AssertValid(); } // end CWinStationCachePage::AssertValid ////////////////////////////// // F'N: CWinStationCachePage::Dump // void CWinStationCachePage::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } // end CWinStationCachePage::Dump #endif //_DEBUG ////////////////////////////// // F'N: CWinStationCachePage::OnInitialUpdate // void CWinStationCachePage::OnInitialUpdate() { CFormView::OnInitialUpdate(); } // end CWinStationCachePage::OnInitialUpdate ////////////////////////////// // F'N: CWinStationCachePage::OnCommandHelp // void CWinStationCachePage::OnCommandHelp(void) { AfxGetApp()->WinHelp(CWinStationCachePage::IDD + HID_BASE_RESOURCE); } // end CWinStationCachePage::OnCommandHelp ////////////////////////////// // F'N: CWinStationCachePage::OnSize // void CWinStationCachePage::OnSize(UINT nType, int cx, int cy) { RECT rect; GetClientRect(&rect); rect.top += LIST_TOP_OFFSET; // CFormView::OnSize(nType, cx, cy); } // end CWinStationCachePage::OnSize ////////////////////////////// // F'N: CWinStationCachePage::Reset // void CWinStationCachePage::Reset(void *pWinStation) { m_pWinStation = (CWinStation*)pWinStation; DisplayCache(); } // end CWinStationCachePage::Reset ///////////////////////////////////// // F'N: CWinStationCachePage::DisplayCache // // void CWinStationCachePage::DisplayCache() { // We don't want to display info for the console // Even though this page is not shown for the console, // Reset() is still called and therefore, so is this function if(m_pWinStation->IsSystemConsole()) return; if(!m_pWinStation->AdditionalDone()) m_pWinStation->QueryAdditionalInformation(); ExtWinStationInfo *pExtWinStationInfo = m_pWinStation->GetExtendedInfo(); if(pExtWinStationInfo) { CString IDString; IDString.Format(IDS_CLIENT_CACHE, (pExtWinStationInfo->CacheTiny + pExtWinStationInfo->CacheLowMem) / 1024, pExtWinStationInfo->CacheTiny / 1024, pExtWinStationInfo->CacheXms / 1024, pExtWinStationInfo->CacheDASD / 1024); SetDlgItemText(IDC_WS_INFO_CACHE, IDString); // divide by 1024 to get Megabytes FLOAT DimCacheSize = (FLOAT)(pExtWinStationInfo->DimCacheSize / 1024); // If it is more than a Gigabyte, we need to divide by 1024 again if(DimCacheSize > 1024*1024) { IDString.Format(TEXT("%3.2fGB"), DimCacheSize / (1024*1024)); } else if(DimCacheSize > 1024) { IDString.Format(TEXT("%3.2fMB"), DimCacheSize / 1024); } else if(DimCacheSize) { IDString.Format(TEXT("%fKB"), DimCacheSize); } else IDString.LoadString(IDS_NONE); SetDlgItemText(IDC_BITMAP_SIZE, IDString); IDString.Format(TEXT("%luK"), pExtWinStationInfo->DimBitmapMin / 1024); SetDlgItemText(IDC_BITMAP_MINIMUM, IDString); IDString.Format(TEXT("%lu"), pExtWinStationInfo->DimSignatureLevel); SetDlgItemText(IDC_BITMAP_SIG_LEVEL, IDString); } } // end CWinStationCachePage::DisplayCache