@@ -223,8 +223,9 @@ VOID WepFillWindowInfo(
223
223
if (NT_SUCCESS (PhGetProcessMappedFileName (processHandle , instanceHandle , & fileName )))
224
224
{
225
225
PhMoveReference (& fileName , PhGetFileName (fileName ));
226
- PhMoveReference ( & fileName , PhGetBaseName ( fileName ) );
226
+ PhSetReference ( & Node -> FileNameWin32 , fileName );
227
227
228
+ PhMoveReference (& fileName , PhGetBaseName (fileName ));
228
229
PhMoveReference (& Node -> ModuleString , fileName );
229
230
}
230
231
}
@@ -532,6 +533,51 @@ VOID DrawWindowBorderForTargeting(
532
533
}
533
534
}
534
535
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
+
535
581
LRESULT CALLBACK WepFindWindowButtonSubclassProc (
536
582
_In_ HWND hwndDlg ,
537
583
_In_ UINT uMsg ,
@@ -706,7 +752,7 @@ INT_PTR CALLBACK WepWindowsDlgProc(
706
752
if (numberOfWindows != 0 )
707
753
{
708
754
menu = PhCreateEMenu ();
709
- PhLoadResourceEMenuItem (menu , PluginInstance -> DllBase , MAKEINTRESOURCE ( IDR_WINDOW ), 0 );
755
+ WepCreateWindowMenu (menu );
710
756
PhInsertCopyCellEMenuItem (menu , ID_WINDOW_COPY , context -> TreeNewHandle , contextMenuEvent -> Column );
711
757
PhSetFlagsEMenuItem (menu , ID_WINDOW_PROPERTIES , PH_EMENU_DEFAULT , PH_EMENU_DEFAULT );
712
758
@@ -991,6 +1037,50 @@ INT_PTR CALLBACK WepWindowsDlgProc(
991
1037
}
992
1038
}
993
1039
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 ;
994
1084
case ID_WINDOW_PROPERTIES :
995
1085
{
996
1086
PWE_WINDOW_NODE selectedNode ;
@@ -1311,7 +1401,7 @@ INT_PTR CALLBACK WepWindowsPageProc(
1311
1401
if (numberOfWindows != 0 )
1312
1402
{
1313
1403
menu = PhCreateEMenu ();
1314
- PhLoadResourceEMenuItem (menu , PluginInstance -> DllBase , MAKEINTRESOURCE ( IDR_WINDOW ), 0 );
1404
+ WepCreateWindowMenu (menu );
1315
1405
PhInsertCopyCellEMenuItem (menu , ID_WINDOW_COPY , context -> TreeNewHandle , contextMenuEvent -> Column );
1316
1406
PhSetFlagsEMenuItem (menu , ID_WINDOW_PROPERTIES , PH_EMENU_DEFAULT , PH_EMENU_DEFAULT );
1317
1407
@@ -1593,6 +1683,50 @@ INT_PTR CALLBACK WepWindowsPageProc(
1593
1683
}
1594
1684
}
1595
1685
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 ;
1596
1730
case ID_WINDOW_PROPERTIES :
1597
1731
{
1598
1732
PWE_WINDOW_NODE selectedNode ;
0 commit comments