Skip to content
Draft
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
112 changes: 111 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,116 @@
# Changelog

## 1.5.79.0 Stable - 2026-07-04

- Promotes the exact-window `BeginPaint`/`FillRect` Explorer background renderer to production.
- Removes periodic managed diagnostics, native paint counters, obsolete draw exports, and diagnostic build markers.
- Retains strict `DirectUIHWND` validation, safe hook rollback, crash reporting, and operational error logs.

## 1.5.78.0 Diagnostic - 2026-07-04

- Replaces the overwritten `WM_ERASEBKGND` draw with process API detours matching the proven ExplorerBgTool paint order.
- Draws immediately after DirectUI's own `FillRect`, before folders, files, and labels are painted.
- Restricts rendering to HDCs resolved to exact registered `DirectUIHWND` instances and fully rolls back partial hook installation.

## 1.5.77.0 Diagnostic - 2026-07-04

- Moves exact-window background rendering from the post-paint overlay to `WM_ERASEBKGND`.
- Draws after the default background erase and before Explorer paints folders, files, and labels.
- Uses the message-provided HDC, removes the post-paint redraw loop, and keeps all IAT hooks disabled.

## 1.5.76.0 Diagnostic - 2026-07-04

- Fixes exact-window registration for the hook-free after-paint renderer by checking the initialized renderer state rather than the obsolete installed-hook state.
- Preserves the 1.5.75 exact `DirectUIHWND` rendering path with all background IAT hooks disabled.

## 1.5.75.0 Diagnostic - 2026-07-03

- Replaces background-mode IAT interception with exact-window rendering dispatched by QTTabBar's existing `DirectUIHWND` after-paint message.
- Uses the WinSpy-confirmed registered file-list window and disables all scoped background IAT hooks.
- Adds after-paint render telemetry while retaining the WIC image loader and strict window validation.

## 1.5.74.0 Diagnostic - 2026-07-03

- Extends the isolated background renderer to scoped `FillRect` and `CreateCompatibleDC` imports in `shell32` and `ExplorerFrame`.
- Adds per-module paint telemetry plus image/paint overlap and clip-region diagnostics.
- Retains exact registered-window filtering and avoids process-wide API hooks.

## 1.5.73.0 Diagnostic - 2026-07-03

- Replaced the non-windowed `dui70!GetDC(NULL)` diagnostic path with scoped `shell32!BeginPaint` and `shell32!EndPaint` import hooks.
- Mirrors the reference renderer's DirectUI paint-DC association while retaining exact registered-window filtering.

## 1.5.72.0 Diagnostic - 2026-07-03

- Replaced the unrelated `ExplorerFrame!BeginPaint` import hook with scoped `dui70!GetDC` and `dui70!ReleaseDC` import hooks.
- Associates only exact registered `DirectUIHWND` DCs with the background renderer.
- Retains delayed telemetry to verify DC resolution and alpha blending in the target Windows 10 VM.

## 1.5.71.0 Diagnostic - 2026-07-03

- Added read-only native telemetry for the isolated Explorer background renderer.
- Logs delayed snapshots for `BeginPaint`, compatible DC propagation, `FillRect`, and `AlphaBlend` without changing hook targets or rendering behavior.
- Keeps 1.5.70.0 Stable as the rollback baseline.

## 1.5.70.0 Stable - 2026-07-03

- Adds a scoped `ExplorerFrame.dll` `BeginPaint` import patch to capture the real
DirectUI paint DC without installing a process-wide hook
- Maps the captured paint DC to the already registered `DirectUIHWND`
- Keeps `FillRect` and `CreateCompatibleDC` patches limited to `dui70.dll`
- Retains the stable background-only state separation from 1.5.69

## 1.5.69.0 Stable - 2026-07-03

- Separates isolated background-renderer state from the legacy QTHookLib state
- Skips the invalid ShellBrowser-hook call in background-only mode
- Removes the additional `dui70.dll` `DeleteDC` patch not used by the reference implementation
- Replaces DeleteDC tracking with bounded, overwrite-on-create compatible-DC mapping

## 1.5.68.0 Stable - 2026-07-03

- Removed `std::random_device` from Explorer background renderer construction
- Uses a deterministic renderer seed so startup does not enter platform entropy code
- Added phase diagnostics for singleton creation, configuration, image enumeration,
WIC decode, DIB creation, pixel copy, and state commit
- Logs the exact native renderer phase after both success and guarded failure

## 1.5.67.0 Stable - 2026-07-03

- Replaced the background renderer's GDI+ decoder with Windows Imaging Component
- Removed `GdiplusStartup`, raw `LockBits` access and manual source-stride traversal
- Decodes PNG/BMP/JPEG directly into validated premultiplied `32bppPBGRA` DIB surfaces
- Addresses the renderer-stage access violation observed on Windows 10 22H2 build 19045.5679
- Retains phased renderer/hook diagnostics and guarded `dui70.dll` activation

## 1.5.66.0 Stable - 2026-07-03

- Hardened `dui70.dll` PE/import parsing for later Windows 10 22H2 servicing builds
- Bounded every descriptor, thunk and import-name read to the loaded module image
- Guarded native IAT reads and writes against structured exceptions
- Split renderer initialization from IAT activation for precise managed diagnostics
- Added native export guards so unsupported layouts return an error instead of terminating Explorer

