Skip to content

Commit c39064a

Browse files
committed
WindowExplorer: Add inspect and open location menu
1 parent 973a761 commit c39064a

File tree

5 files changed

+144
-48
lines changed

5 files changed

+144
-48
lines changed

plugins/WindowExplorer/WindowExplorer.rc

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -130,47 +130,6 @@ BEGIN
130130
END
131131
#endif // APSTUDIO_INVOKED
132132

133-
134-
/////////////////////////////////////////////////////////////////////////////
135-
//
136-
// Menu
137-
//
138-
139-
IDR_WINDOW MENU
140-
BEGIN
141-
POPUP "Window"
142-
BEGIN
143-
MENUITEM "Bring to front", ID_WINDOW_BRINGTOFRONT
144-
MENUITEM "Restore", ID_WINDOW_RESTORE
145-
MENUITEM "Minimize", ID_WINDOW_MINIMIZE
146-
MENUITEM "Maximize", ID_WINDOW_MAXIMIZE
147-
MENUITEM "Close", ID_WINDOW_CLOSE
148-
MENUITEM SEPARATOR
149-
MENUITEM "Visible", ID_WINDOW_VISIBLE
150-
MENUITEM "Enabled", ID_WINDOW_ENABLED
151-
MENUITEM "Always on top", ID_WINDOW_ALWAYSONTOP
152-
POPUP "Opacity"
153-
BEGIN
154-
MENUITEM "10%", ID_OPACITY_10
155-
MENUITEM "20%", ID_OPACITY_20
156-
MENUITEM "30%", ID_OPACITY_30
157-
MENUITEM "40%", ID_OPACITY_40
158-
MENUITEM "50%", ID_OPACITY_50
159-
MENUITEM "60%", ID_OPACITY_60
160-
MENUITEM "70%", ID_OPACITY_70
161-
MENUITEM "80%", ID_OPACITY_80
162-
MENUITEM "90%", ID_OPACITY_90
163-
MENUITEM "Opaque", ID_OPACITY_OPAQUE
164-
END
165-
MENUITEM SEPARATOR
166-
MENUITEM "Highlight", ID_WINDOW_HIGHLIGHT
167-
MENUITEM "Go to thread", ID_WINDOW_GOTOTHREAD
168-
MENUITEM "Properties", ID_WINDOW_PROPERTIES
169-
MENUITEM SEPARATOR
170-
MENUITEM "Copy\aCtrl+C", ID_WINDOW_COPY
171-
END
172-
END
173-
174133
#endif // English (Australia) resources
175134
/////////////////////////////////////////////////////////////////////////////
176135

plugins/WindowExplorer/resource.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,16 @@
22
// Microsoft Visual C++ generated include file.
33
// Used by WindowExplorer.rc
44
//
5-
#define IDD_WNDPROPSTORAGE 9
65
#define IDD_WNDLIST 101
76
#define ID_VIEW_WINDOWS 101
87
#define ID_THREAD_WINDOWS 102
98
#define ID_PROCESS_WINDOWS 103
10-
#define IDR_WINDOW 103
119
#define ID_SHOWCONTEXTMENU 104
1210
#define IDD_WNDGENERAL 104
1311
#define ID_VIEW_DESKTOPWINDOWS 105
1412
#define IDD_WNDPROPLIST 105
15-
#define IDD_WNDPREVIEW 106
13+
#define IDD_WNDPROPSTORAGE 106
14+
#define IDD_WNDPREVIEW 107
1615
#define IDC_LIST 1001
1716
#define IDC_REFRESH 1002
1817
#define IDC_FINDWINDOW 1003
@@ -40,13 +39,15 @@
4039
#define ID_OPACITY_OPAQUE 40025
4140
#define ID_WINDOW_VISIBLE 40026
4241
#define ID_WINDOW_ENABLED 40027
42+
#define ID_WINDOW_INSPECT 40028
43+
#define ID_WINDOW_OPENFILELOCATION 40029
4344

4445
// Next default values for new objects
4546
//
4647
#ifdef APSTUDIO_INVOKED
4748
#ifndef APSTUDIO_READONLY_SYMBOLS
4849
#define _APS_NEXT_RESOURCE_VALUE 111
49-
#define _APS_NEXT_COMMAND_VALUE 40028
50+
#define _APS_NEXT_COMMAND_VALUE 40030
5051
#define _APS_NEXT_CONTROL_VALUE 1037
5152
#define _APS_NEXT_SYMED_VALUE 107
5253
#endif

plugins/WindowExplorer/wnddlg.c

