source: trunk/Utilities/RotView/MainDialog.h @ 156

Last change on this file since 156 was 156, checked in by roman, 10 years ago
File size: 11.6 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2012-2013
3// Created by Roman Ryltsov roman@alax.info
4
5#pragma once
6
7#include <atlsecurity.h>
8#include "AboutDialog.h"
9
10static BOOL IsAdministrator()
11{
12        bool bIsMember = FALSE;
13        return CAccessToken().CheckTokenMembership(Sids::Admins(), &bIsMember) && bIsMember;
14}
15
16////////////////////////////////////////////////////////////
17// CMainDialog
18
19class CMainDialog : 
20        public CDialogImpl<CMainDialog>,
21        public CDialogResize<CMainDialog>
22{
23public:
24        enum { IDD = IDD_MAIN };
25
26BEGIN_MSG_MAP_EX(CMainDialog)
27        //CHAIN_MSG_MAP(CDialogImpl<CMainDialog>)
28        CHAIN_MSG_MAP(CDialogResize<CMainDialog>)
29        MSG_WM_INITDIALOG(OnInitDialog)
30        MSG_WM_DESTROY(OnDestroy)
31        MSG_LVN_GETDISPINFO(IDC_MAIN_ENTRY, OnEntryListViewGetDispInfo)
32        MSG_LVN_GETINFOTIP(IDC_MAIN_ENTRY, OnEntryListViewGetInfoTip)
33        MSG_LVN_ITEMCHANGED(IDC_MAIN_ENTRY, OnEntryListViewItemChanged)
34        MSG_LVN_DBLCLK(IDC_MAIN_ENTRY, OnEntryListViewDblClk)
35        MSG_WM_SYSCOMMAND(OnSysCommand)
36        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCommand)
37        COMMAND_ID_HANDLER_EX(IDC_MAIN_REFRESH, OnRefreshButtonClicked)
38        COMMAND_ID_HANDLER_EX(IDC_MAIN_PROBE, OnProbeButtonClicked)
39        REFLECT_NOTIFICATIONS()
40END_MSG_MAP()
41
42BEGIN_DLGRESIZE_MAP(CMainDialog)
43        DLGRESIZE_CONTROL(IDC_MAIN_ENTRY, DLSZ_SIZE_X | DLSZ_SIZE_Y)
44        DLGRESIZE_CONTROL(IDC_MAIN_REFRESH, DLSZ_MOVE_Y)
45        DLGRESIZE_CONTROL(IDC_MAIN_PROBE, DLSZ_MOVE_Y)
46        DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X | DLSZ_MOVE_Y)
47END_DLGRESIZE_MAP()
48
49public:
50
51        ////////////////////////////////////////////////////////
52        // CEntry
53
54        class CEntry
55        {
56        public:
57                CComPtr<IMoniker> m_pMoniker;
58                CStringW m_sDisplayName;
59                ULONGLONG m_nLastChangeTime;
60                CString m_sClassDescription;
61                CString m_sApplicationDescription;
62                CPath m_sPath;
63                HRESULT m_nGetObjectResult;
64
65        public:
66        // CEntry
67                CEntry() :
68                        m_nLastChangeTime(0),
69                        m_nGetObjectResult(S_FALSE)
70                {
71                }
72                CString GetGetObjectResultString() const
73                {
74                        CString sString;
75                        switch(m_nGetObjectResult)
76                        {
77                        case S_OK:
78                                sString = _T("Succeeded");
79                                break;
80                        case S_FALSE:
81                                //sString = ...
82                                break;
83                        default:
84                                sString = AtlFormatSystemMessage(m_nGetObjectResult).TrimRight(_T("\t\n\r ."));
85                                if(sString.IsEmpty())
86                                        sString = AtlFormatString(_T("Error 0x%08x"), m_nGetObjectResult);
87                                else
88                                        sString = AtlFormatString(_T("%s (0x%08x)"), sString, m_nGetObjectResult);
89                        }
90                        return sString;
91                }
92        };
93
94private:
95        CRoListViewT<CEntry, CRoListControlDataTraitsT> m_EntryListView;
96        CButton m_ProbeButton;
97        CComPtr<IRunningObjectTable> m_pRunningObjectTable;
98
99public:
100// CMainDialog
101        CMainDialog()
102        {
103        }
104        VOID UpdateEntryListView()
105        {
106                CRoArrayT<CEntry> EntryArray;
107                {
108                        CComPtr<IRunningObjectTable> pRunningObjectTable;
109                        __C(GetRunningObjectTable(0, &pRunningObjectTable));
110                        CComPtr<IEnumMoniker> pEnumMoniker;
111                        __C(pRunningObjectTable->EnumRunning(&pEnumMoniker));
112                        CComPtr<IMalloc> pMalloc;
113                        __C(CoGetMalloc(1, &pMalloc));
114                        CComPtr<IMoniker> pMoniker;
115                        while(pEnumMoniker->Next(1, &pMoniker, NULL) == S_OK)
116                        {
117                                _ATLTRY
118                                {
119                                        CEntry Entry;
120                                        Entry.m_pMoniker = pMoniker;
121                                        CComPtr<IBindCtx> pBindCtx;
122                                        __C(CreateBindCtx(0, &pBindCtx));
123                                        LPOLESTR pszDisplayName = NULL;
124                                        __C(pMoniker->GetDisplayName(pBindCtx, NULL, &pszDisplayName));
125                                        Entry.m_sDisplayName = pszDisplayName;
126                                        _Z4(atlTraceGeneral, 4, _T("Entry.m_sDisplayName %ls\n"), Entry.m_sDisplayName);
127                                        pMalloc->Free(pszDisplayName);
128                                        _ATLTRY
129                                        {
130                                                __C(pRunningObjectTable->GetTimeOfLastChange(pMoniker, &reinterpret_cast<FILETIME&>(Entry.m_nLastChangeTime)));
131                                                CLSID ClassIdentifier;
132                                                if(!Entry.m_sDisplayName.IsEmpty() && Entry.m_sDisplayName[0] == L'!')
133                                                        if(_PersistHelper::ClassIdentifierFromString((LPCWSTR) Entry.m_sDisplayName + 1, ClassIdentifier))
134                                                        {
135                                                                CString sClassIdentifierString(_PersistHelper::StringFromIdentifier(ClassIdentifier));
136                                                                Entry.m_sClassDescription = _RegKeyHelper::QueryStringValue(HKEY_CLASSES_ROOT, AtlFormatString(_T("CLSID\\%s"), sClassIdentifierString));
137                                                                #pragma region Application Identifier
138                                                                CString sApplicationIdentifierString = _RegKeyHelper::QueryStringValue(HKEY_CLASSES_ROOT, AtlFormatString(_T("CLSID\\%s"), sClassIdentifierString), _T("AppId"));
139                                                                CLSID ApplicationClassIdentifier;
140                                                                if(_PersistHelper::ClassIdentifierFromString(CT2CW(sApplicationIdentifierString), ApplicationClassIdentifier))
141                                                                        Entry.m_sApplicationDescription = _RegKeyHelper::QueryStringValue(HKEY_CLASSES_ROOT, AtlFormatString(_T("AppID\\%ls"), _PersistHelper::StringFromIdentifier(ApplicationClassIdentifier)));
142                                                                #pragma endregion
143                                                                #pragma region Path
144                                                                Entry.m_sPath = (LPCTSTR) _RegKeyHelper::QueryStringValue(HKEY_CLASSES_ROOT, AtlFormatString(_T("CLSID\\%s\\InprocServer32"), sClassIdentifierString));
145                                                                if(!_tcslen(Entry.m_sPath))
146                                                                        Entry.m_sPath = (LPCTSTR) _RegKeyHelper::QueryStringValue(HKEY_CLASSES_ROOT, AtlFormatString(_T("CLSID\\%s\\LocalServer32"), sClassIdentifierString));
147                                                                #pragma endregion
148                                                        }
149                                        }
150                                        _ATLCATCHALL()
151                                        {
152                                                _Z_EXCEPTION();
153                                        }
154                                        _W(EntryArray.Add(Entry) >= 0);
155                                }
156                                _ATLCATCHALL()
157                                {
158                                        _Z_EXCEPTION();
159                                }
160                                pMoniker.Release();
161                        }
162                        m_pRunningObjectTable = pRunningObjectTable;
163                }
164                m_EntryListView.DeleteAllItems();
165                for(SIZE_T nIndex = 0; nIndex < EntryArray.GetCount(); nIndex++)
166                {
167                        const INT nItem = m_EntryListView.InsertItem((INT) nIndex, EntryArray[nIndex]);
168                        _A(nItem >= 0);
169                }
170                UpdateControls();
171        }
172        VOID UpdateControls()
173        {
174                BOOL bCanProbe = FALSE;
175                if(m_pRunningObjectTable)
176                        for(INT nItem = m_EntryListView.GetNextItem(-1, LVNI_SELECTED); nItem >= 0 && !bCanProbe; nItem = m_EntryListView.GetNextItem(nItem, LVNI_SELECTED))
177                        {
178                                CEntry& Entry = m_EntryListView.GetItemData(nItem);
179                                if(Entry.m_pMoniker)
180                                        bCanProbe = TRUE;
181                        }
182                m_ProbeButton.EnableWindow(bCanProbe);
183        }
184
185// Window Message Handelrs
186        LRESULT OnInitDialog(HWND, LPARAM)
187        {
188                CWaitCursor WaitCursor;
189                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)), TRUE);
190                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)), FALSE);
191                CMenuHandle Menu = GetSystemMenu(FALSE);
192                _W(Menu.AppendMenu(MF_SEPARATOR));
193                _W(Menu.AppendMenu(MF_STRING, ID_APP_ABOUT, _T("&About...")));
194                {
195                        CString sCaption;
196                        GetWindowText(sCaption);
197                        CRoArrayT<CString> Array;
198                        #if defined(_WIN64)
199                                Array.Add(_T("64-bit"));
200                        #else
201                                if(SafeIsWow64Process())
202                                        Array.Add(_T("32-bit"));
203                        #endif // defined(_WIN64)
204                        if(GetOsVersion() >= 0x00060000 && IsAdministrator())
205                                Array.Add(_T("Administrator"));
206                        if(!Array.IsEmpty())
207                        {
208                                sCaption.Append(AtlFormatString(_T(" (%s)"), _StringHelper::Join(Array, _T(", "))));
209                                SetWindowText(sCaption);
210                        }
211                }
212                m_EntryListView.Initialize(GetDlgItem(IDC_MAIN_ENTRY));
213                //m_EntryListView.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
214                m_ProbeButton = GetDlgItem(IDC_MAIN_PROBE);
215                DlgResize_Init(TRUE);
216                #pragma region Default Size
217                CRect Position;
218                _W(GetWindowRect(Position));
219                Position.right += Position.Width() >> 1;
220                Position.bottom += Position.Height() >> 1;
221                _W(MoveWindow(Position));
222                #pragma endregion
223                _W(CenterWindow());
224                UpdateEntryListView();
225                return TRUE;
226        }
227        LRESULT OnDestroy() throw()
228        {
229                m_pRunningObjectTable.Release();
230                return 0;
231        }
232        LRESULT OnEntryListViewGetDispInfo(NMLVDISPINFO* pHeader)
233        {
234                if(pHeader->item.mask & LVIF_TEXT)
235                {
236                        const CEntry& Entry = m_EntryListView.DataFromParameter(pHeader->item.lParam);
237                        INT nSubItem = pHeader->item.iSubItem;
238                        CString& sTextBuffer = m_EntryListView.GetTextBufferString(TRUE);
239                        switch(nSubItem)
240                        {
241                        case 1: // Class Description
242                                sTextBuffer = Entry.m_sClassDescription;
243                                break;
244                        case 2: // Probe Result
245                                sTextBuffer = Entry.GetGetObjectResultString();
246                                break;
247                        case 3: // Change Time
248                                if(Entry.m_nLastChangeTime)
249                                {
250                                        FILETIME LocalTime;
251                                        _W(FileTimeToLocalFileTime(&reinterpret_cast<const FILETIME&>(Entry.m_nLastChangeTime), &LocalTime));
252                                        sTextBuffer = _StringHelper::FormatDateTime(LocalTime);
253                                }
254                                break;
255                        default: // Display Name
256                                sTextBuffer = CString(Entry.m_sDisplayName);
257                        }
258                        sTextBuffer.TrimRight(_T("\t\n\r ."));
259                        pHeader->item.pszText = m_EntryListView.GetTextBuffer();
260                }
261                //if(pHeader->item.mask & LVIF_IMAGE)
262                //      pHeader->item.iImage = 0;
263                return 0;
264        }
265        LRESULT OnEntryListViewGetInfoTip(NMLVGETINFOTIP* pHeader)
266        {
267                const CEntry& Entry = m_EntryListView.GetItemData(pHeader->iItem);
268                CString& sTextBuffer = m_EntryListView.GetTextBufferString(TRUE);
269                sTextBuffer.AppendFormat(_T("Display Name: %s\r\n"), Entry.m_sDisplayName);
270                if(!Entry.m_sClassDescription.IsEmpty())
271                        sTextBuffer.AppendFormat(_T("Class Description: %s\r\n"), Entry.m_sClassDescription);
272                if(!Entry.m_sApplicationDescription.IsEmpty())
273                        sTextBuffer.AppendFormat(_T("Application Description: %s\r\n"), Entry.m_sApplicationDescription);
274                if(_tcslen(Entry.m_sPath))
275                        sTextBuffer.AppendFormat(_T("Path: %s\r\n"), Entry.m_sPath);
276                if(Entry.m_nLastChangeTime)
277                {
278                        FILETIME LocalTime;
279                        _W(FileTimeToLocalFileTime(&reinterpret_cast<const FILETIME&>(Entry.m_nLastChangeTime), &LocalTime));
280                        CString sTime = _StringHelper::FormatDateTime(LocalTime);
281                        //sTime.AppendFormat(_T(" (%d seconds ago)"), (ULONG) ((CMsAccurateFileTime::GetTime() - Entry.m_nLastChangeTime) / (1000 * 10000i64)));
282                        sTextBuffer.AppendFormat(_T("Last Change Time: %s\r\n"), sTime);
283                }
284                if(Entry.m_nGetObjectResult != S_FALSE)
285                        sTextBuffer.AppendFormat(_T("Probe Result: %s\r\n"), Entry.GetGetObjectResultString());
286                sTextBuffer.TrimRight(_T("\t\n\r ."));
287                _tcsncpy_s(pHeader->pszText, pHeader->cchTextMax, m_EntryListView.GetTextBuffer(), _TRUNCATE);
288                #pragma region Clipboard
289                if(GetKeyState(VK_CONTROL) < 0 && GetKeyState(VK_SHIFT) < 0)
290                {
291                        SetClipboardText(m_hWnd, sTextBuffer);
292                        MessageBeep(MB_OK);
293                }
294                #pragma endregion
295                return 0;
296        }
297        LRESULT OnEntryListViewItemChanged(NMLISTVIEW* pHeader)
298        {
299                UpdateControls();
300                return 0;
301        }
302        LRESULT OnEntryListViewDblClk(NMITEMACTIVATE*)
303        {
304                m_ProbeButton.Click();
305                return 0;
306        }
307        LRESULT OnSysCommand(UINT nCommand, CPoint)
308        {
309                switch(nCommand)
310                {
311                case ID_APP_ABOUT:
312                        {
313                                CAboutDialog Dialog;
314                                Dialog.DoModal(m_hWnd);
315                        }
316                        break;
317                default:
318                        SetMsgHandled(FALSE);
319                }
320                return 0;
321        }
322        LRESULT OnCommand(UINT, INT nIdentifier, HWND)
323        {
324                _W(EndDialog(nIdentifier));
325                return 0;
326        }
327        LRESULT OnRefreshButtonClicked(UINT, INT, HWND)
328        {
329                CWaitCursor WaitCursor;
330                UpdateEntryListView();
331                return 0;
332        }
333        LRESULT OnProbeButtonClicked(UINT, INT, HWND)
334        {
335                CWaitCursor WaitCursor;
336                if(m_pRunningObjectTable)
337                {
338                        BOOL bUpdated = FALSE;
339                        for(INT nItem = m_EntryListView.GetNextItem(-1, LVNI_SELECTED); nItem >= 0; nItem = m_EntryListView.GetNextItem(nItem, LVNI_SELECTED))
340                        {
341                                CEntry& Entry = m_EntryListView.GetItemData(nItem);
342                                _ATLTRY
343                                {
344                                        if(Entry.m_pMoniker)
345                                        {
346                                                CComPtr<IUnknown> pUnknown;
347                                                Entry.m_nGetObjectResult = m_pRunningObjectTable->GetObject(Entry.m_pMoniker, &pUnknown);
348                                                bUpdated = TRUE;
349                                        }
350                                }
351                                _ATLCATCH(Exception)
352                                {
353                                        _Z_ATLEXCEPTION(Exception);
354                                        Entry.m_nGetObjectResult = (HRESULT) Exception;
355                                        bUpdated = TRUE;
356                                }
357                        }
358                        if(bUpdated)
359                                m_EntryListView.RedrawItems(0, m_EntryListView.GetItemCount() - 1);
360                }
361                return 0;
362        }
363};
Note: See TracBrowser for help on using the repository browser.