## 1.5.65.0 Stable - 2026-07-03

- Moved Explorer background ownership into the already loaded `QTTabBarNative.dll`
- Stopped loading the legacy monolithic `QTHookLib` in background-only mode
- Removed the background feature's file dependency on `QTHookLib32/64.dll`
- Preserved the three module-scoped `dui70.dll` import hooks and safe image renderer
- Added an architecture smoke test proving initialization succeeds with no legacy hook DLL

## 1.5.64.0 Stable - 2026-07-03

- Replaced the legacy Explorer background path with an encapsulated renderer
- Removed MinHook entirely from background-only initialization
- Limited interception to three `dui70.dll` import slots and registered `DirectUIHWND` views
- Added validated immutable image snapshots and safe live configuration reloads
- Added correct premultiplied PNG alpha rendering and HDC lifecycle tracking
- Added window-property tokens to prevent reused HWND values from matching stale state
- Added configurable image directories, random selection and path-specific images
- Added ESC startup recovery while keeping legacy Shell hooks disabled by default
- Preserved native HRESULT diagnostics across the managed bridge

## 1.5.62.0 Stable - 2026-07-02

- Consolidated the native and .NET Framework 4.8 QTTabBar code lines
Expand All @@ -16,4 +127,3 @@
- Added isolated Explorer background rendering from `config.ini`
- Improved Win+E capture, tab focus and toolbar persistence
- Removed release debug paths and reduced success-log noise

2 changes: 1 addition & 1 deletion CREDITS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ QTTabBar Native Enhanced combines and extends work from several generations of Q

- **Akay Devel Coder** - project owner, product direction, integration decisions, visual design and extensive Windows/VM testing
- **OpenAI Codex** - major integration, debugging, native/managed implementation and release-engineering assistance under the project owner's direction
- **Maplespe / ExplorerBgTool** - inspiration for configurable and path-specific Explorer background images; this project uses an independently reworked renderer integrated with QTTabBar's targeted window registration

The attribution list is intentionally open for correction and expansion as additional upstream history is identified.

## Third-party components

This repository contains or references third-party components including MinHook, WiX build definitions and NotifyPropertyWeaver. Their original license and attribution terms continue to apply.

4 changes: 2 additions & 2 deletions Installer/Bundle.wxs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">

<Bundle Name="QTTabBar 1.5.62.0 Stable"
Version="1.5.62.0"
<Bundle Name="QTTabBar 1.5.79.0 Stable"
Version="1.5.79.0"
Manufacturer="indiff"
UpgradeCode="{6E6EAFA9-B39E-4A2F-88A0-E52B365F33D8}"
IconSourceFile="QTTabBar.ico">
Expand Down
6 changes: 3 additions & 3 deletions Installer/Installer.wxs
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@

<?define SkuName = "QTTabBar"?>
<?define RTMProductVersion="1.5.0" ?>
<?define ProductVersion="1.5.62" ?> <!-- MSI compares only the first three version fields. -->
<?define VersionString="1.5.62.0 Stable (2026)" ?>
<?define ProductVersion="1.5.79" ?> <!-- MSI compares only the first three version fields. -->
<?define VersionString="1.5.79.0 Stable (2026)" ?>
<?define UpgradeCode="{ec9baff7-58fb-40cb-9f67-1c438a7524a5}"?> <!-- NEVER CHANGE THIS, EVER!! -->
<!-- Quizo and Paul Accisano and indiff -->
<?define Manufacturer="indiff"?>
<?define ProductCode="*"?>
<!-- 重点这里一定要改 -->
<?define AssemblyVersion="1.5.62.0"?>
<?define AssemblyVersion="1.5.79.0"?>
<?define StrongName="QTTabBar, Version=$(var.AssemblyVersion), Culture=neutral, PublicKeyToken=973461f1cd23d8eb"?>
<?define MyLanguage="1033"?>
<!-- Language code page 1252 1033
Expand Down
13 changes: 13 additions & 0 deletions Installer/config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,14 @@ enabled=false

[image]
enabled=true
# Hold ESC while Explorer starts to bypass the background renderer for recovery.
# 遍历模式生效
random=false
# Optional directory containing additional PNG/BMP/JPG/JPEG images.
# Relative paths are resolved below C:\ProgramData\QTTabBar.
folder=Image
# Allow a section named after the current Explorer path to select an image.
custom=false
# 图片位置
#0 = Left top
#1 = Right top
Expand All @@ -19,3 +25,10 @@ posType=3
imgAlpha= 255
# 如果自定义存在则加载,反之加载目录的图片 *.png *.jpg *.jpeg C:\\ProgramData\\QTTabBar\\Image\\bgImage.png
imgPath=%ProgramData%\QTTabBar\libai.png

# Example for custom=true (the image must exist in the configured folder):
#[C:\Users\Public\Pictures]
#img=example.png
#
#[::{20D04FE0-3AEA-1069-A2D8-08002B30309D}]
#img=this-pc.png
8 changes: 4 additions & 4 deletions MinHook/libMinHook.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
Expand All @@ -102,7 +102,7 @@
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
Expand All @@ -117,7 +117,7 @@
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader>
</PrecompiledHeader>
Expand All @@ -136,7 +136,7 @@
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader>
</PrecompiledHeader>
Expand Down
Loading