Files
MemRelay/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/Checkpoint 2026-08-20 02-09-45 UTC [cd55508883].md
T

42 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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)。