--- title: Checkpoint 2026-08-20 02:09:45 UTC [cd55508883] type: checkpoint permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-20-02-09-45-utc-cd55508883 stable_id: 711881c1-544e-4195-9a1e-6439dbcd073a scope: project project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5 memory_type: checkpoint status: active revision: 1 restored_from_commit: 6a6a895eafcca6052e81a14fca103a42635dd1c2 created_at: '2026-09-23T15:11:32.576232+00:00' updated_at: '2026-09-23T15:11:32.576293+00:00' --- # WinUnLock 工程完成里程碑(2026-08-20) ## 完成内容 Rust workspace 全部实现并通过编译验证,位于 E:\code\WinUnLock。四个 crate:common(协议/配置/DPAPI/账户 account.rs/路径/错误 error.rs)、provider(cdylib,Credential Provider COM DLL:lib/provider/credential/pipe/registration/logging/shared)、client(bin,定时解锁客户端)、setup(bin,凭据设置)。另有 install/install.ps1、install/uninstall.ps1、install/provider.reg、README.md、rust-toolchain.toml。 ## 关键实现 - provider 只在 CPUS_UNLOCK_WORKSTATION 返回 Ok 并激活;登录/改密/CredUI 场景一律 E_NOTIMPL,彻底不干扰正常登录。GetCredentialCount 默认 pdwdefault=U32::MAX、autologon=false(不抢焦点),仅当管道 delivered=true 才请求自动登录。 - pipe.rs:PIPE_REJECT_REMOTE_CLIENTS + FILE_FLAG_FIRST_PIPE_INSTANCE + 单实例;SDDL=D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GRGW;;;AU)(D;;GA;;;AN)(D;;GA;;;NU);读缓冲 zeroize;线程 catch_unwind;一次性监听收到即停。 - lib.rs:导出 DllGetClassObject/DllCanUnloadNow/DllMain/DllRegisterServer/DllUnregisterServer 五个,全部 catch_unwind 转 HRESULT;DllMain 只做最轻初始化+DisableThreadLibraryCalls,日志失败静默降级,绝不 panic(规避原型 D:\log .expect 崩溃)。 - DPAPI LocalMachine 作用域(SYSTEM 计划任务可解密);协议 v1(magic 0x554E4C4B/version1/长度前缀 UTF-16LE user+pass+domain);registration.rs 写 HKLM CP 根 + HKCR CLSID InprocServer32 ThreadingModel=Apartment,braced_guid 有单测。 - rust-toolchain.toml 用 channel=stable(不写死版本,避免联网重装整条工具链)+ targets=x86_64-pc-windows-msvc。 ## 验证结果 - cargo build --release 通过(三产物:target\x86_64-pc-windows-msvc\release\ 下 provider.dll≈573KB、client.exe≈506KB、setup.exe≈632KB)。 - dumpbin /exports 确认 provider.dll 正确导出全部 5 个函数。 - rust-toolchain.toml 未再触发 rustup 卡顿(之前那次是一次性文件占用)。 ## 问题与解决 1. 后台实现 worker(agent 92dc7d23)两次被系统通知为 error(Other Models 用量限制、切 grok-4.6),但进程实际仍在跑并持续写文件;我误判其已死而前台并发写入,造成命名冲突(我写 provider 依赖 winunlock-common vs worker 的 common 包名 common)。解决:确认 worker 存活后停止前台写入,让其独立完成,冲突被其系统性重写覆盖修复。教训:判断 subagent 是否结束不能只看 error 通知,要看文件时间戳+进程+静默时长。 2. install.ps1/uninstall.ps1 原为 UTF-8 无 BOM 且含大量中文,本机 PowerShell 5.1 + 代码页 936(GBK) 下用 Parser::ParseFile 实测各有 8 个/3 个语法错误(会跑不起来)。解决:转存 UTF-8 with BOM,重测语法错误归零。 ## 下一步 / 给下个会话 - 用户将自行在虚拟机测试:cargo build --release → 管理员运行 install\install.ps1(可 -UnlockTime 改时间,默认08:30,计划任务 SYSTEM/Highest)→ 运行 %PROGRAMDATA%\WinUnLock\bin\setup.exe 设账户(.\用户名)与密码 → Win+L 锁屏 → 到点或临时把计划任务改到1-2分钟后 → 看 %PROGRAMDATA%\WinUnLock\logs\{provider,client}.log。通过后再上生产机。 - 待办:2 个 ps1 编码修复(install.ps1/uninstall.ps1 转 BOM)尚未提交,等用户确认是否 commit(worker 已做首次提交 3e4d09b)。 - 故障恢复(务必告知用户):若装 CP 后锁屏无法登录,进安全模式/WinRE 删注册表 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{E9C67B30-B120-4838-A5A3-FBC2DE03C532} 与 HKCR\CLSID\{同CLSID} 即可恢复默认登录。 - 未做/可选:未做 cargo clean 的从零复验(但 worker 本就是从空目录从零构建成功的);exe 内中文字符串在 GBK 控制台可能显示乱码(非致命,可 chcp 65001 或后续给 setup 加控制台 UTF-8 输出);Windows Hello PIN 不适用本方案(仅账户文本密码)。 - 参考仓库副本仍在 C:\Users\Administrator\AppData\Local\Temp\winunlock-research\(forum-winlogon/hodor/rust-cp-sample)。