Path: blob/main/crypto/krb5/src/windows/leash/LeashAboutBox.cpp
34907 views
//*****************************************************************************1// File: LeashAboutBox.cpp2// By: Arthur David Leather3// Created: 12/02/984// Copyright: @1998 Massachusetts Institute of Technology - All rights5// reserved.6// Description: CPP file for LeashAboutBox.h. Contains variables and functions7// for the Leash About Box Dialog Box8//9// History:10//11// MM/DD/YY Inits Description of Change12// 12/02/98 ADL Original13//*****************************************************************************141516#include "stdafx.h"17#include "leash.h"18#include "LeashAboutBox.h"19#include "reminder.h"20#include "lglobals.h"21#include "psapi.h"2223#ifdef _DEBUG24#define new DEBUG_NEW25#undef THIS_FILE26static char THIS_FILE[] = __FILE__;27#endif2829/////////////////////////////////////////////////////////////////////////////30// CLeashAboutBox dialog313233CLeashAboutBox::CLeashAboutBox(CWnd* pParent /*=NULL*/)34: CDialog(CLeashAboutBox::IDD, pParent)35, m_bListModules(FALSE)36{37m_missingFileError = FALSE;3839//{{AFX_DATA_INIT(CLeashAboutBox)40m_fileItem = _T("");41//}}AFX_DATA_INIT42}434445void CLeashAboutBox::DoDataExchange(CDataExchange* pDX)46{47CDialog::DoDataExchange(pDX);48//{{AFX_DATA_MAP(CLeashAboutBox)49DDX_Control(pDX, IDC_PROPERTIES, m_propertiesButton);50DDX_Control(pDX, IDC_LEASH_MODULES, m_radio_LeashDLLs);51DDX_Control(pDX, IDC_LEASH_MODULE_LB, m_LB_DLLsLoaded);52DDX_LBString(pDX, IDC_LEASH_MODULE_LB, m_fileItem);53//}}AFX_DATA_MAP54}555657BEGIN_MESSAGE_MAP(CLeashAboutBox, CDialog)58//{{AFX_MSG_MAP(CLeashAboutBox)59ON_WM_HSCROLL()60ON_LBN_SELCHANGE(IDC_LEASH_MODULE_LB, OnSelchangeLeashModuleLb)61ON_BN_CLICKED(IDC_ALL_MODULES, OnAllModules)62ON_BN_CLICKED(IDC_LEASH_MODULES, OnLeashModules)63ON_LBN_DBLCLK(IDC_LEASH_MODULE_LB, OnDblclkLeashModuleLb)64ON_BN_CLICKED(IDC_PROPERTIES, OnProperties)65ON_LBN_SETFOCUS(IDC_LEASH_MODULE_LB, OnSetfocusLeashModuleLb)66ON_BN_CLICKED(IDC_NOT_LOADED_MODULES, OnNotLoadedModules)67//}}AFX_MSG_MAP68END_MESSAGE_MAP()69;70/////////////////////////////////////////////////////////////////////////////71// CLeashAboutBox message handlers7273void CLeashAboutBox::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)74{75CDialog::OnHScroll(nSBCode, nPos, pScrollBar);76}7778BOOL CLeashAboutBox::GetModules95(DWORD processID, BOOL allModules)79{80char szModNames[1024];81MODULEENTRY32 me32 = {0};82HANDLE hProcessSnap = NULL;8384hProcessSnap = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processID);85if (hProcessSnap == (HANDLE)-1)86return FALSE;8788me32.dwSize = sizeof(MODULEENTRY32);89if (pModule32First(hProcessSnap, &me32))90{91do92{93lstrcpy(szModNames, me32.szExePath);94strupr(szModNames);9596if (!allModules)97{98if (!strstr(szModNames, "SYSTEM"))99m_LB_DLLsLoaded.AddString(me32.szExePath);100}101else102m_LB_DLLsLoaded.AddString(me32.szExePath);103}104while (pModule32Next(hProcessSnap, &me32));105}106107return TRUE;108}109110void CLeashAboutBox::GetModulesNT(DWORD processID, BOOL allModules)111{112char checkName[1024];113HMODULE hMods[1024];114HANDLE hProcess;115DWORD cbNeeded;116unsigned int i;117118// Get a list of all the modules in this process.119hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,120FALSE, processID);121122if (pEnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))123{124for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)125{126char szModName[2048];127128// Get the full path to the module's file.129if (pGetModuleFileNameEx(hProcess, hMods[i], szModName,130sizeof(szModName)))131{132lstrcpy(checkName, szModName);133strupr(checkName);134135if (!allModules)136{137if (!strstr(checkName, "SYSTEM32"))138m_LB_DLLsLoaded.AddString(szModName);139}140else141m_LB_DLLsLoaded.AddString(szModName);142}143}144}145146CloseHandle(hProcess);147}148149void CLeashAboutBox::HighlightFirstItem()150{151UINT numModules = m_LB_DLLsLoaded.GetCount();152CHAR numModulesBuffer [25];153_itoa(numModules, numModulesBuffer, 10);154155if (numModules)156{157m_LB_DLLsLoaded.SetCurSel(0);158m_propertiesButton.EnableWindow();159}160else161m_propertiesButton.EnableWindow(FALSE);162163GetDlgItem(IDC_STATIC_NO_OF_MODULES)->SetWindowText(numModulesBuffer);164}165166DWORD167CLeashAboutBox::SetVersionInfo(168UINT id_version,169UINT id_copyright170)171{172TCHAR filename[1024];173DWORD dwVersionHandle;174LPVOID pVersionInfo = 0;175DWORD retval = 0;176LPDWORD pLangInfo = 0;177LPTSTR szVersion = 0;178LPTSTR szCopyright = 0;179UINT len = 0;180TCHAR sname_version[] = TEXT("FileVersion");181TCHAR sname_copyright[] = TEXT("LegalCopyright");182TCHAR szVerQ[(sizeof("\\StringFileInfo\\12345678\\") +183max(sizeof(sname_version) / sizeof(TCHAR),184sizeof(sname_copyright) / sizeof(TCHAR)))];185TCHAR * cp = szVerQ;186187if (!GetModuleFileName(NULL, filename, sizeof(filename)))188return GetLastError();189190DWORD size = GetFileVersionInfoSize(filename, &dwVersionHandle);191192if (!size)193return GetLastError();194195pVersionInfo = malloc(size);196if (!pVersionInfo)197return ERROR_NOT_ENOUGH_MEMORY;198199if (!GetFileVersionInfo(filename, dwVersionHandle, size, pVersionInfo))200{201retval = GetLastError();202goto cleanup;203}204205if (!VerQueryValue(pVersionInfo, TEXT("\\VarFileInfo\\Translation"),206(LPVOID*)&pLangInfo, &len))207{208retval = GetLastError();209goto cleanup;210}211212213cp += wsprintf(szVerQ,214TEXT("\\StringFileInfo\\%04x%04x\\"),215LOWORD(*pLangInfo), HIWORD(*pLangInfo));216217lstrcpy(cp, sname_version);218if (!VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szVersion, &len))219{220retval = GetLastError() || ERROR_NOT_ENOUGH_MEMORY;221goto cleanup;222}223TCHAR version[100];224_sntprintf(version, sizeof(version), TEXT("MIT Kerberos Version %s"), szVersion);225version[sizeof(version) - 1] = 0;226GetDlgItem(id_version)->SetWindowText(version);227228lstrcpy(cp, sname_copyright);229if (!VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szCopyright, &len))230{231retval = GetLastError() || ERROR_NOT_ENOUGH_MEMORY;232goto cleanup;233}234GetDlgItem(id_copyright)->SetWindowText(szCopyright);235236cleanup:237if (pVersionInfo)238free(pVersionInfo);239return retval;240}241242BOOL CLeashAboutBox::OnInitDialog()243{244CDialog::OnInitDialog();245246// XXX - we need to add some sensible behavior on error.247// We need to get the version info and display it...248SetVersionInfo(IDC_ABOUT_VERSION, IDC_ABOUT_COPYRIGHT);249250if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)251m_missingFileError = TRUE;252253if (m_bListModules) {254m_radio_LeashDLLs.SetCheck(TRUE);255OnLeashModules();256257HighlightFirstItem();258259if (!CLeashApp::m_hPsapi)260GetDlgItem(IDC_PROPERTIES)->EnableWindow(FALSE);261} else {262m_radio_LeashDLLs.ShowWindow(SW_HIDE);263GetDlgItem(IDC_NOT_LOADED_MODULES)->ShowWindow(SW_HIDE);264GetDlgItem(IDC_ALL_MODULES)->ShowWindow(SW_HIDE);265GetDlgItem(IDC_PROPERTIES)->ShowWindow(SW_HIDE);266GetDlgItem(IDC_STATIC_MODULES_LOADED)->ShowWindow(SW_HIDE);267GetDlgItem(IDC_STATIC_NO_OF_MODULES)->ShowWindow(SW_HIDE);268m_LB_DLLsLoaded.ShowWindow(SW_HIDE);269// shrink window, move 'OK' button270const int hideDiff = 150;271RECT okRect;272CWnd* pOK = GetDlgItem(IDOK);273pOK->GetWindowRect(&okRect);274ScreenToClient(&okRect);275pOK->SetWindowPos(0, okRect.left, okRect.top - hideDiff,2760, 0, SWP_NOZORDER | SWP_NOSIZE);277RECT dlgRect;278GetWindowRect( &dlgRect );279280SetWindowPos(0,0,0,281dlgRect.right-dlgRect.left,282dlgRect.bottom-dlgRect.top - hideDiff,283SWP_NOZORDER|SWP_NOMOVE);284}285return TRUE; // return TRUE unless you set the focus to a control286// EXCEPTION: OCX Property Pages should return FALSE287}288289void CLeashAboutBox::OnSelchangeLeashModuleLb()290{291}292293void CLeashAboutBox::OnAllModules()294{295if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)296return; //error297298m_LB_DLLsLoaded.ResetContent();299300if (!CLeashApp::m_hPsapi)301GetModules95(GetCurrentProcessId());302//m_LB_DLLsLoaded.AddString("Doesn't work in Windows 95");303else304GetModulesNT(GetCurrentProcessId());305306HighlightFirstItem();307}308309void CLeashAboutBox::OnLeashModules()310{311if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)312return; // error313314m_LB_DLLsLoaded.ResetContent();315316if (!CLeashApp::m_hPsapi)317GetModules95(GetCurrentProcessId(), FALSE);318//m_LB_DLLsLoaded.AddString("Doesn't work in Windows 95");319else320GetModulesNT(GetCurrentProcessId(), FALSE);321322HighlightFirstItem();323}324325void CLeashAboutBox::OnNotLoadedModules()326{327m_LB_DLLsLoaded.ResetContent();328329if (!CLeashApp::m_hKrb5DLL)330m_LB_DLLsLoaded.AddString(KERB5DLL);331332HighlightFirstItem();333}334335void CLeashAboutBox::OnDblclkLeashModuleLb()336{337m_LB_DLLsLoaded.GetText(m_LB_DLLsLoaded.GetCurSel(), m_fileItem);338339SHELLEXECUTEINFO sei;340ZeroMemory(&sei,sizeof(sei));341sei.cbSize = sizeof(sei);342sei.lpFile = m_fileItem;343sei.lpVerb = "properties";344sei.fMask = SEE_MASK_INVOKEIDLIST;345346if (!ShellExecuteEx(&sei))347{348MessageBox("Can't find selected file or Properties dialog", "Error",349MB_OK);350}351}352353void CLeashAboutBox::OnProperties()354{355OnDblclkLeashModuleLb();356}357358void CLeashAboutBox::OnSetfocusLeashModuleLb()359{360if (m_LB_DLLsLoaded.GetCount())361m_propertiesButton.EnableWindow(TRUE);362}363364BOOL CLeashAboutBox::PreTranslateMessage(MSG* pMsg)365{366if (m_missingFileError)367{368::MessageBox(NULL, "OnInitDialog::We can't find file\"PSAPI.DLL\" "369"or \"KERNEL32.DLL\"!!!\n"370"About Box will not work properly.",371"Error", MB_OK);372373m_missingFileError = FALSE;374}375return CDialog::PreTranslateMessage(pMsg);376}377378379