<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>CZH 的博客</title><description>技术笔记与作品集</description><link>https://cai-zhi-huang.github.io/</link><language>zh_CN</language><item><title>卸载管理器 v0.1.0 正式版：占用排行、残留体检与开机自启</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-10-06-uninstaller-v010/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-10-06-uninstaller-v010/</guid><description>首个正式版。新增磁盘占用排行、全局残留体检、开机自启动、搜索高亮与列拖拽记忆、卸载后自动残留检测、系统托盘常驻、状态筛选与操作历史，并修复扫描卡死等关键问题。</description><pubDate>Tue, 06 Oct 2026 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.1.0&lt;/code&gt; 是卸载管理器的&lt;strong&gt;首个正式版&lt;/strong&gt;。从 v0.0.7 到 v0.1.0 累计做了十几项改进，其中扫描卡死和大小虚高是最影响实际使用的两个问题，都已解决。&lt;/p&gt;
&lt;h2&gt;新增&lt;/h2&gt;
&lt;h3&gt;磁盘占用排行&lt;/h3&gt;
&lt;p&gt;视图 ▸ 占用排行。按安装大小取 Top15 自绘条形图，一眼看清谁最占空间。&lt;strong&gt;点击条目会跳转到列表对应行&lt;/strong&gt;，不用再手动翻找。&lt;/p&gt;
&lt;h3&gt;全局残留体检&lt;/h3&gt;
&lt;p&gt;操作 ▸ 扫描所有残留。会扫描全部残留项（孤儿项）对应的磁盘残留，按软件分组列出，并提供「一键清理全部」。带进度条、可取消，删除失败时给出可操作的诊断提示——而不是笼统报一句&quot;失败&quot;。&lt;/p&gt;
&lt;h3&gt;开机自启动&lt;/h3&gt;
&lt;p&gt;本程序 ▸ 开机自启动。写入用户级 &lt;code&gt;HKCU\...\CurrentVersion\Run&lt;/code&gt;，&lt;strong&gt;不需要管理员权限&lt;/strong&gt;，路径自动带引号兼容空格。&lt;/p&gt;
&lt;h3&gt;搜索高亮 + 列拖拽记忆&lt;/h3&gt;
&lt;p&gt;搜索时，名称列里命中的片段会&lt;strong&gt;黄底高亮&lt;/strong&gt;，长列表里找词一眼定位。表头也支持拖拽重排，列顺序与列宽自动记忆，重启后恢复。&lt;/p&gt;
&lt;h3&gt;卸载后自动残留检测&lt;/h3&gt;
&lt;p&gt;以前卸载完要手动点&quot;是否扫描残留&quot;，现在&lt;strong&gt;卸载完成自动扫描&lt;/strong&gt;该软件残留并弹出清理框。批量卸载后会合并所有成功项的残留，提供「一键清理全部」。&lt;/p&gt;
&lt;h3&gt;系统托盘常驻&lt;/h3&gt;
&lt;p&gt;关闭按钮改为最小化到系统托盘（首次会给出一次性提示），双击托盘图标恢复窗口，托盘右键含「显示主界面 / 退出」。适合当后台常驻工具用，不会误手关掉。&lt;/p&gt;
&lt;h3&gt;状态筛选&lt;/h3&gt;
&lt;p&gt;工具栏新增状态下拉：全部 / 正常 / 运行中 / 残留，可与搜索词、仅显示残留项叠加使用。&lt;/p&gt;
&lt;h3&gt;操作历史&lt;/h3&gt;
&lt;p&gt;所有破坏性操作（卸载 / 删除残留 / 强制删除 / 删注册表项）都会自动记录。本程序 ▸ 查看操作历史，可导出 CSV / TXT。排查&quot;我刚才删了什么&quot;很方便。&lt;/p&gt;
&lt;h3&gt;其他&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;导出选中软件&lt;/strong&gt;：右键菜单仅导出当前选中行（CSV / HTML / TSV）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义背景&lt;/strong&gt;：支持铺满 / 居中 / 平铺、模糊、跟随系统桌面壁纸&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卸载前系统还原点&lt;/strong&gt;：卸载（含批量）前自动创建系统还原点，失败静默跳过不阻断卸载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;列表视觉&lt;/strong&gt;：斑马纹 + 悬停高亮，显示列可自定义显隐，亮/暗主题滚动条与下拉框统一样式&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;h3&gt;扫描大目录卡死（重点）&lt;/h3&gt;
&lt;p&gt;原来的磁盘搜索没有时间上限，碰到大目录（&lt;code&gt;Windows&lt;/code&gt;、&lt;code&gt;WinSxS&lt;/code&gt;、&lt;code&gt;ProgramData&lt;/code&gt; 这类）会长时间无响应，看起来像卡死了。&lt;/p&gt;
&lt;p&gt;现在加了三层防护：单项 2.5 秒预算 + 大目录直接跳过（所有深度生效）+ KB 更新类条目不再做磁盘搜索；扫描过程还可随时取消。实际扫描时间从最坏情况下的几分钟降到约 15 秒。&lt;/p&gt;
&lt;h3&gt;图标错误&lt;/h3&gt;
&lt;p&gt;不再被 &lt;code&gt;unins000.exe&lt;/code&gt; / &lt;code&gt;uninst.exe&lt;/code&gt; 等卸载器图标冒充应用图标。图标本身也做了高清化——改用 &lt;code&gt;SHDefExtractIconW&lt;/code&gt; 提取 64px 图标，并加了缓存加速。&lt;/p&gt;
&lt;h3&gt;安装大小虚高&lt;/h3&gt;
&lt;p&gt;同一安装目录的多个组件只计一次大小（NVIDIA/CUDA 场景总占用回落到真实值）。与 v0.0.9 的修复同源，这次把去重逻辑做成了幂等重算，避免旧缓存继续产生虚高数值。&lt;/p&gt;
&lt;h3&gt;安装位置显示空白&lt;/h3&gt;
&lt;p&gt;修复部分条目安装位置列空白。&lt;/p&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安装版：&lt;a href=&quot;https://cai-zhi-huang.github.io/downloads/uninstaller/Uninstaller-Setup.exe&quot;&gt;Uninstaller-Setup.exe&lt;/a&gt;（约 65 MB，双击即装）&lt;/li&gt;
&lt;li&gt;便携版：&lt;a href=&quot;https://cai-zhi-huang.github.io/downloads/uninstaller/uninstaller-portable.zip&quot;&gt;uninstaller-portable.zip&lt;/a&gt;（约 25 MB，解压即用）&lt;/li&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.1.0&quot;&gt;卸载管理器 v0.1.0 (正式版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;版本号说明&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;version.hpp&lt;/code&gt; 是版本号的唯一权威来源。修改其中的 &lt;code&gt;APP_VERSION&lt;/code&gt; / &lt;code&gt;APP_VERSION_SUFFIX&lt;/code&gt; 后，Windows 文件属性版本信息与安装器注册表 &lt;code&gt;DisplayVersion&lt;/code&gt; 都会自动跟随，不需要手动改多处——这也是从 v0.0.9 之后把版本链路全自动化掉的原因。&lt;/p&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.9 发布：自卸载修复、图标修复与大小去重</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-10-05-uninstaller-v009/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-10-05-uninstaller-v009/</guid><description>v0.0.9 修复自卸载失败、卸载器图标冒充应用图标、重复条目双登记，以及 NVIDIA 等同目录子组件大小重复计费导致总占用虚高的问题。</description><pubDate>Mon, 05 Oct 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.9&lt;/code&gt; 集中修了一批使用过程中暴露的问题，其中大小虚高是最影响用户判断的一个。&lt;/p&gt;
&lt;h2&gt;修复&lt;/h2&gt;
&lt;h3&gt;自卸载失败&lt;/h3&gt;
&lt;p&gt;原先卸载自身时，直接套用普通软件的卸载流程，容易失败。现在会先识别自身注册项，走专用卸载流程（由独立的 &lt;code&gt;uninst.exe&lt;/code&gt; 删除目录）。若确实留下残留项，改为提示用户用右键「强制删除」处理，避免自卸载直接失败。&lt;/p&gt;
&lt;h3&gt;卸载器图标冒充应用图标&lt;/h3&gt;
&lt;p&gt;列表里的图标取自 &lt;code&gt;DisplayIcon&lt;/code&gt; 或 &lt;code&gt;UninstallString&lt;/code&gt; 指向的文件。很多软件会把 &lt;code&gt;unins000.exe&lt;/code&gt; / &lt;code&gt;uninst.exe&lt;/code&gt; 注册为图标源，导致列表里一片&quot;卸载器&quot;图标，完全认不出是哪个软件。&lt;/p&gt;
&lt;p&gt;现在过滤这些卸载器图标，并对微信等软件改为&lt;strong&gt;优先取主程序&lt;/strong&gt;图标。&lt;/p&gt;
&lt;h3&gt;图标全黑 / 绿方块&lt;/h3&gt;
&lt;p&gt;为提速，图标提取一度改为浅扫描，结果拿到无效图标。现在 MSI 图标源补按用户级 &lt;code&gt;%APPDATA%&lt;/code&gt; 兜底，微信等主程序优先于 &lt;code&gt;Uninstall.exe&lt;/code&gt;，&lt;code&gt;fastMode&lt;/code&gt; 改为浅扫描根层 exe，图标恢复正常。&lt;/p&gt;
&lt;h3&gt;重复条目双登记&lt;/h3&gt;
&lt;p&gt;SketchUp、Windows Update（KB）等软件会在注册表里登记两次，列表里出现同名两行。现在按解析后的显示名二次去重。&lt;/p&gt;
&lt;h3&gt;安装大小虚高（重点）&lt;/h3&gt;
&lt;p&gt;NVIDIA 的 CUDA 组件会拆成多个条目登记，&lt;strong&gt;但它们装在同一个目录里&lt;/strong&gt;。原先每个条目各自累加目录大小，同一份文件被重复计费多次，总占用虚高到 70GB。&lt;/p&gt;
&lt;p&gt;现在同安装目录的组件只计一次大小，总占用回落到真实值。同类问题还包括坏占位符 &lt;code&gt;${{arpDisplayName}}&lt;/code&gt; 导致的显示名异常，改为从键名后缀推导（如 &lt;code&gt;cufft 11.6&lt;/code&gt;）。&lt;/p&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.9&quot;&gt;卸载管理器 v0.0.9 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;安全提醒：若此前电脑有 &lt;code&gt;C:\ProgramData\Venlnk&lt;/code&gt; 启动劫持残留，请按发布说明清理。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.8 发布：桌面快捷方式与更新检查修复</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-28-uninstaller-v008/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-28-uninstaller-v008/</guid><description>v0.0.8 让安装器在桌面创建快捷方式，并把版本检查地址迁到 GitHub Pages 上的稳定 version.json。</description><pubDate>Fri, 28 Aug 2026 12:30:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.8&lt;/code&gt; 是一轮小版本，主要解决安装器使用体验和更新检查链路两个问题。&lt;/p&gt;
&lt;h2&gt;新增&lt;/h2&gt;
&lt;h3&gt;安装器创建桌面快捷方式&lt;/h3&gt;
&lt;p&gt;原先只有开始菜单快捷方式，安装完还要自己去桌面找。现在安装器会同时在桌面创建快捷方式，找起来更方便。&lt;/p&gt;
&lt;h3&gt;版本检查地址改为 GitHub Pages&lt;/h3&gt;
&lt;p&gt;原先版本检查指向 NAS 上的 cpolar 穿透地址——那个地址是动态的，cpolar 重启就会变，导致版本检查间歇性失效。&lt;/p&gt;
&lt;p&gt;现在改为指向 GitHub Pages 上的 &lt;code&gt;version.json&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://cai-zhi-huang.github.io/version.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是一个稳定地址，不随本地部署变动。软件运行在用户本机，访问 GitHub Pages 正常；博客给同学看的穿透走 NAS cpolar，与此无关，两者互不影响。&lt;/p&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.8&quot;&gt;卸载管理器 v0.0.8 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.7 发布：安全加固轮次 F11–F14</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v007/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v007/</guid><description>v0.0.7 是第二轮独立安全复审，修复 junction 跟随删除、安装器路径穿越、MSI 完整路径与自卸载安全 4 处问题。</description><pubDate>Wed, 26 Aug 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.7&lt;/code&gt; 以攻击视角重新审计 F1–F10 落地代码，发现并修复 4 处报告未覆盖或 F4 漏网的漏洞。&lt;/p&gt;
&lt;h2&gt;安全修复&lt;/h2&gt;
&lt;h3&gt;F11 残留/目录删除防 junction 跟随（高危）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;deleteResidualFiles&lt;/code&gt; / &lt;code&gt;deleteDirectory&lt;/code&gt; 原先使用 &lt;code&gt;fs::remove_all&lt;/code&gt;，而 &lt;code&gt;isProtectedPath&lt;/code&gt; 只比对字符串路径。若残留目录是 junction/符号链接，指向 &lt;code&gt;C:\Windows\System32&lt;/code&gt; 等系统目录，&lt;code&gt;remove_all&lt;/code&gt; 会跟随 junction 进入目标目录递归删除，造成灾难性误删。&lt;/p&gt;
&lt;p&gt;修复：删除前用 &lt;code&gt;fs::weakly_canonical&lt;/code&gt; 解析真实路径并重查 &lt;code&gt;isProtectedPath&lt;/code&gt;；新增 &lt;code&gt;isReparsePoint()&lt;/code&gt; 基于 &lt;code&gt;GetFileAttributesW(FILE_ATTRIBUTE_REPARSE_POINT)&lt;/code&gt; 判定重解析点，仅 &lt;code&gt;fs::remove&lt;/code&gt; 删除链接本体，绝不进入目标目录递归。&lt;/p&gt;
&lt;h3&gt;F12 安装器自解压路径穿越（中危）&lt;/h3&gt;
&lt;p&gt;自解压安装器原先 &lt;code&gt;dest = target + &quot;\\&quot; + fe.rel&lt;/code&gt;，未校验 &lt;code&gt;..&lt;/code&gt;、绝对路径或 UNC。恶意或破损负载可把文件写出安装目录之外（如 &lt;code&gt;C:\Windows\System32&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;修复：&lt;code&gt;dest&lt;/code&gt; 经 &lt;code&gt;GetFullPathNameW&lt;/code&gt; 解析后，严格校验落点必须位于 &lt;code&gt;target\&lt;/code&gt; 之内，越界文件跳过不写。&lt;/p&gt;
&lt;h3&gt;F13 MSI 卸载走完整路径（中危）&lt;/h3&gt;
&lt;p&gt;MSI 卸载原先调用裸 &lt;code&gt;msiexec.exe&lt;/code&gt;。便携目录用户可写，可被植入同名恶意 &lt;code&gt;msiexec.exe&lt;/code&gt; 劫持（F4 漏网项）。&lt;/p&gt;
&lt;p&gt;修复：改为 &lt;code&gt;System32\msiexec.exe&lt;/code&gt; 完整路径。&lt;/p&gt;
&lt;h3&gt;F14 自卸载防 junction 跟随（中危）&lt;/h3&gt;
&lt;p&gt;自卸载原先使用 PowerShell &lt;code&gt;Remove-Item -Recurse -Force&lt;/code&gt;，会跟随 junction 删除系统目录，与 F11 同源。&lt;/p&gt;
&lt;p&gt;修复：改用 &lt;code&gt;cmd /c rmdir /s /q&lt;/code&gt;（不遍历 junction），PowerShell/cmd 均走 System32 完整路径。&lt;/p&gt;
&lt;h2&gt;验证&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;主程序 &lt;code&gt;cmake --build&lt;/code&gt; 重编 &lt;code&gt;registry.cpp&lt;/code&gt; + &lt;code&gt;mainwindow.cpp&lt;/code&gt; + &lt;code&gt;appicon.rc&lt;/code&gt; → EXIT 0。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uninst.cpp&lt;/code&gt; / &lt;code&gt;installer_base.exe&lt;/code&gt; 重新编译链接 → EXIT 0。&lt;/li&gt;
&lt;li&gt;便携 zip 重建，内置 &lt;code&gt;uninstaller.exe&lt;/code&gt; 校验为 v0.0.7。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.7&quot;&gt;卸载管理器 v0.0.7 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.6 发布：热修更新弹窗“不再提示此版本”失效</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v006/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v006/</guid><description>v0.0.6 修复勾选“不再提示此版本”后，下次启动仍会弹出更新日志的问题。</description><pubDate>Wed, 26 Aug 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.6&lt;/code&gt; 修复 v0.0.5 中“不再提示此版本”设置失效的问题。&lt;/p&gt;
&lt;h2&gt;根因&lt;/h2&gt;
&lt;p&gt;程序在 &lt;code&gt;closeEvent&lt;/code&gt; 中调用 &lt;code&gt;::ExitProcess(0)&lt;/code&gt; 强制退出，不跑完整析构与 &lt;code&gt;QSettings&lt;/code&gt; 自动 sync。如果用户勾选/取消“不再提示此版本”后没有手动触发 &lt;code&gt;settings.sync()&lt;/code&gt;，设置可能来不及落盘，下次启动仍会弹窗。&lt;/p&gt;
&lt;h2&gt;修复内容&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;showUpdatePopup()&lt;/code&gt; 不再仅在点击“知道了”时才写 &lt;code&gt;QSettings&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;用户勾选或取消“不再提示此版本”时，立即写入并调用 &lt;code&gt;settings.sync()&lt;/code&gt; 强制 flush。&lt;/li&gt;
&lt;li&gt;OK 路径二次写入，确保状态可靠落盘。&lt;/li&gt;
&lt;li&gt;追加 &lt;code&gt;startup.log&lt;/code&gt; 诊断日志，便于排查“勾了仍弹”的真实状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;教训&lt;/h2&gt;
&lt;p&gt;任何需要在退出前持久化的设置，写入后都要立刻 &lt;code&gt;sync()&lt;/code&gt;，不能依赖析构自动落盘。&lt;/p&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.6&quot;&gt;卸载管理器 v0.0.6 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.5 发布：扫描残留 UX 优化</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v005/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v005/</guid><description>v0.0.5 修复「扫描文件」按钮对正常软件点击后弹出模糊「未找到」的误导问题。</description><pubDate>Wed, 26 Aug 2026 06:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.5&lt;/code&gt; 是一个小版本的 UX 优化，解决“扫描文件”按钮容易被误点、结果提示含糊的问题。&lt;/p&gt;
&lt;h2&gt;修复内容&lt;/h2&gt;
&lt;h3&gt;扫描残留提示更明确&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scanResiduals()&lt;/code&gt; 对非残留项（&lt;code&gt;isOrphaned == false&lt;/code&gt;）直接说明“该软件当前正在正常运行，未被判定为残留项，因此没有可扫描的残留文件”。&lt;/li&gt;
&lt;li&gt;不再走完流程后弹出模糊的“未找到”。根因在于 &lt;code&gt;scanResidualFiles&lt;/code&gt; 对正常软件本就返回空，此按钮仅用于扫描已卸载但仍遗留文件的残留项。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;详情页按钮置灰&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;showDetailDialog&lt;/code&gt; 中“扫描文件”按钮对正常软件禁用，并加 tooltip“仅『残留项』（已卸载但仍有遗留文件）可扫描残留”，避免误点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.5&quot;&gt;卸载管理器 v0.0.5 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.4 发布：热修打开文件位置失效 + 详情版本显示</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v004/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v004/</guid><description>v0.0.4 修复 v0.0.3 发布后发现的两个缺陷：打开文件位置失效与详情页版本显示 0.0.0。</description><pubDate>Wed, 26 Aug 2026 03:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.4&lt;/code&gt; 是 v0.0.3 发布后的热修复版，解决两个用户可见的回归问题。&lt;/p&gt;
&lt;h2&gt;修复内容&lt;/h2&gt;
&lt;h3&gt;打开文件位置失效&lt;/h3&gt;
&lt;p&gt;v0.0.3 安全加固 F4 中误用 &lt;code&gt;GetSystemDirectoryW&lt;/code&gt; 拼出 &lt;code&gt;C:\Windows\System32\explorer.exe&lt;/code&gt;，但该路径下并不存在资源管理器（真实位置是 &lt;code&gt;C:\Windows\explorer.exe&lt;/code&gt;），导致 &lt;code&gt;ShellExecuteW&lt;/code&gt; 返回 ≤32 并误报“找不到文件位置”。&lt;/p&gt;
&lt;p&gt;现已改为 &lt;code&gt;GetWindowsDirectoryW&lt;/code&gt; 取 Windows 主目录，既修复失效，又保留 F4 的防种植目标。&lt;/p&gt;
&lt;h3&gt;详情页版本显示 0.0.0&lt;/h3&gt;
&lt;p&gt;安装器 &lt;code&gt;installer.cpp&lt;/code&gt; 的 &lt;code&gt;DisplayVersion&lt;/code&gt; 被硬编码为 &lt;code&gt;L&quot;0.0.0&quot;&lt;/code&gt;，未随版本 bump。现改为 &lt;code&gt;L&quot;0.0.4&quot;&lt;/code&gt;，与 &lt;code&gt;version.hpp&lt;/code&gt; / &lt;code&gt;appicon.rc&lt;/code&gt; 保持一致。&lt;/p&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.4&quot;&gt;卸载管理器 v0.0.4 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.3 发布：安全加固 F1–F10</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v003/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-26-uninstaller-v003/</guid><description>v0.0.3 是一次全面安全审计与加固，重点防御命令注入、路径绕过、DLL 种植劫持、缓存投毒与意外提权。</description><pubDate>Wed, 26 Aug 2026 01:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.3&lt;/code&gt; 以“纵深防御”为目标，对命令注入、路径绕过、DLL 种植、缓存投毒和意外提权等攻击面进行了系统加固。完整审计过程见本地 &lt;code&gt;tools/security_audit_report.md&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;命令注入与路径绕过&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;F1 PowerShell 命令注入&lt;/strong&gt;：自卸载桩对 &lt;code&gt;InstallLocation&lt;/code&gt; 中的单引号做转义（&lt;code&gt;&apos;&apos;&lt;/code&gt;），&lt;code&gt;powershell.exe&lt;/code&gt; 改用 &lt;code&gt;System32\WindowsPowerShell\v1.0\&lt;/code&gt; 完整路径。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F2 reg.exe 参数注入&lt;/strong&gt;：提权删注册表前校验键名不含 &lt;code&gt;&quot;&lt;/code&gt;，含则拒绝；&lt;code&gt;reg.exe&lt;/code&gt; 改用 &lt;code&gt;System32&lt;/code&gt; 完整路径。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F3 8.3 短名绕过&lt;/strong&gt;：&lt;code&gt;isProtectedPath&lt;/code&gt; 比较前用 &lt;code&gt;GetLongPathNameW&lt;/code&gt; 还原 &lt;code&gt;PROGRA~1&lt;/code&gt; 等长名，防止误删 Program Files 目录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F4 裸系统二进制名&lt;/strong&gt;：&lt;code&gt;reg.exe&lt;/code&gt;、&lt;code&gt;powershell.exe&lt;/code&gt;、&lt;code&gt;taskkill.exe&lt;/code&gt;、&lt;code&gt;explorer.exe&lt;/code&gt;、&lt;code&gt;regedit.exe&lt;/code&gt;、&lt;code&gt;msiexec.exe&lt;/code&gt; 全部改用 &lt;code&gt;GetSystemDirectoryW&lt;/code&gt; 完整路径，杜绝 DLL/二进制种植。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F5 UI 线程阻塞&lt;/strong&gt;：提权删 &lt;code&gt;reg.exe&lt;/code&gt; 等待改为 &lt;code&gt;MsgWaitForMultipleObjects&lt;/code&gt; + 消息泵，UAC 期间界面不再假死。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;篡改与提权防御&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;F6 DLL 种植劫持&lt;/strong&gt;：&lt;code&gt;main()&lt;/code&gt; 入口调用 &lt;code&gt;SetDllDirectoryW(L&quot;&quot;)&lt;/code&gt; + &lt;code&gt;SetSearchPathMode&lt;/code&gt;，从 DLL 搜索顺序移除当前目录、启用安全搜索模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F8 缓存投毒&lt;/strong&gt;：&lt;code&gt;uninstaller_cache.json&lt;/code&gt; 增加 Sha256 + 盐完整性校验，被清空或篡改即丢弃并回退实时扫描。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F10 UAC 清单缺失&lt;/strong&gt;：新增 &lt;code&gt;app.manifest&lt;/code&gt; 与 &lt;code&gt;installer.manifest&lt;/code&gt;，显式声明 &lt;code&gt;asInvoker / uiAccess=false&lt;/code&gt;，修复因 exe 名含 &quot;uninstall&quot;/&quot;Setup&quot; 触发 Windows 自动提权的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;发布前必做&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;代码签名（Authenticode）需证书，当前环境无法签名；下载页与 Release 提供 &lt;strong&gt;SHA-256 校验值&lt;/strong&gt; 作为替代校验手段。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.3&quot;&gt;卸载管理器 v0.0.3 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.2 发布：运行态可见、扫描更快、搜索更准</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-20-uninstaller-v002/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-20-uninstaller-v002/</guid><description>v0.0.2 优化运行中软件显示、残留扫描策略、搜索别名与卸载状态反馈，让列表状态更准确、操作更可控。</description><pubDate>Thu, 20 Aug 2026 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;v0.0.2&lt;/code&gt; 聚焦“列表状态真实、排序不被重置、搜索结果更全”三个方向，对扫描、搜索、卸载反馈做了一轮集中打磨。&lt;/p&gt;
&lt;h2&gt;运行中 / 残留判定更准确&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;扩展了中文软件名到进程关键字的映射，覆盖企业微信、腾讯会议、网易云音乐、百度网盘、支付宝、抖音、飞书、B站、米哈游/原神、小红书、喜马拉雅、知乎、微博等常见国产软件。&lt;/li&gt;
&lt;li&gt;“运行中”标记与残留判定共用同一套关键字，减少误判残留或漏标运行中的情况。&lt;/li&gt;
&lt;li&gt;运行中软件不再被整组隐藏，而是保留在列表中并以蓝色“运行中”标注；空名称软件以“（未命名软件）”占位显示，仍可选中卸载。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;残留扫描防卡死&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;扫描安装目录前，先判断所在磁盘类型：网络盘、可移动盘、U 盘、CD 等非固定盘直接跳过，避免后台扫描在慢速或不可达路径上阻塞列表加载。&lt;/li&gt;
&lt;li&gt;卸载/删除残留后强制重扫列表（不再命中启动缓存），确保界面状态与真实系统一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;搜索别名扩展&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;新增 13 组常用软件别名，例如“网易云音乐”可命中 &lt;code&gt;cloudmusic&lt;/code&gt; / &lt;code&gt;netease&lt;/code&gt;，中英文可互搜，找软件更快。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;卸载状态三态化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;卸载结果改为“成功 / 失败 / 已取消”。用户拒绝 UAC 提权或在 MSI 向导中点取消时，会正确提示“已取消、未做任何更改”，不再误报为失败。&lt;/li&gt;
&lt;li&gt;批量卸载独立统计成功 / 已取消 / 失败数量，取消项不再计入失败。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;其他体验修复&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;卸载/删除/刷新后保留用户排序偏好，清空搜索框后排序也不再重置。&lt;/li&gt;
&lt;li&gt;并行扫描前只枚举一次系统进程快照，避免数百次重复枚举。&lt;/li&gt;
&lt;li&gt;卸载入口缺失时不再误报失败。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.2&quot;&gt;卸载管理器 v0.0.2 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>卸载管理器 v0.0.1 发布：一款轻量绿色的 Windows 卸载工具</title><link>https://cai-zhi-huang.github.io/blog/posts/2026-08-12-uninstaller-v001/</link><guid isPermaLink="true">https://cai-zhi-huang.github.io/blog/posts/2026-08-12-uninstaller-v001/</guid><description>轻量、绿色的 Windows 卸载工具，集中管理已安装软件并清理卸载后残留的注册表与文件。</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天把做了好一阵子的&lt;strong&gt;卸载管理器&lt;/strong&gt;整理出了第一个公开版本 &lt;code&gt;v0.0.1（试用版）&lt;/code&gt;。它是一款轻量、绿色的 Windows 小工具，用来集中管理本机已安装软件，并清理卸载后留下的残留。&lt;/p&gt;
&lt;h2&gt;主要功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;软件清单&lt;/strong&gt;：扫描注册表（&lt;code&gt;HKLM&lt;/code&gt; / &lt;code&gt;HKCU&lt;/code&gt; 的 Uninstall 项），列出全部已安装程序，显示名称、版本、发行商、安装大小。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装大小统计&lt;/strong&gt;：自动计算安装目录占用空间；内置三道上限保护（文件数 / 扫描时间 / 总条目）和事件泵，哪怕是钉钉那种超大目录、网络盘、或带符号链接的目录，界面也不会卡死。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;残留项检测&lt;/strong&gt;：智能识别“卸载程序已经不存在、但注册表项还在”的残留；并加了&lt;strong&gt;进程运行护栏&lt;/strong&gt;——软件还在跑（比如微信）时不会误判为残留，避免误删。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;空壳项识别&lt;/strong&gt;：识别只有版本号、没有任何有效路径的空壳注册表项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一键卸载&lt;/strong&gt;：支持 MSI 与 EXE 卸载程序，自动处理带空格的路径，必要时请求 UAC 提权。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;打开文件位置&lt;/strong&gt;：在资源管理器里直接定位并选中主程序。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除残留注册表项&lt;/strong&gt;：对确认真实残留的项可删除其注册表项（操作 &lt;code&gt;HKLM&lt;/code&gt; 时自动提权，并有二次确认）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;启动更新弹窗&lt;/strong&gt;：每个大版本首次打开即展示本次更新内容，可勾选“不再提示此版本”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;下载与运行&lt;/h2&gt;
&lt;p&gt;便携版无需安装，下载解压后双击 &lt;code&gt;uninstaller.exe&lt;/code&gt; 即可运行（Qt 运行库已随附）。要求 Windows 10 / 11（64 位）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Release：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/tag/v0.0.1&quot;&gt;卸载管理器 v0.0.1 (试用版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;直接下载便携包（zip，约 23 MB）：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable/releases/download/v0.0.1/uninstaller-portable.zip&quot;&gt;uninstaller-portable.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/Cai-zhi-huang/uninstaller-portable&quot;&gt;Cai-zhi-huang/uninstaller-portable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;后续计划&lt;/h2&gt;
&lt;p&gt;暂无。&lt;/p&gt;
</content:encoded></item></channel></rss>