Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/krb5/src/windows/leash/LeashAboutBox.cpp
34907 views
1
//*****************************************************************************
2
// File: LeashAboutBox.cpp
3
// By: Arthur David Leather
4
// Created: 12/02/98
5
// Copyright: @1998 Massachusetts Institute of Technology - All rights
6
// reserved.
7
// Description: CPP file for LeashAboutBox.h. Contains variables and functions
8
// for the Leash About Box Dialog Box
9
//
10
// History:
11
//
12
// MM/DD/YY Inits Description of Change
13
// 12/02/98 ADL Original
14
//*****************************************************************************
15
16
17
#include "stdafx.h"
18
#include "leash.h"
19
#include "LeashAboutBox.h"
20
#include "reminder.h"
21
#include "lglobals.h"
22
#include "psapi.h"
23
24
#ifdef _DEBUG
25
#define new DEBUG_NEW
26
#undef THIS_FILE
27
static char THIS_FILE[] = __FILE__;
28
#endif
29
30
/////////////////////////////////////////////////////////////////////////////
31
// CLeashAboutBox dialog
32
33
34
CLeashAboutBox::CLeashAboutBox(CWnd* pParent /*=NULL*/)
35
: CDialog(CLeashAboutBox::IDD, pParent)
36
, m_bListModules(FALSE)
37
{
38
m_missingFileError = FALSE;
39
40
//{{AFX_DATA_INIT(CLeashAboutBox)
41
m_fileItem = _T("");
42
//}}AFX_DATA_INIT
43
}
44
45
46
void CLeashAboutBox::DoDataExchange(CDataExchange* pDX)
47
{
48
CDialog::DoDataExchange(pDX);
49
//{{AFX_DATA_MAP(CLeashAboutBox)
50
DDX_Control(pDX, IDC_PROPERTIES, m_propertiesButton);
51
DDX_Control(pDX, IDC_LEASH_MODULES, m_radio_LeashDLLs);
52
DDX_Control(pDX, IDC_LEASH_MODULE_LB, m_LB_DLLsLoaded);
53
DDX_LBString(pDX, IDC_LEASH_MODULE_LB, m_fileItem);
54
//}}AFX_DATA_MAP
55
}
56
57
58
BEGIN_MESSAGE_MAP(CLeashAboutBox, CDialog)
59
//{{AFX_MSG_MAP(CLeashAboutBox)
60
ON_WM_HSCROLL()
61
ON_LBN_SELCHANGE(IDC_LEASH_MODULE_LB, OnSelchangeLeashModuleLb)
62
ON_BN_CLICKED(IDC_ALL_MODULES, OnAllModules)
63
ON_BN_CLICKED(IDC_LEASH_MODULES, OnLeashModules)
64
ON_LBN_DBLCLK(IDC_LEASH_MODULE_LB, OnDblclkLeashModuleLb)
65
ON_BN_CLICKED(IDC_PROPERTIES, OnProperties)
66
ON_LBN_SETFOCUS(IDC_LEASH_MODULE_LB, OnSetfocusLeashModuleLb)
67
ON_BN_CLICKED(IDC_NOT_LOADED_MODULES, OnNotLoadedModules)
68
//}}AFX_MSG_MAP
69
END_MESSAGE_MAP()
70
;
71
/////////////////////////////////////////////////////////////////////////////
72
// CLeashAboutBox message handlers
73
74
void CLeashAboutBox::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
75
{
76
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
77
}
78
79
BOOL CLeashAboutBox::GetModules95(DWORD processID, BOOL allModules)
80
{
81
char szModNames[1024];
82
MODULEENTRY32 me32 = {0};
83
HANDLE hProcessSnap = NULL;
84
85
hProcessSnap = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processID);
86
if (hProcessSnap == (HANDLE)-1)
87
return FALSE;
88
89
me32.dwSize = sizeof(MODULEENTRY32);
90
if (pModule32First(hProcessSnap, &me32))
91
{
92
do
93
{
94
lstrcpy(szModNames, me32.szExePath);
95
strupr(szModNames);
96
97
if (!allModules)
98
{
99
if (!strstr(szModNames, "SYSTEM"))
100
m_LB_DLLsLoaded.AddString(me32.szExePath);
101
}
102
else
103
m_LB_DLLsLoaded.AddString(me32.szExePath);
104
}
105
while (pModule32Next(hProcessSnap, &me32));
106
}
107
108
return TRUE;
109
}
110
111
void CLeashAboutBox::GetModulesNT(DWORD processID, BOOL allModules)
112
{
113
char checkName[1024];
114
HMODULE hMods[1024];
115
HANDLE hProcess;
116
DWORD cbNeeded;
117
unsigned int i;
118
119
// Get a list of all the modules in this process.
120
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
121
FALSE, processID);
122
123
if (pEnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
124
{
125
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
126
{
127
char szModName[2048];
128
129
// Get the full path to the module's file.
130
if (pGetModuleFileNameEx(hProcess, hMods[i], szModName,
131
sizeof(szModName)))
132
{
133
lstrcpy(checkName, szModName);
134
strupr(checkName);
135
136
if (!allModules)
137
{
138
if (!strstr(checkName, "SYSTEM32"))
139
m_LB_DLLsLoaded.AddString(szModName);
140
}
141
else
142
m_LB_DLLsLoaded.AddString(szModName);
143
}
144
}
145
}
146
147
CloseHandle(hProcess);
148
}
149
150
void CLeashAboutBox::HighlightFirstItem()
151
{
152
UINT numModules = m_LB_DLLsLoaded.GetCount();
153
CHAR numModulesBuffer [25];
154
_itoa(numModules, numModulesBuffer, 10);
155
156
if (numModules)
157
{
158
m_LB_DLLsLoaded.SetCurSel(0);
159
m_propertiesButton.EnableWindow();
160
}
161
else
162
m_propertiesButton.EnableWindow(FALSE);
163
164
GetDlgItem(IDC_STATIC_NO_OF_MODULES)->SetWindowText(numModulesBuffer);
165
}
166
167
DWORD
168
CLeashAboutBox::SetVersionInfo(
169
UINT id_version,
170
UINT id_copyright
171
)
172
{
173
TCHAR filename[1024];
174
DWORD dwVersionHandle;
175
LPVOID pVersionInfo = 0;
176
DWORD retval = 0;
177
LPDWORD pLangInfo = 0;
178
LPTSTR szVersion = 0;
179
LPTSTR szCopyright = 0;
180
UINT len = 0;
181
TCHAR sname_version[] = TEXT("FileVersion");
182
TCHAR sname_copyright[] = TEXT("LegalCopyright");
183
TCHAR szVerQ[(sizeof("\\StringFileInfo\\12345678\\") +
184
max(sizeof(sname_version) / sizeof(TCHAR),
185
sizeof(sname_copyright) / sizeof(TCHAR)))];
186
TCHAR * cp = szVerQ;
187
188
if (!GetModuleFileName(NULL, filename, sizeof(filename)))
189
return GetLastError();
190
191
DWORD size = GetFileVersionInfoSize(filename, &dwVersionHandle);
192
193
if (!size)
194
return GetLastError();
195
196
pVersionInfo = malloc(size);
197
if (!pVersionInfo)
198
return ERROR_NOT_ENOUGH_MEMORY;
199
200
if (!GetFileVersionInfo(filename, dwVersionHandle, size, pVersionInfo))
201
{
202
retval = GetLastError();
203
goto cleanup;
204
}
205
206
if (!VerQueryValue(pVersionInfo, TEXT("\\VarFileInfo\\Translation"),
207
(LPVOID*)&pLangInfo, &len))
208
{
209
retval = GetLastError();
210
goto cleanup;
211
}
212
213
214
cp += wsprintf(szVerQ,
215
TEXT("\\StringFileInfo\\%04x%04x\\"),
216
LOWORD(*pLangInfo), HIWORD(*pLangInfo));
217
218
lstrcpy(cp, sname_version);
219
if (!VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szVersion, &len))
220
{
221
retval = GetLastError() || ERROR_NOT_ENOUGH_MEMORY;
222
goto cleanup;
223
}
224
TCHAR version[100];
225
_sntprintf(version, sizeof(version), TEXT("MIT Kerberos Version %s"), szVersion);
226
version[sizeof(version) - 1] = 0;
227
GetDlgItem(id_version)->SetWindowText(version);
228
229
lstrcpy(cp, sname_copyright);
230
if (!VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szCopyright, &len))
231
{
232
retval = GetLastError() || ERROR_NOT_ENOUGH_MEMORY;
233
goto cleanup;
234
}
235
GetDlgItem(id_copyright)->SetWindowText(szCopyright);
236
237
cleanup:
238
if (pVersionInfo)
239
free(pVersionInfo);
240
return retval;
241
}
242
243
BOOL CLeashAboutBox::OnInitDialog()
244
{
245
CDialog::OnInitDialog();
246
247
// XXX - we need to add some sensible behavior on error.
248
// We need to get the version info and display it...
249
SetVersionInfo(IDC_ABOUT_VERSION, IDC_ABOUT_COPYRIGHT);
250
251
if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)
252
m_missingFileError = TRUE;
253
254
if (m_bListModules) {
255
m_radio_LeashDLLs.SetCheck(TRUE);
256
OnLeashModules();
257
258
HighlightFirstItem();
259
260
if (!CLeashApp::m_hPsapi)
261
GetDlgItem(IDC_PROPERTIES)->EnableWindow(FALSE);
262
} else {
263
m_radio_LeashDLLs.ShowWindow(SW_HIDE);
264
GetDlgItem(IDC_NOT_LOADED_MODULES)->ShowWindow(SW_HIDE);
265
GetDlgItem(IDC_ALL_MODULES)->ShowWindow(SW_HIDE);
266
GetDlgItem(IDC_PROPERTIES)->ShowWindow(SW_HIDE);
267
GetDlgItem(IDC_STATIC_MODULES_LOADED)->ShowWindow(SW_HIDE);
268
GetDlgItem(IDC_STATIC_NO_OF_MODULES)->ShowWindow(SW_HIDE);
269
m_LB_DLLsLoaded.ShowWindow(SW_HIDE);
270
// shrink window, move 'OK' button
271
const int hideDiff = 150;
272
RECT okRect;
273
CWnd* pOK = GetDlgItem(IDOK);
274
pOK->GetWindowRect(&okRect);
275
ScreenToClient(&okRect);
276
pOK->SetWindowPos(0, okRect.left, okRect.top - hideDiff,
277
0, 0, SWP_NOZORDER | SWP_NOSIZE);
278
RECT dlgRect;
279
GetWindowRect( &dlgRect );
280
281
SetWindowPos(0,0,0,
282
dlgRect.right-dlgRect.left,
283
dlgRect.bottom-dlgRect.top - hideDiff,
284
SWP_NOZORDER|SWP_NOMOVE);
285
}
286
return TRUE; // return TRUE unless you set the focus to a control
287
// EXCEPTION: OCX Property Pages should return FALSE
288
}
289
290
void CLeashAboutBox::OnSelchangeLeashModuleLb()
291
{
292
}
293
294
void CLeashAboutBox::OnAllModules()
295
{
296
if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)
297
return; //error
298
299
m_LB_DLLsLoaded.ResetContent();
300
301
if (!CLeashApp::m_hPsapi)
302
GetModules95(GetCurrentProcessId());
303
//m_LB_DLLsLoaded.AddString("Doesn't work in Windows 95");
304
else
305
GetModulesNT(GetCurrentProcessId());
306
307
HighlightFirstItem();
308
}
309
310
void CLeashAboutBox::OnLeashModules()
311
{
312
if (!CLeashApp::m_hToolHelp32 && !CLeashApp::m_hPsapi)
313
return; // error
314
315
m_LB_DLLsLoaded.ResetContent();
316
317
if (!CLeashApp::m_hPsapi)
318
GetModules95(GetCurrentProcessId(), FALSE);
319
//m_LB_DLLsLoaded.AddString("Doesn't work in Windows 95");
320
else
321
GetModulesNT(GetCurrentProcessId(), FALSE);
322
323
HighlightFirstItem();
324
}
325
326
void CLeashAboutBox::OnNotLoadedModules()
327
{
328
m_LB_DLLsLoaded.ResetContent();
329
330
if (!CLeashApp::m_hKrb5DLL)
331
m_LB_DLLsLoaded.AddString(KERB5DLL);
332
333
HighlightFirstItem();
334
}
335
336
void CLeashAboutBox::OnDblclkLeashModuleLb()
337
{
338
m_LB_DLLsLoaded.GetText(m_LB_DLLsLoaded.GetCurSel(), m_fileItem);
339
340
SHELLEXECUTEINFO sei;
341
ZeroMemory(&sei,sizeof(sei));
342
sei.cbSize = sizeof(sei);
343
sei.lpFile = m_fileItem;
344
sei.lpVerb = "properties";
345
sei.fMask = SEE_MASK_INVOKEIDLIST;
346
347
if (!ShellExecuteEx(&sei))
348
{
349
MessageBox("Can't find selected file or Properties dialog", "Error",
350
MB_OK);
351
}
352
}
353
354
void CLeashAboutBox::OnProperties()
355
{
356
OnDblclkLeashModuleLb();
357
}
358
359
void CLeashAboutBox::OnSetfocusLeashModuleLb()
360
{
361
if (m_LB_DLLsLoaded.GetCount())
362
m_propertiesButton.EnableWindow(TRUE);
363
}
364
365
BOOL CLeashAboutBox::PreTranslateMessage(MSG* pMsg)
366
{
367
if (m_missingFileError)
368
{
369
::MessageBox(NULL, "OnInitDialog::We can't find file\"PSAPI.DLL\" "
370
"or \"KERNEL32.DLL\"!!!\n"
371
"About Box will not work properly.",
372
"Error", MB_OK);
373
374
m_missingFileError = FALSE;
375
}
376
return CDialog::PreTranslateMessage(pMsg);
377
}
378
379