1
//*****************************************************************************
2
// File: LeashAboutBox.cpp
3
// By: Arthur David Leather
5
// Copyright: @1998 Massachusetts Institute of Technology - All rights
7
// Description: CPP file for LeashAboutBox.h. Contains variables and functions
8
// for the Leash About Box Dialog Box
12
// MM/DD/YY Inits Description of Change
13
// 12/02/98 ADL Original
14
//*****************************************************************************
19
#include "LeashAboutBox.h"
27
static char THIS_FILE[] = __FILE__;
30
/////////////////////////////////////////////////////////////////////////////
31
// CLeashAboutBox dialog
34
CLeashAboutBox::CLeashAboutBox(CWnd* pParent /*=NULL*/)
35
: CDialog(CLeashAboutBox::IDD, pParent)
37
m_missingFileError = FALSE;
39
//{{AFX_DATA_INIT(CLeashAboutBox)
45
void CLeashAboutBox::DoDataExchange(CDataExchange* pDX)
47
CDialog::DoDataExchange(pDX);
48
//{{AFX_DATA_MAP(CLeashAboutBox)
49
DDX_Control(pDX, IDC_PROPERTIES, m_propertiesButton);
50
DDX_Control(pDX, IDC_LEASH_MODULES, m_radio_LeashDLLs);
51
DDX_Control(pDX, IDC_LEASH_MODULE_LB, m_LB_DLLsLoaded);
52
DDX_LBString(pDX, IDC_LEASH_MODULE_LB, m_fileItem);
57
BEGIN_MESSAGE_MAP(CLeashAboutBox, CDialog)
58
//{{AFX_MSG_MAP(CLeashAboutBox)
60
ON_LBN_SELCHANGE(IDC_LEASH_MODULE_LB, OnSelchangeLeashModuleLb)
61
ON_BN_CLICKED(IDC_ALL_MODULES, OnAllModules)
62
ON_BN_CLICKED(IDC_LEASH_MODULES, OnLeashModules)
63
ON_LBN_DBLCLK(IDC_LEASH_MODULE_LB, OnDblclkLeashModuleLb)
64
ON_BN_CLICKED(IDC_PROPERTIES, OnProperties)
65
ON_LBN_SETFOCUS(IDC_LEASH_MODULE_LB, OnSetfocusLeashModuleLb)
66
ON_BN_CLICKED(IDC_NOT_LOADED_MODULES, OnNotLoadedModules)
70
/////////////////////////////////////////////////////////////////////////////
71
// CLeashAboutBox message handlers
73
void CLeashAboutBox::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
75
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
78
BOOL CLeashAboutBox::GetModules95(DWORD processID, BOOL allModules)
80
char szModNames[1024];
81
MODULEENTRY32 me32 = {0};
82
HANDLE hProcessSnap = NULL;
84
hProcessSnap = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processID);
85
if (hProcessSnap == (HANDLE)-1)
88
me32.dwSize = sizeof(MODULEENTRY32);
89
if (pModule32First(hProcessSnap, &me32))
93
lstrcpy(szModNames, me32.szExePath);
98
if (!strstr(szModNames, "SYSTEM"))
99
m_LB_DLLsLoaded.AddString(me32.szExePath);
102
m_LB_DLLsLoaded.AddString(me32.szExePath);
104
while (pModule32Next(hProcessSnap, &me32));
110
void CLeashAboutBox::GetModulesNT(DWORD processID, BOOL allModules)
112
char checkName[1024];
118
// Get a list of all the modules in this process.
119
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
122
if (pEnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
124
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
126
char szModName[2048];
128
// Get the full path to the module's file.
129
if (pGetModuleFileNameEx(hProcess, hMods[i], szModName,
132
lstrcpy(checkName, szModName);
137
if (!strstr(checkName, "SYSTEM32"))
138
m_LB_DLLsLoaded.AddString(szModName);
141
m_LB_DLLsLoaded.AddString(szModName);
146
CloseHandle(hProcess);
149
void CLeashAboutBox::HighlightFirstItem()
151
UINT numModules = m_LB_DLLsLoaded.GetCount();
152
CHAR numModulesBuffer [25];
153
_itoa(numModules, numModulesBuffer, 10);
157
m_LB_DLLsLoaded.SetCurSel(0);
158
m_propertiesButton.EnableWindow();
161
m_propertiesButton.EnableWindow(FALSE);
163
GetDlgItem(IDC_STATIC_NO_OF_MODULES)->SetWindowText(numModulesBuffer);
167
CLeashAboutBox::SetVersionInfo(
172
TCHAR filename[1024];
173
DWORD dwVersionHandle;
174
LPVOID pVersionInfo = 0;
176
LPDWORD pLangInfo = 0;
177
LPTSTR szVersion = 0;
178
LPTSTR szCopyright = 0;
180
TCHAR sname_version[] = TEXT("FileVersion");
181
TCHAR sname_copyright[] = TEXT("LegalCopyright");
182
TCHAR szVerQ[(sizeof("\\StringFileInfo\\12345678\\") +
183
max(sizeof(sname_version) / sizeof(TCHAR),
184
sizeof(sname_copyright) / sizeof(TCHAR)))];
187
if (!GetModuleFileName(NULL, filename, sizeof(filename)))
188
return GetLastError();
190
DWORD size = GetFileVersionInfoSize(filename, &dwVersionHandle);
193
return GetLastError();
195
pVersionInfo = malloc(size);
197
return ERROR_NOT_ENOUGH_MEMORY;
199
if (!GetFileVersionInfo(filename, dwVersionHandle, size, pVersionInfo))
201
retval = GetLastError();
205
if (!VerQueryValue(pVersionInfo, TEXT("\\VarFileInfo\\Translation"),
206
(LPVOID*)&pLangInfo, &len))
208
retval = GetLastError();
213
cp += wsprintf(szVerQ,
214
TEXT("\\StringFileInfo\\%04x%04x\\"),
215
LOWORD(*pLangInfo), HIWORD(*pLangInfo));
217
lstrcpy(cp, sname_version);
218
if (!VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szVersion, &len))
220
retval = GetLastError() || ERROR_NOT_ENOUGH_MEMORY;
224
_sntprintf(version, sizeof(version), TEXT("Leash Version %s"), szVersion);
225
version[sizeof(version) - 1] = 0;
226
GetDlgItem(id_version)->SetWindowText(version);
228
lstrcpy(cp, sname_copyright);
229
if (!VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szCopyright, &len))
231
retval = GetLastError() || ERROR_NOT_ENOUGH_MEMORY;
234
GetDlgItem(id_copyright)->SetWindowText(szCopyright);
242
BOOL CLeashAboutBox::OnInitDialog()
244
CDialog::OnInitDialog();
246
// XXX - we need to add some sensible behavior on error.
247
SetVersionInfo(IDC_ABOUT_VERSION, IDC_ABOUT_COPYRIGHT);
249
if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)
250
m_missingFileError = TRUE;
252
m_radio_LeashDLLs.SetCheck(TRUE);
255
// We need to get the version info and display it...
256
HighlightFirstItem();
258
if (!CLeashApp::m_hPsapi)
259
GetDlgItem(IDC_PROPERTIES)->EnableWindow(FALSE);
261
return TRUE; // return TRUE unless you set the focus to a control
262
// EXCEPTION: OCX Property Pages should return FALSE
265
void CLeashAboutBox::OnSelchangeLeashModuleLb()
269
void CLeashAboutBox::OnAllModules()
271
if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)
274
m_LB_DLLsLoaded.ResetContent();
276
if (!CLeashApp::m_hPsapi)
277
GetModules95(GetCurrentProcessId());
278
//m_LB_DLLsLoaded.AddString("Doesn't work in Windows 95");
280
GetModulesNT(GetCurrentProcessId());
282
HighlightFirstItem();
285
void CLeashAboutBox::OnLeashModules()
287
if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)
290
m_LB_DLLsLoaded.ResetContent();
292
if (!CLeashApp::m_hPsapi)
293
GetModules95(GetCurrentProcessId(), FALSE);
294
//m_LB_DLLsLoaded.AddString("Doesn't work in Windows 95");
296
GetModulesNT(GetCurrentProcessId(), FALSE);
298
HighlightFirstItem();
301
void CLeashAboutBox::OnNotLoadedModules()
303
m_LB_DLLsLoaded.ResetContent();
306
if (!CLeashApp::m_hKrb4DLL)
307
m_LB_DLLsLoaded.AddString(KERB4DLL);
310
if (!CLeashApp::m_hKrb5DLL)
311
m_LB_DLLsLoaded.AddString(KERB5DLL);
313
// NOTE: If the snippet below is commented back in,
315
// if (!CLeashApp::m_hAfsDLL)
316
// m_LB_DLLsLoaded.AddString(AFSAuthentDLL());
318
//if (!CLeashApp::m_hAfsDLL)
319
//m_LB_DLLsLoaded.AddString(ASFDLL);
321
HighlightFirstItem();
324
void CLeashAboutBox::OnDblclkLeashModuleLb()
326
m_LB_DLLsLoaded.GetText(m_LB_DLLsLoaded.GetCurSel(), m_fileItem);
328
SHELLEXECUTEINFO sei;
329
ZeroMemory(&sei,sizeof(sei));
330
sei.cbSize = sizeof(sei);
331
sei.lpFile = m_fileItem;
332
sei.lpVerb = "properties";
333
sei.fMask = SEE_MASK_INVOKEIDLIST;
335
if (!ShellExecuteEx(&sei))
337
MessageBox("Can't find selected file or Properties dialog", "Error",
342
void CLeashAboutBox::OnProperties()
344
OnDblclkLeashModuleLb();
347
void CLeashAboutBox::OnSetfocusLeashModuleLb()
349
if (m_LB_DLLsLoaded.GetCount())
350
m_propertiesButton.EnableWindow(TRUE);
353
BOOL CLeashAboutBox::PreTranslateMessage(MSG* pMsg)
355
if (m_missingFileError)
357
::MessageBox(NULL, "OnInitDialog::We can't find file\"PSAPI.DLL\" "
358
"or \"KERNEL32.DLL\"!!!\n"
359
"About Box will not work properly.",
362
m_missingFileError = FALSE;
364
return CDialog::PreTranslateMessage(pMsg);