Lines changed: 137 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,9 @@ VOID WepFillWindowInfo(
223223
if (NT_SUCCESS(PhGetProcessMappedFileName(processHandle, instanceHandle, &fileName)))
224224
{
225225
PhMoveReference(&fileName, PhGetFileName(fileName));
226-
PhMoveReference(&fileName, PhGetBaseName(fileName));
226+
PhSetReference(&Node->FileNameWin32, fileName);
227227

228+
PhMoveReference(&fileName, PhGetBaseName(fileName));
228229
PhMoveReference(&Node->ModuleString, fileName);
229230
}
230231
}
@@ -532,6 +533,51 @@ VOID DrawWindowBorderForTargeting(
532533
}
533534
}
534535

536+
PPH_EMENU WepCreateWindowMenu(
537+
_In_ PPH_EMENU WindowMenu
538+
)
539+
{
540+
PPH_EMENU_ITEM menuItem;
541+
542+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_BRINGTOFRONT, L"Bring to front", NULL, NULL), ULONG_MAX);
543+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_RESTORE, L"Restore", NULL, NULL), ULONG_MAX);
544+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_MINIMIZE, L"Minimize", NULL, NULL), ULONG_MAX);
545+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_MAXIMIZE, L"Maximize", NULL, NULL), ULONG_MAX);
546+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_CLOSE, L"Close", NULL, NULL), ULONG_MAX);
547+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuSeparator(), ULONG_MAX);
548+
549+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_VISIBLE, L"Visible", NULL, NULL), ULONG_MAX);
550+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_ENABLED, L"Enabled", NULL, NULL), ULONG_MAX);
551+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_ALWAYSONTOP, L"Always on top", NULL, NULL), ULONG_MAX);
552+
553+
menuItem = PhCreateEMenuItem(0, 0, L"&Opacity", NULL, NULL);
554+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_10, L"&10%", NULL, NULL), ULONG_MAX);
555+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_20, L"&20%", NULL, NULL), ULONG_MAX);
556+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_30, L"&30%", NULL, NULL), ULONG_MAX);
557+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_40, L"&40%", NULL, NULL), ULONG_MAX);
558+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_50, L"&50%", NULL, NULL), ULONG_MAX);
559+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_60, L"&60%", NULL, NULL), ULONG_MAX);
560+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_70, L"&70%", NULL, NULL), ULONG_MAX);
561+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_80, L"&80%", NULL, NULL), ULONG_MAX);
562+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_90, L"&90%", NULL, NULL), ULONG_MAX);
563+
PhInsertEMenuItem(menuItem, PhCreateEMenuItem(0, ID_OPACITY_OPAQUE, L"&Opaque", NULL, NULL), ULONG_MAX);
564+
PhInsertEMenuItem(WindowMenu, menuItem, ULONG_MAX);
565+
566+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuSeparator(), ULONG_MAX);
567+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_INSPECT, L"&Inspect", NULL, NULL), ULONG_MAX);
568+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_OPENFILELOCATION, L"Open &file location", NULL, NULL), ULONG_MAX);
569+
570+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuSeparator(), ULONG_MAX);
571+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_HIGHLIGHT, L"Highlight", NULL, NULL), ULONG_MAX);
572+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_GOTOTHREAD, L"Go to thread", NULL, NULL), ULONG_MAX);
573+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_PROPERTIES, L"Properties", NULL, NULL), ULONG_MAX);
574+
575+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuSeparator(), ULONG_MAX);
576+
PhInsertEMenuItem(WindowMenu, PhCreateEMenuItem(0, ID_WINDOW_COPY, L"Copy\bCtrl+C", NULL, NULL), ULONG_MAX);
577+
578+
return WindowMenu;
579+
}
580+
535581
LRESULT CALLBACK WepFindWindowButtonSubclassProc(
536582
_In_ HWND hwndDlg,
537583
_In_ UINT uMsg,
@@ -706,7 +752,7 @@ INT_PTR CALLBACK WepWindowsDlgProc(
706752
if (numberOfWindows != 0)
707753
{
708754
menu = PhCreateEMenu();
709-
PhLoadResourceEMenuItem(menu, PluginInstance->DllBase, MAKEINTRESOURCE(IDR_WINDOW), 0);
755+
WepCreateWindowMenu(menu);
710756
PhInsertCopyCellEMenuItem(menu, ID_WINDOW_COPY, context->TreeNewHandle, contextMenuEvent->Column);
711757
PhSetFlagsEMenuItem(menu, ID_WINDOW_PROPERTIES, PH_EMENU_DEFAULT, PH_EMENU_DEFAULT);
712758

@@ -991,6 +1037,50 @@ INT_PTR CALLBACK WepWindowsDlgProc(
9911037
}
9921038
}
9931039
break;
1040+
case ID_WINDOW_INSPECT:
1041+
{
1042+
PWE_WINDOW_NODE selectedNode;
1043+
1044+
if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext))
1045+
{
1046+
if (
1047+
!PhIsNullOrEmptyString(selectedNode->FileNameWin32) &&
1048+
PhDoesFileExistsWin32(PhGetString(selectedNode->FileNameWin32))
1049+
)
1050+
{
1051+
PhShellExecuteUserString(
1052+
hwndDlg,
1053+
L"ProgramInspectExecutables",
1054+
PhGetString(selectedNode->FileNameWin32),
1055+
FALSE,
1056+
L"Make sure the PE Viewer executable file is present."
1057+
);
1058+
}
1059+
}
1060+
}
1061+
break;
1062+
case ID_WINDOW_OPENFILELOCATION:
1063+
{
1064+
PWE_WINDOW_NODE selectedNode;
1065+
1066+
if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext))
1067+
{
1068+
if (
1069+
!PhIsNullOrEmptyString(selectedNode->FileNameWin32) &&
1070+
PhDoesFileExistsWin32(PhGetString(selectedNode->FileNameWin32))
1071+
)
1072+
{
1073+
PhShellExecuteUserString(
1074+
hwndDlg,
1075+
L"FileBrowseExecutable",
1076+
PhGetString(selectedNode->FileNameWin32),
1077+
FALSE,
1078+
L"Make sure the Explorer executable file is present."
1079+
);
1080+
}
1081+
}
1082+
}
1083+
break;
9941084
case ID_WINDOW_PROPERTIES:
9951085
{
9961086
PWE_WINDOW_NODE selectedNode;
@@ -1311,7 +1401,7 @@ INT_PTR CALLBACK WepWindowsPageProc(
13111401
if (numberOfWindows != 0)
13121402
{
13131403
menu = PhCreateEMenu();
1314-
PhLoadResourceEMenuItem(menu, PluginInstance->DllBase, MAKEINTRESOURCE(IDR_WINDOW), 0);
1404+
WepCreateWindowMenu(menu);
13151405
PhInsertCopyCellEMenuItem(menu, ID_WINDOW_COPY, context->TreeNewHandle, contextMenuEvent->Column);
13161406
PhSetFlagsEMenuItem(menu, ID_WINDOW_PROPERTIES, PH_EMENU_DEFAULT, PH_EMENU_DEFAULT);
13171407

@@ -1593,6 +1683,50 @@ INT_PTR CALLBACK WepWindowsPageProc(
15931683
}
15941684
}
15951685
break;
1686+
case ID_WINDOW_INSPECT:
1687+
{
1688+
PWE_WINDOW_NODE selectedNode;
1689+
1690+
if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext))
1691+
{
1692+
if (
1693+
!PhIsNullOrEmptyString(selectedNode->FileNameWin32) &&
1694+
PhDoesFileExistsWin32(PhGetString(selectedNode->FileNameWin32))
1695+
)
1696+
{
1697+
PhShellExecuteUserString(
1698+
hwndDlg,
1699+
L"ProgramInspectExecutables",
1700+
PhGetString(selectedNode->FileNameWin32),
1701+
FALSE,
1702+
L"Make sure the PE Viewer executable file is present."
1703+
);
1704+
}
1705+
}
1706+
}
1707+
break;
1708+
case ID_WINDOW_OPENFILELOCATION:
1709+
{
1710+
PWE_WINDOW_NODE selectedNode;
1711+
1712+
if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext))
1713+
{
1714+
if (
1715+
!PhIsNullOrEmptyString(selectedNode->FileNameWin32) &&
1716+
PhDoesFileExistsWin32(PhGetString(selectedNode->FileNameWin32))
1717+
)
1718+
{
1719+
PhShellExecuteUserString(
1720+
hwndDlg,
1721+
L"FileBrowseExecutable",
1722+
PhGetString(selectedNode->FileNameWin32),
1723+
FALSE,
1724+
L"Make sure the Explorer executable file is present."
1725+
);
1726+
}
1727+
}
1728+
}
1729+
break;
15961730
case ID_WINDOW_PROPERTIES:
15971731
{
15981732
PWE_WINDOW_NODE selectedNode;

plugins/WindowExplorer/wndtree.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ VOID WepDestroyWindowNode(
304304
if (WindowNode->WindowText) PhDereferenceObject(WindowNode->WindowText);
305305
if (WindowNode->ThreadString) PhDereferenceObject(WindowNode->ThreadString);
306306
if (WindowNode->ModuleString) PhDereferenceObject(WindowNode->ModuleString);
307+
if (WindowNode->FileNameWin32) PhDereferenceObject(WindowNode->FileNameWin32);
307308

308309
PhFree(WindowNode);
309310
}

plugins/WindowExplorer/wndtree.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ typedef struct _WE_WINDOW_NODE
3636
WCHAR WindowHandleString[PH_PTR_STR_LEN_1];
3737
PPH_STRING ThreadString;
3838
PPH_STRING ModuleString;
39+
PPH_STRING FileNameWin32;
3940
} WE_WINDOW_NODE, *PWE_WINDOW_NODE;
4041

4142
typedef struct _WE_WINDOW_TREE_CONTEXT

0 commit comments

Comments
 (0)