Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions Source/WinObjEx64/extras/extras.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
*
* TITLE: EXTRAS.H
*
* VERSION: 2.10
* VERSION: 2.11
*
* DATE: 07 Mar 2026
* DATE: 12 Jul 2026
*
* Common header file for Extras dialogs.
*
Expand All @@ -31,13 +31,22 @@ typedef struct _EXTRASCONTEXT {
INT lvColumnHit;
INT lvItemHit;
INT tlSubItemHit;
INT TooltipOldX;
INT TooltipOldY;
INT TooltipLastItem;
BOOL bInverseSort;
union {
ULONG_PTR Reserved;
ULONG_PTR Flags;
ULONG_PTR SLDataCache;
ULONG_PTR DialogMode;
};
HICON ObjectIcon;
HICON DialogIcon;
union {
WNDPROC OriginalWndProc;
WNDPROC OriginalListViewProc;
};
} EXTRASCONTEXT, *PEXTRASCONTEXT;

typedef struct _EXTRASCALLBACK {
Expand Down
6 changes: 3 additions & 3 deletions Source/WinObjEx64/extras/extrasCmOpt.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ VOID CmOptDlgHandlePopupMenu(
InsertMenu(hMenu, ++uPos, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
}

bIoDriverLoaded = (Context->Reserved != 0);
bIoDriverLoaded = (Context->Flags != 0);
if (bIoDriverLoaded) {
InsertMenu(hMenu, ++uPos, MF_BYCOMMAND, ID_CMOPTLIST_DUMP, T_DUMP_VALUE);
}
Expand Down Expand Up @@ -523,7 +523,7 @@ VOID CmOptDlgListOptions(
supDisableRedraw(hwndList);

while (CmControlVector.Version.v1->KeyPath != NULL) {
CmpOptDlgAddEntry(hwndList, CmControlVector.Ref, size, (Context->Reserved != 0));
CmpOptDlgAddEntry(hwndList, CmControlVector.Ref, size, (Context->Flags != 0));
CmControlVector.Ref += size;
}

Expand Down Expand Up @@ -593,7 +593,7 @@ VOID CmOptDlgOnInit(
CmOptDlgContext.lvColumnCount = iColumn;

bIoDriverLoaded = kdIoDriverLoaded();
CmOptDlgContext.Reserved = bIoDriverLoaded;
CmOptDlgContext.Flags = bIoDriverLoaded;

if (bIoDriverLoaded) {
supAddListViewColumn(CmOptDlgContext.ListView,
Expand Down
83 changes: 54 additions & 29 deletions Source/WinObjEx64/extras/extrasDrivers.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ static LIST_ENTRY g_DrvFilterListHead;
static ULONG g_cDrvShimmed = 0;
static ULONG g_cDrvFilters = 0;

WNDPROC g_OriginalListViewProc = NULL;

LPCWSTR CryptAlgoIdRef[] = {
BCRYPT_MD5_ALGORITHM,
BCRYPT_SHA1_ALGORITHM,
Expand Down Expand Up @@ -548,6 +546,13 @@ INT_PTR CALLBACK DrvDumpProgressDialogProc(
}
break;

case WM_CLOSE:
dumpInfo = (OBEX_DRVDUMP*)RemoveProp(hwndDlg, DUMP_PROP);
KillTimer(hwndDlg, 1);
DumpWorkerWindow = NULL;
DestroyWindow(hwndDlg);
return TRUE;

case WM_DESTROY:
PostQuitMessage(0);
break;
Expand All @@ -557,9 +562,8 @@ INT_PTR CALLBACK DrvDumpProgressDialogProc(
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDCANCEL:
DumpTerminateWorker(hwndDlg);
RemoveProp(hwndDlg, DUMP_PROP);
KillTimer(hwndDlg, 1);
return DestroyWindow(hwndDlg);
SendMessage(hwndDlg, WM_CLOSE, 0, 0);
return TRUE;
}
}
return 0;
Expand Down Expand Up @@ -961,6 +965,7 @@ VOID DrvListUnloadedDrivers(
{
_strcpy(szBuffer, TEXT("Could not resolve MmUnloadedDrivers"));
supStatusBarSetText(Context->StatusBar, 0, (LPWSTR)&szBuffer);
supEnableRedraw(hwndList);
return;
}

Expand Down Expand Up @@ -1283,7 +1288,9 @@ VOID DrvDlgHandleWMCommand(
break;

case ID_DRVLIST_VIEW_WDX:
extrasViewWithWinDepends(pDlgContext, COLUMN_DRVLIST_MODULE_NAME);
if (pDlgContext) {
extrasViewWithWinDepends(pDlgContext, COLUMN_DRVLIST_MODULE_NAME);
}
break;

case ID_DRVLIST_PROP:
Expand All @@ -1296,14 +1303,10 @@ VOID DrvDlgHandleWMCommand(
if (pDlgContext) {

if (pDlgContext->DialogMode == DrvModeNormal) {

DrvListDrivers(pDlgContext, TRUE);

}
else {

DrvListUnloadedDrivers(pDlgContext, TRUE);

}
}
break;
Expand Down Expand Up @@ -1487,15 +1490,14 @@ LRESULT CALLBACK DrvListViewHookProc(
_In_ LPARAM lParam
)
{
BOOL bCheckPass = FALSE;
INT currentItem;
HWND hwndTT;
EXTRASCONTEXT* Context = &DrvDlgContext[DrvModeNormal];
LVHITTESTINFO ht;
TOOLINFO toolInfo;
BOOL bCheckPass = FALSE;
static int oldX = -1, oldY = -1;
static int lastItem = -1;
INT currentItem;

hwndTT = (HWND)DrvDlgContext[DrvModeNormal].TooltipInfo;
hwndTT = (HWND)Context->TooltipInfo;

switch (uMsg) {

Expand All @@ -1515,8 +1517,9 @@ LRESULT CALLBACK DrvListViewHookProc(
// If tooltip window is not available, skip tooltip actions.
//
if (hwndTT == NULL || !IsWindow(hwndTT)) {
lastItem = -1;
oldX = oldY = -1;
Context->TooltipLastItem = -1;
Context->TooltipOldX = -1;
Context->TooltipOldY = -1;
break;
}

Expand All @@ -1525,7 +1528,7 @@ LRESULT CALLBACK DrvListViewHookProc(
//
if (!bCheckPass || !(ht.flags & LVHT_ONITEM)) {

if (lastItem != -1) {
if (Context->TooltipLastItem != -1) {
RtlSecureZeroMemory(&toolInfo, sizeof(toolInfo));
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = DrvDlgContext[DrvModeNormal].hwndDlg;
Expand All @@ -1534,8 +1537,9 @@ LRESULT CALLBACK DrvListViewHookProc(
SendMessage(hwndTT, TTM_TRACKACTIVATE, FALSE, (LPARAM)&toolInfo);
}

lastItem = -1;
oldX = oldY = -1;
Context->TooltipLastItem = -1;
Context->TooltipOldX = -1;
Context->TooltipOldY = -1;
break;
}

Expand All @@ -1544,9 +1548,12 @@ LRESULT CALLBACK DrvListViewHookProc(
// Only update tooltip when the hovered item changed or cursor moved sufficiently.
//
currentItem = ht.iItem;
if ((currentItem != lastItem) || (ht.pt.x != oldX) || (ht.pt.y != oldY)) {
oldX = ht.pt.x;
oldY = ht.pt.y;
if ((currentItem != Context->TooltipLastItem) ||
(ht.pt.x != Context->TooltipOldX) ||
(ht.pt.y != Context->TooltipOldY))
{
Context->TooltipOldX = ht.pt.x;
Context->TooltipOldY = ht.pt.y;

DrvListSetTooltip(&DrvDlgContext[DrvModeNormal], hwnd, currentItem);

Expand All @@ -1563,13 +1570,13 @@ LRESULT CALLBACK DrvListViewHookProc(
SendMessage(hwndTT, TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(ht.pt.x, ht.pt.y));
SendMessage(hwndTT, TTM_UPDATE, 0, 0);

lastItem = currentItem;
Context->TooltipLastItem = currentItem;
}

break;
}

return CallWindowProc(g_OriginalListViewProc, hwnd, uMsg, wParam, lParam);
return CallWindowProc(DrvDlgContext[DrvModeNormal].OriginalListViewProc, hwnd, uMsg, wParam, lParam);
}

/*
Expand Down Expand Up @@ -1614,6 +1621,10 @@ VOID DrvDlgOnInit(
pDlgContext->hwndDlg = hwndDlg;
pDlgContext->lvColumnHit = -1;
pDlgContext->lvItemHit = -1;
pDlgContext->TooltipOldX = -1;
pDlgContext->TooltipOldY = -1;
pDlgContext->TooltipLastItem = -1;
pDlgContext->OriginalListViewProc = NULL;

switch (pDlgContext->DialogMode) {
case DrvModeUnloaded:
Expand Down Expand Up @@ -1655,7 +1666,7 @@ VOID DrvDlgOnInit(

pDlgContext->TooltipInfo = (PVOID)supCreateTrackingToolTip(ID_EXTRASLIST, hwndDlg);
if (pDlgContext->TooltipInfo) {
g_OriginalListViewProc = (WNDPROC)SetWindowLongPtr(pDlgContext->ListView,
pDlgContext->OriginalListViewProc = (WNDPROC)SetWindowLongPtr(pDlgContext->ListView,
GWLP_WNDPROC,
(LONG_PTR)&DrvListViewHookProc);

Expand Down Expand Up @@ -1793,23 +1804,37 @@ INT_PTR CALLBACK DrvDlgProc(
if (pDlgContext->TooltipInfo)
DestroyWindow((HWND)pDlgContext->TooltipInfo);

if (pDlgContext->DialogMode == DrvModeNormal &&
pDlgContext->ListView &&
pDlgContext->OriginalListViewProc)
{
SetWindowLongPtr(pDlgContext->ListView,
GWLP_WNDPROC,
(LONG_PTR)pDlgContext->OriginalListViewProc);
pDlgContext->OriginalListViewProc = NULL;
}

DrvTooltipFreeBuffer(pDlgContext);

extrasRemoveDlgIcon(pDlgContext);

if (pDlgContext->DialogMode == DrvModeNormal) {
pDlgContext->TooltipOldX = -1;
pDlgContext->TooltipOldY = -1;
pDlgContext->TooltipLastItem = -1;
kdDestroyShimmedDriversList(&g_kdctx.Data->KseEngineDump);
supFilterDestroyList(&g_DrvFilterListHead);
g_cDrvFilters = 0;
}

}

if (DumpWorkerWindow) {
SendMessage(DumpWorkerWindow, WM_CLOSE, 0, 0);
DumpWorkerWindow = NULL;
PostMessage(DumpWorkerWindow, WM_CLOSE, 0, 0);
}

DestroyWindow(hwndDlg);
break;
return TRUE;

case WM_COMMAND:

Expand Down
40 changes: 20 additions & 20 deletions Source/WinObjEx64/extras/extrasSL.c
Original file line number Diff line number Diff line change
Expand Up @@ -481,16 +481,16 @@ PVOID xxxSLCacheUpdateData(
_In_ EXTRASCONTEXT* Context
)
{
PVOID SLCacheData = (PVOID)Context->Reserved;
if (SLCacheData) {
supHeapFree(SLCacheData);
Context->Reserved = 0;
PVOID SLDataCache = (PVOID)Context->SLDataCache;
if (SLDataCache) {
supHeapFree(SLDataCache);
Context->SLDataCache = 0;
}
SLCacheData = (PVOID)supSLCacheRead();
if (SLCacheData)
Context->Reserved = (ULONG_PTR)SLCacheData;
SLDataCache = (PVOID)supSLCacheRead();
if (SLDataCache)
Context->SLDataCache = (ULONG_PTR)SLDataCache;

return SLCacheData;
return SLDataCache;
}

/*
Expand All @@ -506,16 +506,16 @@ VOID SLCacheListItems(
_In_opt_ LPCWSTR FilterByName
)
{
PVOID SLCacheData = (PVOID)Context->Reserved;
PVOID SLDataCache = (PVOID)Context->SLDataCache;
WCHAR szBuffer[100];

SL_ENUM_CONTEXT enumContext;

if (SLCacheData == NULL) {
SLCacheData = xxxSLCacheUpdateData(Context);
if (SLDataCache == NULL) {
SLDataCache = xxxSLCacheUpdateData(Context);
}

if (SLCacheData == NULL) {
if (SLDataCache == NULL) {
MessageBox(Context->hwndDlg, T_SLCACHE_READ_FAIL, NULL, MB_ICONERROR);
return;
}
Expand All @@ -525,7 +525,7 @@ VOID SLCacheListItems(
enumContext.lpFilterByName = FilterByName;
enumContext.DialogContext = Context;

supSLCacheEnumerate(SLCacheData,
supSLCacheEnumerate(SLDataCache,
(PENUMERATE_SL_CACHE_VALUE_DESCRIPTORS_CALLBACK)SLCacheEnumerateCallback,
&enumContext);

Expand All @@ -552,7 +552,7 @@ VOID SLCacheDialogOnInit(
)
{
INT iImage = ImageList_GetImageCount(g_ListViewImages) - 1;
PVOID SLCacheData;
PVOID SLDataCache;
EXTRASCONTEXT* pDlgContext = (EXTRASCONTEXT*)lParam;
LVCOLUMNS_DATA columnData[] =
{
Expand All @@ -572,8 +572,8 @@ VOID SLCacheDialogOnInit(
//
// Read and enumerate cache.
//
SLCacheData = supSLCacheRead();
if (SLCacheData) {
SLDataCache = supSLCacheRead();
if (SLDataCache) {

//
// Initialize main listview.
Expand Down Expand Up @@ -606,7 +606,7 @@ VOID SLCacheDialogOnInit(
// Remember image index.
//
g_SLCacheImageIndex = g_TypeToken.ImageIndex;
pDlgContext->Reserved = (ULONG_PTR)SLCacheData;
pDlgContext->SLDataCache = (ULONG_PTR)SLDataCache;
SLCacheListItems(pDlgContext, NULL);

}
Expand Down Expand Up @@ -666,9 +666,9 @@ INT_PTR CALLBACK SLCacheDialogProc(
//
// Free SL cache data
//
if (pDlgContext->Reserved) {
supHeapFree((PVOID)pDlgContext->Reserved);
pDlgContext->Reserved = 0;
if (pDlgContext->SLDataCache) {
supHeapFree((PVOID)pDlgContext->SLDataCache);
pDlgContext->SLDataCache = 0;
}

supHeapFree(pDlgContext);
Expand Down