From c21463891fa235525b1d2b58ab243a4d5a615b12 Mon Sep 17 00:00:00 2001 From: hfiref0x Date: Mon, 13 Jul 2026 07:27:24 +0700 Subject: [PATCH] 2.1.1 Internal rearrangement Add WinDepends support for system callbacks view dialog --- Source/WinObjEx64/aboutDlg.c | 9 +- Source/WinObjEx64/extras/extras.c | 32 ------ Source/WinObjEx64/extras/extras.h | 4 - Source/WinObjEx64/extras/extrasCallbacks.c | 74 ++++++-------- Source/WinObjEx64/extras/extrasDrivers.c | 2 +- Source/WinObjEx64/extras/extrasIPC.c | 2 +- Source/WinObjEx64/extras/extrasPN.c | 9 +- Source/WinObjEx64/extras/extrasPSList.c | 69 +++++++++---- Source/WinObjEx64/extras/extrasSL.c | 107 ++++++++------------- Source/WinObjEx64/extras/extrasSSDT.c | 5 +- Source/WinObjEx64/main.c | 2 +- Source/WinObjEx64/sup/sup.c | 69 +++++++++++++ Source/WinObjEx64/sup/sup.h | 6 ++ 13 files changed, 205 insertions(+), 185 deletions(-) diff --git a/Source/WinObjEx64/aboutDlg.c b/Source/WinObjEx64/aboutDlg.c index 95c5801..ac5d7c2 100644 --- a/Source/WinObjEx64/aboutDlg.c +++ b/Source/WinObjEx64/aboutDlg.c @@ -293,6 +293,7 @@ INT_PTR CALLBACK AboutDialogProc( static HANDLE StatsDialogThreadHandle = NULL; static FAST_EVENT StatsDialogInitializedEvent = FAST_EVENT_INIT; +static HWND StatsDialogWindow = NULL; #define UPDATE_TIMER_ID 1 /* @@ -358,6 +359,7 @@ INT_PTR CALLBACK StatsDialogProc( case WM_INITDIALOG: supCenterWindowSpecifyParent(hwndDlg, g_hwndMain); SetTimer(hwndDlg, UPDATE_TIMER_ID, 1000, (TIMERPROC)StatsTimerProc); + StatsDialogWindow = hwndDlg; break; case WM_DESTROY: @@ -365,12 +367,12 @@ INT_PTR CALLBACK StatsDialogProc( break; case WM_CLOSE: + StatsDialogWindow = NULL; KillTimer(hwndDlg, UPDATE_TIMER_ID); DestroyWindow(hwndDlg); return TRUE; case WM_COMMAND: - switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: case IDOK: @@ -443,9 +445,10 @@ VOID ShowStatsDialog( ) { if (!StatsDialogThreadHandle) { - StatsDialogThreadHandle = supCreateThread(StatsDialogWorkerThread, NULL, 0); supWaitForFastEvent(&StatsDialogInitializedEvent, NULL); - + } + else { + supRestoreDialogWindow(StatsDialogWindow); } } diff --git a/Source/WinObjEx64/extras/extras.c b/Source/WinObjEx64/extras/extras.c index 3fcf160..f9eea09 100644 --- a/Source/WinObjEx64/extras/extras.c +++ b/Source/WinObjEx64/extras/extras.c @@ -183,38 +183,6 @@ VOID extrasProcessElevationRequiredDialogs( } } -/* -* extrasViewWithWinDepends -* -* Purpose: -* -* Open selected image in WinDepends. -* -*/ -VOID extrasViewWithWinDepends( - _In_ EXTRASCONTEXT* Context, - _In_ INT nItem -) -{ - LPWSTR lpItem, lpWin32Name; - INT mark; - - if (ListView_GetSelectedCount(Context->ListView)) { - mark = ListView_GetSelectionMark(Context->ListView); - if (mark >= 0) { - lpItem = supGetItemText(Context->ListView, mark, nItem, NULL); - if (lpItem) { - lpWin32Name = supGetWin32FileName(lpItem); - if (lpWin32Name) { - supOpenImageInWinDepends(Context->hwndDlg, lpWin32Name, g_WinObj.szWinDependsExecutable); - supHeapFree(lpWin32Name); - } - supHeapFree(lpItem); - } - } - } -} - /* * extrasShowDialogById * diff --git a/Source/WinObjEx64/extras/extras.h b/Source/WinObjEx64/extras/extras.h index d625867..3547a7f 100644 --- a/Source/WinObjEx64/extras/extras.h +++ b/Source/WinObjEx64/extras/extras.h @@ -99,10 +99,6 @@ VOID extrasShowDialogById( VOID extrasHandleSettingsChange( _In_ EXTRASCONTEXT* Context); -VOID extrasViewWithWinDepends( - _In_ EXTRASCONTEXT* Context, - _In_ INT nItem); - // // Dialog handlers. // diff --git a/Source/WinObjEx64/extras/extrasCallbacks.c b/Source/WinObjEx64/extras/extrasCallbacks.c index f7e8a21..d6275c0 100644 --- a/Source/WinObjEx64/extras/extrasCallbacks.c +++ b/Source/WinObjEx64/extras/extrasCallbacks.c @@ -23,6 +23,10 @@ static HANDLE SysCbThreadHandle = NULL; static FAST_EVENT SysCbInitializedEvent = FAST_EVENT_INIT; +static EXTRASCONTEXT g_SysCbDlgContext; + +#define ID_CBLIST_VIEW_WDX 40108 +#define CBLIST_IMAGEPATH_INDEX 1 // // Scan limit constants. @@ -5713,6 +5717,13 @@ VOID SysCbDialogHandlePopupMenu( InsertMenu(hMenu, uPos++, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); } InsertMenu(hMenu, uPos++, MF_BYCOMMAND, ID_VIEW_REFRESH, T_VIEW_REFRESH); + + // + // View With WinDepends + // + if (g_WinObj.WinDependsPresent) + InsertMenu(hMenu, ++uPos, MF_BYCOMMAND, ID_CBLIST_VIEW_WDX, T_VIEWWITH_WDX); + TrackPopupMenu(hMenu, TPM_RIGHTBUTTON | TPM_LEFTALIGN, pt1.x, pt1.y, 0, hwndDlg, NULL); DestroyMenu(hMenu); } @@ -5783,16 +5794,13 @@ VOID SysCbDialogContentRefresh( */ VOID SysCbDialogOnInit( _In_ HWND hwndDlg, - _In_ LPARAM lParam + _In_ EXTRASCONTEXT *pDlgContext ) { - EXTRASCONTEXT* pDlgContext = (EXTRASCONTEXT*)lParam; RECT rc; HDITEM hdritem; INT SbParts[] = { 200, -1 }; - SetProp(hwndDlg, T_DLGCONTEXT, (HANDLE)lParam); - pDlgContext->hwndDlg = hwndDlg; pDlgContext->StatusBar = GetDlgItem(hwndDlg, ID_EXTRASLIST_STATUSBAR); SendMessage(pDlgContext->StatusBar, SB_SETPARTS, 2, (LPARAM)&SbParts); @@ -5843,12 +5851,10 @@ INT_PTR CALLBACK SysCbDialogProc( _In_ LPARAM lParam ) { - EXTRASCONTEXT* pDlgContext; - switch (uMsg) { case WM_INITDIALOG: - SysCbDialogOnInit(hwndDlg, lParam); + SysCbDialogOnInit(hwndDlg, &g_SysCbDlgContext); break; case WM_GETMINMAXINFO: @@ -5861,20 +5867,13 @@ INT_PTR CALLBACK SysCbDialogProc( break; case WM_SIZE: - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - SysCbDialogResize(hwndDlg, pDlgContext->StatusBar, pDlgContext->TreeList); - } + SysCbDialogResize(hwndDlg, g_SysCbDlgContext.StatusBar, g_SysCbDlgContext.TreeList); break; case WM_CLOSE: - pDlgContext = (EXTRASCONTEXT*)RemoveProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - extrasRemoveDlgIcon(pDlgContext); - supHeapFree(pDlgContext); - } + extrasRemoveDlgIcon(&g_SysCbDlgContext); DestroyWindow(hwndDlg); - break; + return TRUE; case WM_DESTROY: PostQuitMessage(0); @@ -5887,32 +5886,23 @@ INT_PTR CALLBACK SysCbDialogProc( break; case ID_OBJECT_COPY: - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - - supTreeListCopyItemValueToClipboard(pDlgContext->TreeList, - pDlgContext->tlSubItemHit); - - } + supTreeListCopyItemValueToClipboard(g_SysCbDlgContext.TreeList, g_SysCbDlgContext.tlSubItemHit); break; case ID_VIEW_REFRESH: - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - SysCbDialogContentRefresh(hwndDlg, pDlgContext, TRUE); - } + SysCbDialogContentRefresh(hwndDlg, &g_SysCbDlgContext, TRUE); + break; + + case ID_CBLIST_VIEW_WDX: + supViewWithWinDepends(g_SysCbDlgContext.hwndDlg, g_SysCbDlgContext.TreeList, CBLIST_IMAGEPATH_INDEX, FALSE); break; } break; case WM_CONTEXTMENU: - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - SysCbDialogHandlePopupMenu(hwndDlg, pDlgContext, lParam); - } + SysCbDialogHandlePopupMenu(hwndDlg, &g_SysCbDlgContext, lParam); break; - } return FALSE; @@ -5987,18 +5977,14 @@ VOID extrasCreateCallbacksDialog( VOID ) { - EXTRASCONTEXT* pDlgContext; - if (!SysCbThreadHandle) { - pDlgContext = (EXTRASCONTEXT*)supHeapAlloc(sizeof(EXTRASCONTEXT)); - if (pDlgContext) { - pDlgContext->tlSubItemHit = -1; - SysCbThreadHandle = supCreateDialogWorkerThread(extrasSysCbDialogWorkerThread, pDlgContext, 0); - if (SysCbThreadHandle == NULL) { - supHeapFree(pDlgContext); - return; - } + RtlSecureZeroMemory(&g_SysCbDlgContext, sizeof(EXTRASCONTEXT)); + g_SysCbDlgContext.tlSubItemHit = -1; + SysCbThreadHandle = supCreateDialogWorkerThread(extrasSysCbDialogWorkerThread, &g_SysCbDlgContext, 0); + if (SysCbThreadHandle) supWaitForFastEvent(&SysCbInitializedEvent, NULL); - } + } + else { + supRestoreDialogWindow(g_SysCbDlgContext.hwndDlg); } } diff --git a/Source/WinObjEx64/extras/extrasDrivers.c b/Source/WinObjEx64/extras/extrasDrivers.c index d9f6e02..112cb02 100644 --- a/Source/WinObjEx64/extras/extrasDrivers.c +++ b/Source/WinObjEx64/extras/extrasDrivers.c @@ -1289,7 +1289,7 @@ VOID DrvDlgHandleWMCommand( case ID_DRVLIST_VIEW_WDX: if (pDlgContext) { - extrasViewWithWinDepends(pDlgContext, COLUMN_DRVLIST_MODULE_NAME); + supViewWithWinDepends(pDlgContext->hwndDlg, pDlgContext->ListView, COLUMN_DRVLIST_MODULE_NAME, TRUE); } break; diff --git a/Source/WinObjEx64/extras/extrasIPC.c b/Source/WinObjEx64/extras/extrasIPC.c index 9030ade..ab9cbec 100644 --- a/Source/WinObjEx64/extras/extrasIPC.c +++ b/Source/WinObjEx64/extras/extrasIPC.c @@ -922,7 +922,7 @@ INT_PTR CALLBACK IpcDlgProc( ImageList_Destroy(pDlgContext->ImageList); } DestroyWindow(hwndDlg); - break; + return TRUE; case WM_COMMAND: diff --git a/Source/WinObjEx64/extras/extrasPN.c b/Source/WinObjEx64/extras/extrasPN.c index 4ef364f..7bc9b1b 100644 --- a/Source/WinObjEx64/extras/extrasPN.c +++ b/Source/WinObjEx64/extras/extrasPN.c @@ -18,10 +18,10 @@ #include "extras.h" #include "propDlg.h" -EXTRASCONTEXT PnDlgContext; ULONG PNSNumberOfObjects = 0; HANDLE PNSObjectsHeap = NULL; +static EXTRASCONTEXT PnDlgContext; static HANDLE PnDlgThreadHandle = NULL; static FAST_EVENT PnDlgInitializedEvent = FAST_EVENT_INIT; @@ -832,7 +832,7 @@ INT_PTR CALLBACK PNDialogProc( case WM_CLOSE: PNDialogOnClose(hwndDlg); - break; + return TRUE; case WM_COMMAND: @@ -866,18 +866,13 @@ INT_PTR CALLBACK PNDialogProc( case ID_OBJECT_PROPERTIES: if (ListView_GetSelectedCount(PnDlgContext.ListView)) { - nSelected = ListView_GetSelectionMark(PnDlgContext.ListView); if (nSelected >= 0) { PNDlgShowObjectProperties(nSelected); } - } - break; - } - break; } diff --git a/Source/WinObjEx64/extras/extrasPSList.c b/Source/WinObjEx64/extras/extrasPSList.c index 987aa88..b485c17 100644 --- a/Source/WinObjEx64/extras/extrasPSList.c +++ b/Source/WinObjEx64/extras/extrasPSList.c @@ -216,10 +216,14 @@ VOID PsListPidMapFree( _In_ PPIDMAP map ) { - for (size_t i = 0; i < PSLIST_PIDMAP_HASH_SIZE; ++i) { - PPIDMAP_ENTRY entry = map->buckets[i]; + size_t i; + PPIDMAP_ENTRY entry; + PPIDMAP_ENTRY tmp; + + for (i = 0; i < PSLIST_PIDMAP_HASH_SIZE; ++i) { + entry = map->buckets[i]; while (entry) { - PPIDMAP_ENTRY tmp = entry; + tmp = entry; entry = entry->next; supHeapFree(tmp); } @@ -241,13 +245,34 @@ BOOL PsListPidMapInsert( _In_ HTREEITEM hItem ) { - size_t idx = pidmap_hash(pid); - PPIDMAP_ENTRY entry = (PPIDMAP_ENTRY)supHeapAlloc(sizeof(PIDMAP_ENTRY)); - if (!entry) return FALSE; + size_t idx; + PPIDMAP_ENTRY entry, scan; + + if (map == NULL) + return FALSE; + + idx = pidmap_hash(pid); + if (idx >= PSLIST_PIDMAP_HASH_SIZE) //redurant for pvs + return FALSE; + + scan = map->buckets[idx]; + while (scan) { + if (scan->pid == pid) { + scan->hItem = hItem; + return TRUE; + } + scan = scan->next; + } + + entry = (PPIDMAP_ENTRY)supHeapAlloc(sizeof(PIDMAP_ENTRY)); + if (entry == NULL) + return FALSE; + entry->pid = pid; entry->hItem = hItem; entry->next = map->buckets[idx]; map->buckets[idx] = entry; + return TRUE; } @@ -265,6 +290,9 @@ HTREEITEM PsListPidMapFind( ) { size_t idx = pidmap_hash(pid); + if (idx >= PSLIST_PIDMAP_HASH_SIZE) + return FALSE; + PPIDMAP_ENTRY entry = map->buckets[idx]; while (entry) { if (entry->pid == pid) @@ -897,9 +925,11 @@ HTREEITEM AddProcessEntryTreeList( if (lpProcessName) supHeapFree(lpProcessName); - if (!PsListPidMapInsert(&PsListPidMap, HandleToULong(uniqueProcessId), hTreeItem)) { - supStatusBarSetText(PsDlgContext.StatusBar, 2, - TEXT("Warning: failed to cache process tree entry")); + if (hTreeItem) { + if (!PsListPidMapInsert(&PsListPidMap, HandleToULong(uniqueProcessId), hTreeItem)) { + supStatusBarSetText(PsDlgContext.StatusBar, 2, + TEXT("Warning: failed to cache process tree entry")); + } } return hTreeItem; @@ -953,7 +983,7 @@ LPWSTR PsListGetThreadStateAsString( switch (ThreadState) { case StateInitialized: - lpState = TEXT("Initiailized"); + lpState = TEXT("Initialized"); break; case StateReady: lpState = TEXT("Ready"); @@ -1002,13 +1032,13 @@ FORCEINLINE VOID PsListLockRelease(VOID) * */ DWORD WINAPI CreateThreadListProc( - _In_ PROP_UNNAMED_OBJECT_INFO * ObjectEntry + _In_ PVOID Parameter ) { INT ItemIndex; ULONG i, ThreadCount, ErrorCount = 0; ULONG_PTR startAddress = 0, objectAddress = 0; - HANDLE UniqueProcessId; + HANDLE UniqueProcessId = (HANDLE)Parameter; PVOID ProcessList = NULL; PSYSTEM_PROCESS_INFORMATION Process; PSYSTEM_THREAD_INFORMATION Thread; @@ -1032,8 +1062,6 @@ DWORD WINAPI CreateThreadListProc( do { ListView_DeleteAllItems(PsDlgContext.ListView); - UniqueProcessId = ObjectEntry->ClientId.UniqueProcess; - // // Refresh thread list. // @@ -1585,7 +1613,7 @@ INT_PTR PsListHandleNotify( case TVN_SELCHANGED: ObjectEntry = PsListGetObjectEntry(TRUE, NULL); if (ObjectEntry) { - CreateObjectList(TRUE, ObjectEntry); + CreateObjectList(TRUE, (PVOID)ObjectEntry->ClientId.UniqueProcess); } return 1; @@ -1612,7 +1640,7 @@ VOID PsListHandleThreadRefresh( ObjectEntry = PsListGetObjectEntry(TRUE, NULL); if (ObjectEntry) { - CreateObjectList(TRUE, ObjectEntry); + CreateObjectList(TRUE, (PVOID)ObjectEntry->ClientId.UniqueProcess); } } @@ -1656,17 +1684,18 @@ INT_PTR CALLBACK PsListDialogProc( } if ((HWND)wParam == PsDlgContext.ListView) { - mark = ListView_GetSelectionMark(PsDlgContext.ListView); - if (lParam == MAKELPARAM(-1, -1)) { + if (mark < 0) + break; + ListView_GetItemRect(PsDlgContext.ListView, mark, &crc, TRUE); crc.top = crc.bottom; ClientToScreen(PsDlgContext.ListView, (LPPOINT)&crc); } - else + else { GetCursorPos((LPPOINT)&crc); - + } PsListHandlePopupMenu(hwndDlg, (LPPOINT)&crc, 0, FALSE); } diff --git a/Source/WinObjEx64/extras/extrasSL.c b/Source/WinObjEx64/extras/extrasSL.c index adaf3e9..1be9b52 100644 --- a/Source/WinObjEx64/extras/extrasSL.c +++ b/Source/WinObjEx64/extras/extrasSL.c @@ -26,6 +26,7 @@ typedef struct _SL_ENUM_CONTEXT { static HANDLE SLCacheDlgThreadHandle = NULL; static FAST_EVENT SLCacheDlgInitializedEvent = FAST_EVENT_INIT; +static EXTRASCONTEXT g_SLCachecDlgContext; UINT g_SLCacheImageIndex; @@ -631,16 +632,12 @@ INT_PTR CALLBACK SLCacheDialogProc( _In_ LPARAM lParam ) { - EXTRASCONTEXT* pDlgContext; LPNMLISTVIEW nhdr = (LPNMLISTVIEW)lParam; LPCWSTR lpFilter = NULL; WCHAR szFilterOption[MAX_PATH + 1]; if (uMsg == g_WinObj.SettingsChangeMessage) { - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - extrasHandleSettingsChange(pDlgContext); - } + extrasHandleSettingsChange(&g_SLCachecDlgContext); return TRUE; } @@ -658,35 +655,24 @@ INT_PTR CALLBACK SLCacheDialogProc( break; case WM_CLOSE: - pDlgContext = (EXTRASCONTEXT*)RemoveProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - - extrasRemoveDlgIcon(pDlgContext); - - // - // Free SL cache data - // - if (pDlgContext->SLDataCache) { - supHeapFree((PVOID)pDlgContext->SLDataCache); - pDlgContext->SLDataCache = 0; - } - - supHeapFree(pDlgContext); + extrasRemoveDlgIcon(&g_SLCachecDlgContext); + // + // Free SL cache data + // + if (g_SLCachecDlgContext.SLDataCache) { + supHeapFree((PVOID)g_SLCachecDlgContext.SLDataCache); + g_SLCachecDlgContext.SLDataCache = 0; } DestroyWindow(hwndDlg); return TRUE; case WM_CONTEXTMENU: - - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - supHandleContextMenuMsgForListView(hwndDlg, - wParam, - lParam, - pDlgContext->ListView, - (pfnPopupMenuHandler)SLCacheDialogHandlePopup, - (PVOID)pDlgContext); - } + supHandleContextMenuMsgForListView(hwndDlg, + wParam, + lParam, + g_SLCachecDlgContext.ListView, + (pfnPopupMenuHandler)SLCacheDialogHandlePopup, + (PVOID)&g_SLCachecDlgContext); break; case WM_COMMAND: @@ -698,42 +684,32 @@ INT_PTR CALLBACK SLCacheDialogProc( break; case IDC_SLVALUE_VIEWWITH: - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - SLCacheDialogViewBinaryData(pDlgContext->ListView, - ListView_GetSelectionMark(pDlgContext->ListView)); - } + SLCacheDialogViewBinaryData(g_SLCachecDlgContext.ListView, + ListView_GetSelectionMark(g_SLCachecDlgContext.ListView)); break; case ID_OBJECT_COPY: - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - supListViewCopyItemValueToClipboard(pDlgContext->ListView, - pDlgContext->lvItemHit, - pDlgContext->lvColumnHit); - } + supListViewCopyItemValueToClipboard(g_SLCachecDlgContext.ListView, + g_SLCachecDlgContext.lvItemHit, + g_SLCachecDlgContext.lvColumnHit); break; case IDC_SLSEARCH: if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE) { - pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); - if (pDlgContext) { - - RtlSecureZeroMemory(szFilterOption, sizeof(szFilterOption)); - if (GetDlgItemText(hwndDlg, - IDC_SLSEARCH, - szFilterOption, - MAX_PATH)) - { - if (szFilterOption[0] != 0) { - lpFilter = szFilterOption; - } + RtlSecureZeroMemory(szFilterOption, sizeof(szFilterOption)); + if (GetDlgItemText(hwndDlg, + IDC_SLSEARCH, + szFilterOption, + MAX_PATH)) + { + if (szFilterOption[0] != 0) { + lpFilter = szFilterOption; } - ListView_DeleteAllItems(pDlgContext->ListView); - SLCacheListItems(pDlgContext, lpFilter); } + ListView_DeleteAllItems(g_SLCachecDlgContext.ListView); + SLCacheListItems(&g_SLCachecDlgContext, lpFilter); } break; @@ -784,11 +760,6 @@ DWORD extrasSLCacheDialogWorkerThread( } while (bResult != 0); } - else { - if (pDlgContext) { - supHeapFree(pDlgContext); - } - } supResetFastEvent(&SLCacheDlgInitializedEvent); supCloseHandleAtomic(&SLCacheDlgThreadHandle); @@ -808,17 +779,15 @@ VOID extrasCreateSLCacheDialog( VOID ) { - EXTRASCONTEXT* pDlgContext; - if (!SLCacheDlgThreadHandle) { - pDlgContext = (EXTRASCONTEXT*)supHeapAlloc(sizeof(EXTRASCONTEXT)); - if (pDlgContext) { - SLCacheDlgThreadHandle = supCreateDialogWorkerThread(extrasSLCacheDialogWorkerThread, pDlgContext, 0); - if (SLCacheDlgThreadHandle == NULL) { - supHeapFree(pDlgContext); - return; - } - supWaitForFastEvent(&SLCacheDlgInitializedEvent, NULL); + RtlSecureZeroMemory(&g_SLCachecDlgContext, sizeof(EXTRASCONTEXT)); + SLCacheDlgThreadHandle = supCreateDialogWorkerThread(extrasSLCacheDialogWorkerThread, &g_SLCachecDlgContext, 0); + if (SLCacheDlgThreadHandle == NULL) { + return; } + supWaitForFastEvent(&SLCacheDlgInitializedEvent, NULL); + } + else { + supRestoreDialogWindow(g_SLCachecDlgContext.hwndDlg); } } diff --git a/Source/WinObjEx64/extras/extrasSSDT.c b/Source/WinObjEx64/extras/extrasSSDT.c index 276b8f6..002cb90 100644 --- a/Source/WinObjEx64/extras/extrasSSDT.c +++ b/Source/WinObjEx64/extras/extrasSSDT.c @@ -1302,7 +1302,7 @@ INT_PTR CALLBACK SdtDialogProc( extrasRemoveDlgIcon(pDlgContext); } DestroyWindow(hwndDlg); - break; + return TRUE; case WM_COMMAND: @@ -1355,10 +1355,9 @@ INT_PTR CALLBACK SdtDialogProc( case ID_SDTLIST_VIEW_WITH_WDX: pDlgContext = (EXTRASCONTEXT*)GetProp(hwndDlg, T_DLGCONTEXT); if (pDlgContext) { - extrasViewWithWinDepends(pDlgContext, COLUMN_SDTLIST_MODULE); + supViewWithWinDepends(pDlgContext->hwndDlg, pDlgContext->ListView, COLUMN_SDTLIST_MODULE, TRUE); } break; - } break; diff --git a/Source/WinObjEx64/main.c b/Source/WinObjEx64/main.c index 165f256..405a8c9 100644 --- a/Source/WinObjEx64/main.c +++ b/Source/WinObjEx64/main.c @@ -1073,7 +1073,7 @@ LRESULT CALLBACK MainWindowProc( case WM_CLOSE: DestroyWindow(hwnd); - return 0; + return TRUE; case WM_DESTROY: PostQuitMessage(0); diff --git a/Source/WinObjEx64/sup/sup.c b/Source/WinObjEx64/sup/sup.c index 3dcf24c..5461d68 100644 --- a/Source/WinObjEx64/sup/sup.c +++ b/Source/WinObjEx64/sup/sup.c @@ -11273,3 +11273,72 @@ VOID supRestoreDialogWindow( SetForegroundWindow(hwndDlg); } } + +/* +* supViewWithWinDepends +* +* Purpose: +* +* Open image selected in ListView/TreeList with WinDepends. +* +*/ +VOID supViewWithWinDepends( + _In_ HWND hwndDlg, + _In_ HWND hwndList, + _In_ INT nItem, + _In_ BOOL bListView +) +{ + LPWSTR lpItem, lpWin32Name; + INT iItem; + TVITEMEX itemex; + WCHAR szText[MAX_PATH * 2]; + TL_SUBITEMS_FIXED* pSubItems = NULL; + + if (bListView) { + if (ListView_GetSelectedCount(hwndList)) { + iItem = ListView_GetSelectionMark(hwndList); + if (iItem >= 0) { + lpItem = supGetItemText(hwndList, iItem, nItem, NULL); + if (lpItem) { + lpWin32Name = supGetWin32FileName(lpItem); + if (lpWin32Name) { + supOpenImageInWinDepends(hwndDlg, lpWin32Name, g_WinObj.szWinDependsExecutable); + supHeapFree(lpWin32Name); + } + supHeapFree(lpItem); + } + } + } + } + else { + szText[0] = 0; + lpItem = NULL; + RtlSecureZeroMemory(&itemex, sizeof(itemex)); + itemex.mask = TVIF_TEXT; + itemex.hItem = TreeList_GetSelection(hwndList); + itemex.pszText = szText; + itemex.cchTextMax = RTL_NUMBER_OF(szText); + + if (TreeList_GetTreeItem(hwndList, &itemex, &pSubItems)) { + if ((nItem > 0) && (pSubItems != NULL)) { + iItem = (nItem - 1); + if (iItem < (INT)pSubItems->Count) { + lpItem = pSubItems->Text[iItem]; + } + } + else { + if (nItem == 0) { + lpItem = szText; + } + } + if (lpItem) { + lpWin32Name = supGetWin32FileName(lpItem); + if (lpWin32Name) { + supOpenImageInWinDepends(hwndDlg, lpWin32Name, g_WinObj.szWinDependsExecutable); + supHeapFree(lpWin32Name); + } + } + } + } +} diff --git a/Source/WinObjEx64/sup/sup.h b/Source/WinObjEx64/sup/sup.h index 5e1a590..05ce70d 100644 --- a/Source/WinObjEx64/sup/sup.h +++ b/Source/WinObjEx64/sup/sup.h @@ -1324,3 +1324,9 @@ BOOL supOpenImageInWinDepends( VOID supRestoreDialogWindow( _In_ HWND hwndDlg); + +VOID supViewWithWinDepends( + _In_ HWND hwndDlg, + _In_ HWND hwndList, + _In_ INT nItem, + _In_ BOOL bListView);