4.6 KiB
4.6 KiB
title, type, permalink, stable_id, scope, project_id, memory_type, status, revision, restored_from_commit, created_at, updated_at
| title | type | permalink | stable_id | scope | project_id | memory_type | status | revision | restored_from_commit | created_at | updated_at |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Checkpoint 2026-08-20 02:09:45 UTC [cd55508883] | checkpoint | main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-20-02-09-45-utc-cd55508883 | 711881c1-544e-4195-9a1e-6439dbcd073a | project | ea207d36-693c-4349-b3c8-7c40c8c889f5 | checkpoint | active | 1 | 6a6a895eaf |
2026-09-23T15:11:32.576232+00:00 | 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 卡顿(之前那次是一次性文件占用)。
问题与解决
- 后台实现 worker(agent 92dc7d23)两次被系统通知为 error(Other Models 用量限制、切 grok-4.6),但进程实际仍在跑并持续写文件;我误判其已死而前台并发写入,造成命名冲突(我写 provider 依赖 winunlock-common vs worker 的 common 包名 common)。解决:确认 worker 存活后停止前台写入,让其独立完成,冲突被其系统性重写覆盖修复。教训:判断 subagent 是否结束不能只看 error 通知,要看文件时间戳+进程+静默时长。
- 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)。