|
|
/*******************************************************************************
* * 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
|