chore: 导入旧记忆备份供恢复

This commit is contained in:
2026-09-23 22:38:40 +08:00
parent 5313fcee7a
commit 6a6a895eaf
638 changed files with 29816 additions and 1 deletions
@@ -0,0 +1,64 @@
---
title: Checkpoint 2026-08-20 02:00:50 UTC [d8e18b60e5]
type: checkpoint
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-20-02-00-50-utc-d8e18b60e5
stable_id: 715e4eb8-48b7-4540-9a75-5be72eeb0c7e
scope: project
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-impl-complete-2026-08-20
created_at: '2026-08-20T02:00:50.601098+00:00'
updated_at: '2026-08-20T02:00:50.601098+00:00'
tags:
- 实现完成
- credential-provider
- rust
- 编译通过
- 待VM验证
---
# WinUnLock 完整工程实现完成(编译通过 + 导出验证 + 首次提交)
## 完成内容
在 E:\code\WinUnLock 从零落地了完整可编译工程,30 个文件、3701 行,首次提交 3e4d09b(分支 main)。
### 四个 crate(包名即产物名)
- **common**(rlib):protocol.rs 管道协议 v1 编解码(magic 0x554E4C4B/version 1,单字段上限 64KiB)、config.rs(serde+toml)、dpapi.rs(CryptProtectData/CryptUnprotectData,LocalMachine 作用域 + 固定 entropy "WinUnLock::DPAPI::v1")、account.rs(域\用户 解析)、paths.rs(%PROGRAMDATA%\WinUnLock)、error.rs(thiserror)
- **provider**(cdylib → provider.dll):lib.rs(导出+类工厂)、provider.rs(ICredentialProvider)、credential.rs(ICredentialProviderCredential + CredPack + LSA Negotiate 包查询)、pipe.rs(管道服务端)、registration.rs(自注册)、logging.rs(轻量文件日志)、shared.rs
- **client**(bin → client.exe):读 config+cred.bin,WaitNamedPipeW+CreateFileW+WriteFile 发送,带重试
- **setup**(bin → setup.exe):交互式设置,用 SetConsoleMode 关闭 ENABLE_ECHO_INPUT 实现密码不回显(未引入 rpassword 依赖)
## 关键实现决策
- **有意不设 panic="abort"**:provider.dll 跑在 LogonUI 内,abort 会拖垮登录界面。改为在 DllMain/导出函数/管道线程用 catch_unwind 兜底,满足「确保 FFI 边界不展开」。已在根 Cargo.toml 注释说明理由。
- **只在 CPUS_UNLOCK_WORKSTATION 返回 S_OK**,其余场景(含 CPUS_LOGON)返回 E_NOTIMPL,彻底不干扰正常登录/改密。
- **不抢默认磁贴**:凭据未送达时 GetCredentialCount 把 pdwdefault 设为 0xFFFFFFFF 且 autologon=false,保证用户仍能手动解锁;凭据送达后才置 0 + true。
- 管道:PIPE_ACCESS_INBOUND|FILE_FLAG_FIRST_PIPE_INSTANCE,PIPE_TYPE_MESSAGE|READMODE_MESSAGE|WAIT|PIPE_REJECT_REMOTE_CLIENTS,nMaxInstances=1,SDDL `D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GRGW;;;AU)(D;;GA;;;AN)(D;;GA;;;NU)`(沿用 hodor 思路)。Drop 时靠「自连接 CreateFileW(GENERIC_WRITE)」唤醒阻塞的 ConnectNamedPipe。
- GetSerialization 成功后立即 zeroize 共享密码并把 ready 置回 false(一次性凭据)。
## 编译期踩到并已修复的 windows 0.62.2 API 差异(重要经验)
1. `GetLocalTime()` **无出参**,直接返回 SYSTEMTIME(不是 C 风格 `GetLocalTime(&mut st)`)。
2. `WaitNamedPipeW` 返回 **BOOL**(用 `.as_bool()`),不是 Result。
3. DPAPI 签名验证正确:`CryptProtectData(&in_blob, PCWSTR::null(), Some(&entropy), None, None, u32_flags, &mut out)`;`CryptUnprotectData` 第 2 参是 `Option<*mut PWSTR>` 传 None。dwflags 是裸 u32。输出 blob 需 LocalFree。
4. `RegCreateKeyExW`/`RegSetValueExW` 的 reserved 参数在 0.62.2 里是 **Option 类型**(传 None,不是 0)。
5. `GetModuleFileNameW(Some(hmodule), &mut buf)` 第一参是 Option<HMODULE>。
## 验证结果
- `cargo build --release --target x86_64-pc-windows-msvc` **通过,零警告**。产物:provider.dll 586752 B、client.exe 518656 B、setup.exe 647680 B。
- `cargo test` **14 个测试全过**(协议往返/错误magic/错误version/超长字段/截断数据/Debug不泄露密码/账户解析×4/配置往返/DPAPI往返/GUID格式化)。DPAPI 往返实测通过,证明 LocalMachine+entropy 组合可用。
- dumpbin /exports 确认 provider.dll 正确导出 5 个函数:DllCanUnloadNow、DllGetClassObject、DllMain、DllRegisterServer、DllUnregisterServer(cdylib 自动导出,无需 .def,已在 .cargo/config.toml 注释说明)。
## 遇到的坑与解决
- **rust-toolchain.toml 写死 channel="1.94.1" 会触发 rustup 联网重装整条工具链**,本机 1.94.1 目录处于「部分安装」状态,导致 rename 失败(os error 145 目录不是空的)并反复重试。已改为 `channel = "stable"`(本机 stable 即 1.94.1)。该文件在 rustup 回滚过程中被清掉过一次,重写后已确认存在并进入提交。
- 昨天中断留下的 3 个占位 stub(winunlock-provider/client/setup,引用不存在的 winunlock-common)导致 cargo 无法解析 workspace,已全部用真实实现覆盖,包名统一为 common/provider/client/setup,使产物直接叫 provider.dll/client.exe/setup.exe,与 install.ps1 和 provider.reg 对齐。
## 边界遵守情况(已实测确认)
全程只做代码编写 + cargo build/test + dumpbin。已验证:`%PROGRAMDATA%\WinUnLock` 不存在、注册表 CLSID 项不存在、计划任务不存在。未执行任何 regsvr32/改注册表/建计划任务/复制文件到 ProgramData。
## 下一步 / 给下个会话
1. **端到端真机流程尚未验证**,必须由用户在虚拟机里测:先拍快照 → 管理员跑 install.ps1(可用 -UnlockTime 定在 1~2 分钟后)→ 跑 bin\setup.exe 设账户密码 → Win+L 锁屏 → 观察是否自动解锁 → 看 logs\provider.log 与 client.log。
2. 若 VM 测试失败,优先怀疑三处:(a) GetSerialization 的 ulAuthenticationPackage(Negotiate 包 ID 查询失败会退回 0);(b) 是否真的走到 GetCredentialCount 的 autologon 分支(看 provider.log 有无「凭据已就绪,请求自动登录」);(c) 域账户时 full_username 拼接是否符合 LSA 期望。
3. 故障恢复要点已写进 README 第 8 节:删 `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{E9C67B30-B120-4838-A5A3-FBC2DE03C532}`(决定性的一个)与 `HKLM\SOFTWARE\Classes\CLSID\{同上}`;含安全模式方案与 WinRE 下 `reg load HKLM\WULOCK` 离线删除方案(注意挂载后路径里没有 SOFTWARE\ 这一层)。
4. 已知限制:仅支持账户文本密码(Windows Hello PIN 不适用);睡眠/休眠下不会唤醒机器;client 退出码 10 = 管道不存在(通常只是当时没锁屏,属正常)。
@@ -0,0 +1,43 @@
---
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
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-ckpt-20260820a
created_at: '2026-08-20T02:09:45.858334+00:00'
updated_at: '2026-08-20T02:09:45.858334+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)。
@@ -0,0 +1,54 @@
---
title: Checkpoint 2026-08-20 02:41:42 UTC [8a81e51bd4]
type: checkpoint
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-20-02-41-42-utc-8a81e51bd4
stable_id: 4163f161-0f27-476a-bf98-ba407de20919
scope: project
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-ckpt-20260820b
created_at: '2026-08-20T02:41:42.672290+00:00'
updated_at: '2026-08-20T02:41:42.672290+00:00'
---
# 安装方式变更:PowerShell 脚本 → Rust installer(2026-08-20,提交 09662c8)
## 重要:覆盖上一个检查点里关于 install.ps1 的描述
工程里已经**没有任何 .ps1 文件**。install/install.ps1、install/uninstall.ps1 已删除,install/ 目录现在只剩 provider.reg(纯注册表模板,作手动备用)。
## 变更原因(用户提出“为何非得用 ps1”)
1. 无 BOM 的 UTF-8 中文 .ps1 在 PowerShell 5.1 + 代码页 936(GBK) 下会被按 ANSI 解码,实测 install.ps1 / uninstall.ps1 分别产生 8 个 / 3 个语法错误,根本跑不起来(虽然转 UTF-8 with BOM 能修好,但仍不如 exe)。
2. .ps1 还受 ExecutionPolicy 限制。
3. exe 可以在运行时 SetConsoleOutputCP(65001) 自我修正输出编码,这是脚本做不到的。
## 本次实现
- 新增第五个 crate:crates/installer(package name = installer),产物 **winunlock-admin.exe**(≈273KB)。
- 子命令:`winunlock-admin install [-t|--unlock-time HH:MM] [-s|--source <目录>] [--skip-task]` 与 `winunlock-admin uninstall`,另有 --help。
- install 流程:IsUserAnAdmin 校验管理员 → 定位产物(本程序同目录或 target\x86_64-pc-windows-msvc\release)→ 复制 provider.dll/client.exe/setup.exe 到 %PROGRAMDATA%\WinUnLock\bin → icacls 收紧 ACL(仅 SYSTEM/Administrators)→ regsvr32 /s 注册 → schtasks /Create 建每日任务(SYSTEM + /RL HIGHEST,默认 08:30)。
- uninstall 流程:schtasks /Delete → regsvr32 /u(由 DllUnregisterServer 删两处注册表键)→ 删整个数据目录(DLL 被 LogonUI 占用时提示重启后重跑)。注意:install 不会把 winunlock-admin.exe 自己复制到 bin(避免删自己失败),卸载请从构建产物目录运行。
- setup 也加上 SetConsoleOutputCP(65001),中文提示不再需要手动 chcp。
- README 安装/卸载/工程结构/产物路径/crate 职责表/安全说明 共 7 处已全部同步,无 ps1 残留。
## 验证结果
- cargo build --release 通过;四个产物 provider.dll(573KB)、client.exe(506KB)、setup.exe(632KB)、winunlock-admin.exe(273KB)。
- cargo test --release:14 个单测全过(协议往返/拒绝错误 magic/版本/超长字段/截断、Debug 不泄露密码、账户名解析、配置往返、DPAPI 加解密实测、CLSID 格式化)。
- winunlock-admin.exe --help 与 setup.exe --help 实际运行,退出码 0,**中文输出完全正常**。
- dumpbin 确认 provider.dll 仍导出 5 个函数。
## 踩过的坑
给 setup 加 UTF-8 时一次 StrReplace 的 new_string 被截断,把 import 块和 main 函数写坏了(编译报错);已补全修复并重新编译验证通过。教训:大块替换后要立即编译验证。
## 下一步(给下个会话 / 用户 VM 测试)
1. cargo build --release
2. 管理员终端:cd target\x86_64-pc-windows-msvc\release 然后 .\winunlock-admin.exe install(可 --unlock-time 改时间)
3. 运行 %PROGRAMDATA%\WinUnLock\bin\setup.exe 设账户(.\用户名)与密码
4. Win+L 锁屏,把计划任务临时改到 1-2 分钟后,观察自动解锁
5. 看 %PROGRAMDATA%\WinUnLock\logs\{provider,client}.log
6. 卸载:从构建产物目录运行 .\winunlock-admin.exe uninstall
故障恢复不变:安全模式/WinRE 删 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{E9C67B30-B120-4838-A5A3-FBC2DE03C532} 与 HKCR\CLSID\{同} 。
## Git
当前工作区干净。提交历史:3e4d09b feat: 实现 WinUnLock 定时自动解锁工程 → 09662c8 refactor: 用 Rust installer 取代 PowerShell 安装脚本。
@@ -0,0 +1,44 @@
---
title: Checkpoint 2026-08-24 08:20:59 UTC [5d3eb69216]
type: checkpoint
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-24-08-20-59-utc-5d3eb69216
stable_id: 8db18267-0c12-4446-bfe8-f2f755752c09
scope: project
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-vm-preflight-20260824-160900
created_at: '2026-08-24T08:20:59.181779+00:00'
updated_at: '2026-08-24T08:20:59.181779+00:00'
tags:
- vm-test
- build-verified
- handoff
---
# VM 端到端测试前复验(2026-08-24)
## 当前状态
- 工作区 `E:\code\WinUnLock`,分支 `main`,HEAD `09662c8`,Git 工作区干净,无远程。
- 当前安装方式为 Rust 安装器 `winunlock-admin.exe`,不使用 PowerShell 安装脚本。
- 工具链:`rustc 1.94.1`、`cargo 1.94.1`、`stable-x86_64-pc-windows-msvc`。
## 本次验证
- `cargo test --release --target x86_64-pc-windows-msvc` 成功:14 个测试通过,0 失败(common 13、provider 1)。
- `cargo build --release --target x86_64-pc-windows-msvc` 成功。
- 四个产物存在:`provider.dll` 586752 B、`client.exe` 518656 B、`setup.exe` 647680 B、`winunlock-admin.exe` 279552 B。
- `winunlock-admin.exe --help` 与 `setup.exe --help` 均退出码 0,中文输出正常。
## VM 测试下一步
1. Windows 10/11 x64 VM 内先确认账户的文本密码可以手动解锁,不能使用 PIN 代替密码;建议使用本地测试账户并准备第二个管理员账户。
2. 安装 Credential Provider 前创建 VM 快照。
3. 可在宿主机编译后只复制四个 release 产物到 VM;`cred.bin` 必须在 VM 内运行 setup 生成,不能跨机器复制。
4. 在 VM 管理员终端运行 `winunlock-admin.exe install --unlock-time HH:MM`,再从管理员终端运行 `%PROGRAMDATA%\WinUnLock\bin\setup.exe --account ".\用户名"` 并交互输入密码。
5. 将触发时间设为约 3 分钟后,执行 `Win+L`,观察自动解锁;成功/失败后检查 `client.log` 与 `provider.log`。
6. 失败时按日志分层判断:无 provider 日志=DLL 未加载/未注册;client 退出码 10=管道未出现;provider 收到凭据但未提交=CredentialsChanged/GetCredentialCount 链路;提交后失败=账户格式、密码或认证包问题。
7. 卸载从构建产物目录以管理员运行 `winunlock-admin.exe uninstall`;锁屏异常时恢复 VM 快照,或在安全模式/WinRE 删除两个 CLSID 注册项。
## 注意
安装器会把 `%PROGRAMDATA%\WinUnLock` ACL 收紧为仅 SYSTEM/Administrators,因此 setup 应在管理员终端运行。
@@ -0,0 +1,19 @@
---
title: Checkpoint 2026-08-24 08:21:53 UTC
type: checkpoint
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-24-08-21-53-utc
stable_id: 9585530b-190e-4157-8226-ef58a3d07dd4
scope: project
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: 83b78f17dbe5341abfe8922802b8906da2be1989
created_at: '2026-08-24T08:21:53.884108+00:00'
updated_at: '2026-08-24T08:21:53.884108+00:00'
tags:
- source-submit
---
8db18267-0c12-4446-bfe8-f2f755752c09
@@ -0,0 +1,40 @@
---
title: Checkpoint 2026-08-24 09:44:26 UTC [db6a638039]
type: checkpoint
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-24-09-44-26-utc-db6a638039
stable_id: 648be109-d91c-4f4d-a336-c2f04432c3e3
scope: project
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-cpus-logon-fix-20260825
created_at: '2026-08-24T09:44:26.393747+00:00'
updated_at: '2026-08-24T09:44:26.393747+00:00'
tags:
- bugfix
- vm-test
- credential-provider
---
# 修复锁屏 LogonUI 场景兼容性(2026-08-25)
## 根因
VM 日志显示 `SetUsageScenario` 收到场景值 1(CPUS_LOGON),而旧代码只接受值 2(CPUS_UNLOCK_WORKSTATION),返回 E_NOTIMPL。因此 LogonUI 不调用 Advise,命名管道没有创建,client 31 次重试全部失败。手动解锁正常,说明账户密码本身无误。
## 修复
- provider 现在同时接受 CPUS_UNLOCK_WORKSTATION 和 CPUS_LOGON,保存场景并记录兼容日志。
- 改密/CredUI 等场景仍拒绝。
- 未收到管道凭据时仍不请求自动登录,避免冷启动/普通登录抢占默认磁贴。
- README 同步说明 Windows 版本差异。
- 新增场景判定单元测试。
## 验证
- `cargo test --release --target x86_64-pc-windows-msvc`:16 个测试通过(common 13、provider 2、其余 0)。
- `cargo build --release --target x86_64-pc-windows-msvc`:成功,无警告。
- `git diff --check`:通过。
- 提交:`a0f5ff0 fix: 兼容锁屏 LogonUI 场景`。
## VM 下一步
必须把新构建的 `provider.dll`、`client.exe`、`setup.exe`、`winunlock-admin.exe` 复制到 VM。推荐先在 VM 管理员终端运行 `winunlock-admin.exe uninstall`,重启 VM,再安装新产物;随后 setup 使用真实账户名(如 `.+Administrator` 的正确 PowerShell 字面量为 `'.\Administrator'` 或 `".\$env:USERNAME"`),把计划任务设为未来 2-3 分钟,Win+L 后检查 provider.log 是否出现 `Advise: 启动命名管道监听`。
@@ -0,0 +1,41 @@
---
title: Checkpoint 2026-08-24 09:55:21 UTC [fa70837da1]
type: checkpoint
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/checkpoint-2026-08-24-09-55-21-utc-fa70837da1
stable_id: 037f0a1b-4e1a-464a-b90e-89760d92637b
scope: project
memory_type: checkpoint
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-visible-password-and-tile-20260825
created_at: '2026-08-24T09:55:21.128779+00:00'
updated_at: '2026-08-24T09:55:21.128779+00:00'
tags:
- vm-test
- credential-provider
- setup
---
# VM 出现 WinUnLock 磁贴与可见密码测试选项(2026-08-25)
## VM 观察
- 锁屏界面已出现 `WinUnLock 自动解锁` 磁贴,证明新 Provider 已注册并被 LogonUI 枚举;旧的 CPUS_LOGON 场景兼容修复生效。
- 若触发时间未到,磁贴显示密码输入框是正常的等待状态;若触发后仍不自动提交,需要查看 client/provider 日志区分送达、枚举和认证阶段。
## 本次代码变更
- `setup.exe` 新增显式 `--show-password` 参数,测试时交互输入密码可见;默认输入仍隐藏。
- 密码不会写入日志或配置文件,仍使用 DPAPI 写入 `cred.bin`。
- 提交:`3718e11 feat: 增加设置密码可见测试选项`,前一修复提交为 `a0f5ff0`。
## 验证
- release 测试 16 个通过。
- release 构建成功,无警告。
- `setup.exe --help` 显示 `--show-password`,退出码 0。
## VM 下一步
1. 将最新四个产物复制到 VM,尤其是 `setup.exe` 也要更新。
2. 在管理员 PowerShell 运行 `setup.exe --account ".\Administrator" --show-password`,确认输入密码与手动解锁密码完全一致;不应使用 PIN。
3. 重新安排未来 2-3 分钟的任务并锁屏。
4. 成功后检查 provider.log 是否有 `Advise`、`已收到凭据`、`GetCredentialCount`、`GetSerialization`;失败后发两份最新日志。
@@ -0,0 +1,22 @@
---
title: VM 首次测试账户参数被错误展开
type: experience
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/vm-首次测试账户参数被错误展开
stable_id: 981165ad-fc59-490f-b414-495fb36854d0
scope: project
memory_type: experience
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-vm-account-env-expansion-20260824
created_at: '2026-08-24T08:54:30.718462+00:00'
updated_at: '2026-08-24T08:54:30.718462+00:00'
tags:
- vm-test
- setup
- powershell
- troubleshooting
---
2026-08-24 VM 首次端到端测试未自动解锁。截图确认 setup 命令把账户参数写成了 `".\$env:Administrator"`;PowerShell 中不存在 `env:Administrator`,因此变量展开为空,setup 输出并保存的账户仅为 `.\`,无法通过 LSA 认证。正确写法是本地账户字面量 `".\Administrator"`,或使用真实环境变量 `".\$env:USERNAME"`。重新运行 setup 会覆盖 config.toml 与 cred.bin。另需在 setup 完成后重新把计划任务时间调整到未来几分钟,避免安装时设置的触发点已错过。
@@ -0,0 +1,17 @@
---
title: WinUnLock VM test preflight verified
type: fact
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/win-un-lock-vm-test-preflight-verified
stable_id: aafb5b5c-34b4-49fd-8aaf-e8933f7b424e
scope: project
memory_type: fact
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: f6fcdb960ace5ebe9879f8e7c055230ab9dabce9
created_at: '2026-08-24T08:21:52.521334+00:00'
updated_at: '2026-08-24T08:21:52.521334+00:00'
---
On 2026-08-24, release build succeeded and all 14 tests passed on stable MSVC 1.94.1. Current installer is winunlock-admin.exe. VM setup must run elevated after installer ACL tightening, and cred.bin must be generated inside the target VM.
@@ -0,0 +1,21 @@
---
title: WinUnLock 方向:工程化 Credential Provider + 定时解锁客户端(保留会话不重启)
type: decision
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/win-un-lock-方向工程化-credential-provider-定时解锁客户端保留会话不重启
stable_id: ffcc24b6-2d1a-46e8-bceb-49e187dd0c20
scope: project
memory_type: decision
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-dec-direction-20260819a
created_at: '2026-08-19T09:45:02.993682+00:00'
updated_at: '2026-08-19T09:45:02.993682+00:00'
---
目标场景:Windows 工作站被锁屏(Win+L / 超时 / 组策略),需要每天定时(如 8:30)自动解锁回到原桌面,不重启、不丢失当前会话,属于用户在自有机器、用自有账户密码的合法自动化。
已确认路线(用户在候选方案中选定 build_cp):实现一套工程化的『Credential Provider DLL + 命名管道 + 定时客户端』。放弃 AutoAdminLogon 重启方案(因为要保留当前会话)。
协作约定:由 AI 负责完整实现(多 crate Rust workspace + 安装/卸载脚本 + 中文文档)并做编译验证;用户自行在虚拟机测试通过后,再部署到当前生产机。因此实现阶段严禁在当前工作机上实际执行 regsvr32/改注册表/建真实计划任务,只做 cargo 构建与 dumpbin 导出检查这类只读/构建验证。
@@ -0,0 +1,29 @@
---
title: WinUnLock 架构与关键参数(非秘密)
type: decision
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/win-un-lock-架构与关键参数非秘密
stable_id: d821d390-15d1-484a-98e1-6d9656f69bfe
scope: project
memory_type: decision
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-dec-arch-20260819a
created_at: '2026-08-19T09:45:32.151229+00:00'
updated_at: '2026-08-19T09:45:32.151229+00:00'
---
Rust workspace,crate 划分:common(管道协议/配置/DPAPI封装) + provider(cdylib,Credential Provider COM DLL) + client(bin,定时解锁客户端) + setup(bin,交互式设置账户名/密码并DPAPI加密)。另含 install/uninstall PowerShell 脚本与 README(中文)。
关键参数(本项目专属,非秘密):
- CLSID = {E9C67B30-B120-4838-A5A3-FBC2DE03C532}(新生成,避免与示例冲突)。
- 命名管道 = \\.\pipe\WinUnLock。
- 数据目录 = %PROGRAMDATA%\WinUnLock\(config.toml;cred.bin 为 DPAPI 加密凭据;logs\provider.log、logs\client.log)。
- 已验证可编译依赖组合:edition 2024,windows 0.62.2,windows-core 0.62.2。DPAPI 用 windows Win32_Security_Cryptography 的 CryptProtectData/CryptUnprotectData。
管道协议 v1(小端,provider 为服务端):magic u32=0x554E4C4B('UNLK') | version u32=1 | user_len u32 | user(UTF-16LE) | pass_len u32 | pass(UTF-16LE) | domain_len u32 | domain(UTF-16LE)。带长度上限保护,读毕 zeroize。
数据流:每日计划任务(SYSTEM,RunLevel Highest) -> client.exe 读 cred.bin(DPAPI LocalMachine 解密) -> 连管道发凭据(带重试) -> provider 管道线程收到 -> CredentialsChanged 通知 LogonUI -> GetSerialization(CredPack 序列化) -> LSA 验证 -> 解锁恢复原桌面。
环境事实:MSVC link.exe/dumpbin 在 C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\(不在 PATH,但 rustc MSVC 后端能自动定位)。故障恢复:CP 装错可能锁死登录,需进 WinRE/安全模式删注册表 CLSID 项恢复——README 必须写明。
@@ -0,0 +1,29 @@
---
title: WinUnLock 端到端解锁测试失败时的排查线索
type: experience
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/win-un-lock-端到端解锁测试失败时的排查线索
stable_id: 8d83fdf5-683a-41ce-94ed-da186cf32c71
scope: project
memory_type: experience
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-exp-debug-20260820a
created_at: '2026-08-20T02:43:49.894209+00:00'
updated_at: '2026-08-20T02:43:49.894209+00:00'
---
适用场景:在虚拟机里安装完 WinUnLock(winunlock-admin install + setup.exe 设凭据)并 Win+L 锁屏后,到点没有自动解锁。按以下顺序排查(来自实现者对自己代码风险点的评估):
1. 先看 %PROGRAMDATA%\WinUnLock\logs\provider.log 里有没有「凭据已就绲,请求自动登录」这行(GetCredentialCount 的 autologon 分支)。
- 有:管道已通、凭据已送达,问题在后续提交/验证环节。
- 无:凭据没送达,查 client.log 与 client.exe 退出码(退出码 10 = 管道不存在,通常意味着触发时并未锁屏,并非故障;2/3/4 分别是 config.toml 、cred.bin 读取失败与 DPAPI 解密失败)。
2. GetSerialization 里的 ulAuthenticationPackage:Negotiate 认证包 ID 通过 LsaLookupAuthenticationPackage 查询,失败时代码会 unwrap_or(0) 退回 0,这会导致 LSA 直接拒绝凭据。怀疑时在 provider 里把该 ID 打到日志确认非 0。
3. 域账户时 full_username 的拼接是否符合 LSA 期望(本地账户用 .\用户名 一般没问题;域账户需 域\用户 或 UPN)。
其它已知坑:仅支持账户文本密码,Windows Hello PIN 不适用;睡眠/休眠状态下本方案不会唤醒机器(需另配勾选「唤醒计算机运行此任务」的任务,并把解锁任务安排在其后几十秒);密码变更后必须重跑 setup,否则反复失败可能触发账户锁定策略。
环境教训:rust-toolchain.toml 不要写死具体版本(如 channel = "1.94.1")—— rustup 会在任何 cargo 命令前尝试联网重装整条工具链,若本机 toolchain 目录处于部分安装状态会反复失败(os error 32 文件被占用)。用 channel = "stable" 即可。
windows crate 0.62.2 API 差异(实现时踩到并修正):GetLocalTime() 直接返回 SYSTEMTIME 而非用出参;WaitNamedPipeW 返回 BOOL 而非 Result。
@@ -0,0 +1,25 @@
---
title: WinUnLock 项目定位:本机定时自动解锁
type: prd
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/win-un-lock-项目定位本机定时自动解锁
stable_id: 0882a1ad-94c0-4a20-9e3b-f65210c0f8b1
scope: project
memory_type: prd
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-prd-20260819-01
created_at: '2026-08-19T09:25:12.514513+00:00'
updated_at: '2026-08-19T09:25:12.514513+00:00'
---
目标:在用户自己拥有的 Windows 电脑上,用用户自行提供的账号密码,实现定时自动解锁本机锁屏(例如每天固定时间解锁)。
合规前提(用户明确确认):完全在本地运行、机器归用户所有、凭据由用户本人提供,因此属于合法合规的本机自动化,不涉及绕过他人设备或未授权访问。
技术路线(沿用前序调研结论 01a017af 会话):Rust 实现 Windows Service + Credential Provider。锁定会话无法用 SendInput/模拟键盘可靠解锁,需走 Credential Provider DLL -> LogonUI 提交凭据的正规路径。关键 API:Credential Provider COM 接口、CPUS_UNLOCK_WORKSTATION、GetCredentialCount()、GetSerialization()、CredPackAuthenticationBufferW。建议用账户文本密码而非 Windows Hello PIN。
可参考现成项目:吾爱破解帖 https://www.52pojie.cn/thread-2083713-1-1.html 对应 Gitee 仓库 https://gitee.com/lieranhuasha/winlogon.git(Rust CredentialProvider,命名管道接收账号密码,教学原型级);GitHub PsyChip/hodor(C++,工程更完整,处理了管道权限/远程拒绝/密码清零/卸载脚本)。
当前状态:E:\code\WinUnLock 目录仅有 AGENTS.md,尚未落任何代码,也非 git 仓库。
@@ -0,0 +1,98 @@
---
title: WinUnLock 当前状态(截至 2026‑08‑20)
type: curated
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/curated/win-un-lock-当前状态截至-2026-08-20
stable_id: 8cf2657a-ec64-4715-88ab-281830560733
scope: project
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
workspace_type: development
usage_profile_id: null
preference_context: development
document_type: current_state
revision: 4
source_memory_ids: []
source_checkpoint_ids:
- 037f0a1b-4e1a-464a-b90e-89760d92637b
- 648be109-d91c-4f4d-a336-c2f04432c3e3
source_file_ids: []
source_git_commit: null
source_git_commits: []
source_agent_sync_ids: []
model_connection: Sub2API
model_name: openai/gpt-oss-120b
source_count: 17
source_revisions:
memory:711881c1-544e-4195-9a1e-6439dbcd073a: '1'
memory:715e4eb8-48b7-4540-9a75-5be72eeb0c7e: '1'
memory:8d83fdf5-683a-41ce-94ed-da186cf32c71: '1'
memory:4163f161-0f27-476a-bf98-ba407de20919: '1'
memory:8db18267-0c12-4446-bfe8-f2f755752c09: '1'
memory:aafb5b5c-34b4-49fd-8aaf-e8933f7b424e: '1'
source_dispositions:
processed: 17
unchanged: 0
unsupported: 0
skipped: 0
cited_source_ids:
- curated_baseline:8cf2657a-ec64-4715-88ab-281830560733
- memory:8db18267-0c12-4446-bfe8-f2f755752c09
- memory:aafb5b5c-34b4-49fd-8aaf-e8933f7b424e
- memory:8d83fdf5-683a-41ce-94ed-da186cf32c71
- memory:4163f161-0f27-476a-bf98-ba407de20919
- memory:711881c1-544e-4195-9a1e-6439dbcd073a
- memory:715e4eb8-48b7-4540-9a75-5be72eeb0c7e
- curated_baseline:baa442ef-76f5-4390-a518-067156d17d3a
job_cited_source_ids:
- curated_baseline:8cf2657a-ec64-4715-88ab-281830560733
conflicts: []
supersedes: []
preferences: []
source_cursor: 103
source_hash: 4a64fd2a22cf52c37c2891c452140220e743d62d9ef477be0616d478b8794785
prompt_version: 2026-08-12.3
schema_version: '3'
curation_job_id: baa81064-94f7-44f6-b35a-2ea79347e1a8
created_at: '2026-08-20T02:26:16.121631+00:00'
updated_at: '2026-08-24T10:11:13.248874+00:00'
tags:
- development
- current_state
---
# WinUnLock 当前实现状态
## 基本信息
- **工作区路径**:`E:\code\WinUnLock`(Git 分支 `main`,HEAD `09662c8`,工作区干净)
- **安装方式**:Rust 编写的安装器 `winunlock-admin.exe`(已不再使用 PowerShell 脚本)
- **开发工具链**:`rustc 1.94.1`、`cargo 1.94.1`、`stable-x86_64-pc-windows-msvc`
## 构建产物
| 产物 | 大小 |
|------|------|
| `provider.dll` | 586 752 B |
| `client.exe` | 518 656 B |
| `setup.exe` | 647 680 B |
| `winunlock-admin.exe` | 279 552 B |
## 测试结果(2026‑08‑24)
- `cargo test --release --target x86_64-pc-windows-msvc`:全部 **14** 项测试通过(`common` 13、`provider` 1),0 失败。
- `cargo build --release --target x86_64-pc-windows-msvc`:构建成功。
- `winunlock-admin.exe --help` 与 `setup.exe --help` 均返回退出码 **0**,中文帮助信息正常显示。
## 关键验证要点(面向 VM 的端到端测试前复验)
1. **账户要求**:必须使用可手动解锁的本地文本密码,不能使用 PIN。推荐使用本地管理员账户。
2. **快照**:在安装 Credential Provider 前创建 VM 快照,以便失败后快速恢复。
3. **凭据文件**:`cred.bin` 必须在目标 VM 内由 `setup` 生成,禁止跨机器复制。
4. **安装/配置步骤**
- `winunlock-admin.exe install --unlock-time HH:MM`(管理员终端)
- `%PROGRAMDATA%\WinUnLock\bin\setup.exe --account ".\\用户名"`,交互输入密码生成 `cred.bin`。
- 锁屏(Win+L),约 3 分钟后观察自动解锁;成功后检查 `client.log` 与 `provider.log`。
5. **故障排查要点**
- 无 `provider.log` → DLL 未加载或未注册。
- `client.exe` 退出码 **10** → 命名管道不存在(通常是未锁屏的正常情况)。
- Provider 收到凭据但未提交 → 检查 `CredentialsChanged/GetCredentialCount` 链路。
- 提交后失败 → 检查账户格式、密码或认证包问题。
6. **卸载**:管理员运行 `winunlock-admin.exe uninstall`;如出现锁屏异常,可恢复 VM 快照或在安全模式/WinRE 删除对应 CLSID 注册项。
7. **ACL 注意**:安装器会收紧 `%PROGRAMDATA%\WinUnLock` 的 ACL,仅保留 `SYSTEM`/`Administrators`,后续 `setup` 必须在管理员终端执行。
*信息来源:`curated_baseline:8cf2657a-ec64-4715-88ab-281830560733`*
@@ -0,0 +1,96 @@
---
title: WinUnLock 待办任务清单
type: curated
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/curated/win-un-lock-待办任务清单
stable_id: 4d3a91c8-d950-4373-a19d-66ed6bcc21a6
scope: project
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
workspace_type: development
usage_profile_id: null
preference_context: development
document_type: tasks
revision: 5
source_memory_ids: []
source_checkpoint_ids:
- 037f0a1b-4e1a-464a-b90e-89760d92637b
- 648be109-d91c-4f4d-a336-c2f04432c3e3
source_file_ids: []
source_git_commit: null
source_git_commits: []
source_agent_sync_ids: []
model_connection: Sub2API
model_name: openai/gpt-oss-120b
source_count: 17
source_revisions:
memory:0882a1ad-94c0-4a20-9e3b-f65210c0f8b1: '1'
memory:8db18267-0c12-4446-bfe8-f2f755752c09: '1'
memory:aafb5b5c-34b4-49fd-8aaf-e8933f7b424e: '1'
memory:037f0a1b-4e1a-464a-b90e-89760d92637b: '1'
memory:648be109-d91c-4f4d-a336-c2f04432c3e3: '1'
source_dispositions:
processed: 17
unchanged: 0
unsupported: 0
skipped: 0
cited_source_ids:
- curated_baseline:4d3a91c8-d950-4373-a19d-66ed6bcc21a6
- memory:037f0a1b-4e1a-464a-b90e-89760d92637b
- memory:648be109-d91c-4f4d-a336-c2f04432c3e3
- memory:8db18267-0c12-4446-bfe8-f2f755752c09
- memory:aafb5b5c-34b4-49fd-8aaf-e8933f7b424e
- project:ea207d36-693c-4349-b3c8-7c40c8c889f5
- memory:0882a1ad-94c0-4a20-9e3b-f65210c0f8b1
- global_guidance_memory:bf88c265-4749-4c50-85bc-4bae25298cd5
- global_guidance_memory:5ed86f53-b53e-4534-8e51-d3a010069d5e
- global_guidance_memory:3f91189b-11a1-45bb-8357-4f413dc1609d
job_cited_source_ids:
- curated_baseline:4d3a91c8-d950-4373-a19d-66ed6bcc21a6
- memory:037f0a1b-4e1a-464a-b90e-89760d92637b
- memory:648be109-d91c-4f4d-a336-c2f04432c3e3
conflicts: []
supersedes: []
preferences: []
source_cursor: 103
source_hash: 4a64fd2a22cf52c37c2891c452140220e743d62d9ef477be0616d478b8794785
prompt_version: 2026-08-12.3
schema_version: '3'
curation_job_id: baa81064-94f7-44f6-b35a-2ea79347e1a8
created_at: '2026-08-19T09:41:29.646745+00:00'
updated_at: '2026-08-24T10:11:16.821889+00:00'
tags:
- development
- tasks
---
# WinUnLock 待办任务清单
## 1. VM 自动解锁完整流程验证
- 在目标 Windows 10/11 x64 VM 中执行:
1. 创建 VM 快照。
2. 以管理员终端运行 `winunlock-admin.exe install --unlock-time 03:00`(示例时间)。
3. 运行 `%PROGRAMDATA%\WinUnLock\bin\setup.exe --account ".\\<本地用户名>"`,交互输入密码,生成 `cred.bin`。
4. 锁屏 (`Win+L`),等待约 3 分钟后观察是否自动解锁。
5. 检查 `%PROGRAMDATA%\WinUnLock\logs\provider.log` 与 `client.log`,记录成功或故障信息。
- 故障排查要点:
- `provider.log` 是否存在(DLL 是否加载/注册)。
- `client.exe` 退出码 **10**(管道不存在)或其他码(配置、DPAPI、凭据读取失败)。
- `ulAuthenticationPackage` 为 0 → LSA 直接拒绝,需要在 Provider 中打印实际包 ID。
- 本地账户使用 `.\\用户名`,域账户使用 `域\\用户` 或 UPN 形式。
## 2. 错误恢复与卸载流程文档化
- 编写恢复指南:
- 在安全模式或 WinRE 中手动删除注册表键 `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{E9C67B30-B120-4838-A5A3-FBC2DE03C532}` 与对应的 `HKCR\CLSID` 项。
- 使用 `winunlock-admin.exe uninstall` 完整卸载并恢复默认登录方式。
- 将指南加入 `aidocs/project_context.md` 并使用秒级时间戳记录。
## 3. 代码清理与发布准备
- 移除调试日志、示例代码以及任何硬编码路径。
- 确认 `aidocs/` 已在 `.gitignore` 中,防止记忆文件被提交。
- 生成 Release 版产物:`provider.dll`、`client.exe`、`setup.exe`、`winunlock-admin.exe`。
- 编写简易安装脚本(复制 DLL、注册 Credential Provider、安装服务),脚本头部注明必须以管理员运行。
## 4. 文档与记忆更新
- 在 `aidocs/project_context.md` 中记录本次任务的实现细节、验证方式、遇到的问题以及后续计划,使用秒级时间戳倒序追加。
- 完成后使用 `type: 中文说明` 格式提交代码,例如 `feat: 完成 VM 自动解锁全流程验证`。
*信息来源:`curated_baseline:4d3a91c8-d950-4373-a19d-66ed6bcc21a6`, `memory:037f0a1b-4e1a-464a-b90e-89760d92637b`, `memory:648be109-d91c-4f4d-a336-c2f04432c3e3`*
@@ -0,0 +1,72 @@
---
title: WinUnLock 项目关键事件时间线
type: curated
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/curated/win-un-lock-项目关键事件时间线
stable_id: 9ef32153-fa89-4819-8648-c9ce26db4c93
scope: project
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
workspace_type: development
usage_profile_id: null
preference_context: development
document_type: timeline
revision: 6
source_memory_ids: []
source_checkpoint_ids:
- 037f0a1b-4e1a-464a-b90e-89760d92637b
- 648be109-d91c-4f4d-a336-c2f04432c3e3
source_file_ids: []
source_git_commit: null
source_git_commits: []
source_agent_sync_ids: []
model_connection: Sub2API
model_name: openai/gpt-oss-120b
source_count: 17
source_revisions:
memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20: '1'
memory:67499b3a-97a6-4982-9c16-4afaa59d45f3: '1'
memory:d821d390-15d1-484a-98e1-6d9656f69bfe: '1'
memory:8db18267-0c12-4446-bfe8-f2f755752c09: '1'
memory:9585530b-190e-4157-8226-ef58a3d07dd4: '1'
memory:aafb5b5c-34b4-49fd-8aaf-e8933f7b424e: '1'
memory:981165ad-fc59-490f-b414-495fb36854d0: '1'
source_dispositions:
processed: 17
unchanged: 0
unsupported: 0
skipped: 0
cited_source_ids:
- curated_baseline:9ef32153-fa89-4819-8648-c9ce26db4c93
- memory:981165ad-fc59-490f-b414-495fb36854d0
- memory:8db18267-0c12-4446-bfe8-f2f755752c09
- memory:9585530b-190e-4157-8226-ef58a3d07dd4
- memory:aafb5b5c-34b4-49fd-8aaf-e8933f7b424e
- memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20
- memory:67499b3a-97a6-4982-9c16-4afaa59d45f3
- memory:d821d390-15d1-484a-98e1-6d9656f69bfe
job_cited_source_ids:
- curated_baseline:9ef32153-fa89-4819-8648-c9ce26db4c93
conflicts: []
supersedes: []
preferences: []
source_cursor: 103
source_hash: 4a64fd2a22cf52c37c2891c452140220e743d62d9ef477be0616d478b8794785
prompt_version: 2026-08-12.3
schema_version: '3'
curation_job_id: baa81064-94f7-44f6-b35a-2ea79347e1a8
created_at: '2026-08-19T10:01:23.415013+00:00'
updated_at: '2026-08-24T10:11:14.754085+00:00'
tags:
- development
- timeline
---
# WinUnLock 项目时间线(截至 2026‑08‑24)
| 时间 (UTC) | 事件 | 说明 |
|------------|------|------|
| 2026‑08‑24 08:20:59 | 检查点记录 | 项目工作区状态、工具链、构建产物、测试全部通过。 |
| 2026‑08‑24 08:21:53 | 检查点引用 | 本次检查点引用前一次检查点 ID `8db18267-0c12-4446-bfe8-f2f755752c09`。
| 2026‑08‑24 (无具体时间) | VM 预验完成 | Release 构建成功,14 项测试全部通过,确认安装器 `winunlock-admin.exe`、ACL 收紧、`cred.bin` 必须在 VM 内生成。 |
| 2026‑08‑25 (无具体时间) | WinUnLock 磁贴与可见密码测试选项 | 新 Provider 已注册并被 LogonUI 枚举;`setup.exe` 新增 `--show-password` 参数供交互测试。 |
*信息来源:`curated_baseline:9ef32153-fa89-4819-8648-c9ce26db4c93`*
@@ -0,0 +1,101 @@
---
title: WinUnLock 项目关键决策汇总
type: curated
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/curated/win-un-lock-项目关键决策汇总
stable_id: 937e5888-0a9b-45ee-9312-6e110ef1619b
scope: project
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
workspace_type: development
usage_profile_id: null
preference_context: development
document_type: decisions
revision: 1
source_memory_ids:
- 67499b3a-97a6-4982-9c16-4afaa59d45f3
- d821d390-15d1-484a-98e1-6d9656f69bfe
- ffcc24b6-2d1a-46e8-bceb-49e187dd0c20
source_checkpoint_ids: []
source_file_ids: []
source_git_commit: null
source_git_commits: []
source_agent_sync_ids: []
model_connection: Sub2API
model_name: openai/gpt-oss-120b
source_count: 15
source_revisions:
memory:d821d390-15d1-484a-98e1-6d9656f69bfe: '1'
memory:67499b3a-97a6-4982-9c16-4afaa59d45f3: '1'
memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20: '1'
source_dispositions:
processed: 15
unchanged: 0
unsupported: 0
skipped: 0
cited_source_ids:
- memory:d821d390-15d1-484a-98e1-6d9656f69bfe
- memory:67499b3a-97a6-4982-9c16-4afaa59d45f3
- memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20
job_cited_source_ids:
- memory:d821d390-15d1-484a-98e1-6d9656f69bfe
- memory:67499b3a-97a6-4982-9c16-4afaa59d45f3
- memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20
conflicts: []
supersedes: []
preferences: []
source_cursor: 92
source_hash: 4ba0814abe7570a9e62a54340ca352579628d92bc49f330cda285b38a0442283
prompt_version: 2026-08-12.3
schema_version: '3'
curation_job_id: 745df395-ccaa-47e8-ae23-c469ef26706f
created_at: '2026-08-19T10:01:20.395598+00:00'
updated_at: '2026-08-19T10:01:20.396107+00:00'
tags:
- decision
- architecture
- security
- implementation
---
# WinUnLock 项目关键决策
以下决策直接来源于项目记忆(memory)文档,按重要性分组。
## 1. 项目整体技术方向
- **决定** 实现一个工程化的 **Credential Provider DLL + 命名管道 + 定时解锁客户端**(保留会话、不重启)。放弃 AutoAdminLogon 重启方案,因为需保留当前会话。*来源: [memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20]*
## 2. Rust 工作区结构与关键参数
- Rust 工作区划分为四个 crate:
- `common`(管道协议、配置、DPAPI 包装)
- `provider`(cdylib,生成 Credential Provider COM DLL)
- `client`(binary,负责每日定时读取凭据并通过管道发送)
- `setup`(binary,交互式设置账户名/密码并使用 DPAPI 加密)
- 附加 PowerShell 安装/卸载脚本与中文 README。*来源: [memory:d821d390-15d1-484a-98e1-6d9656f69bfe]*
- **唯一 CLSID**:`{E9C67B30-B120-4838-A5A3-FBC2DE03C532}`(新生成,避免冲突)。
- **命名管道**:`\\.\pipe\WinUnLock`
- **数据目录**:`%PROGRAMDATA%\WinUnLock\`(包含 `config.toml`, `cred.bin`(DPAPI 加密凭据),日志子目录 `logs\provider.log`、`logs\client.log`)。
- 已验证的依赖组合:Rust edition 2024,`windows = 0.62.2`,`windows-core = 0.62.2`。
## 3. 管道协议与安全措施
- **管道协议 v1**(小端):
- `magic u32 = 0x554E4C4B ('UNLK')`
- `version u32 = 1`
- `user_len u32` + UTF‑16LE 字符串
- `pass_len u32` + UTF‑16LE 字符串
- `domain_len u32` + UTF‑16LE 字符串
- 长度上限检查,读取完毕后 **zeroize** 内存。
- 数据流:系统计划任务(SYSTEM, Highest) → `client.exe` 读取 `cred.bin`(DPAPI LocalMachine 解密) → 通过命名管道发送凭据(带重试) → Provider 线程接收 → `CredentialsChanged` 通知 LogonUI → `GetSerialization` 调用 `CredPackAuthenticationBufferW` 序列化 → LSA 验证 → 解锁恢复原桌面。
- **安全恢复注意**:如果 Credential Provider 注册错误导致登录卡死,需要进入 WinRE/安全模式手动删除注册表中的 CLSID 项恢复。*来源: [memory:d821d390-15d1-484a-98e1-6d9656f69bfe]*
## 4. 原型验证经验教训(来自 Gitee winlogon 项目)
- 可成功编译生成 `winlogon.dll`(约 256 KB),导出 `DllGetClassObject`、`DllCanUnloadNow`、`DllMain`,说明 Rust cdylib 自动导出。*来源: [memory:67499b3a-97a6-4982-9c16-4afaa59d45f3]*
- **缺陷 & 教训**:
1. `DllMain` 里硬编码日志路径 `D:\log\winlogon.log` 并使用 `.expect()`,导致加载时在不存在路径下 panic → 系统卡住。**决策**:在实现中绝不在 `DllMain` 中 panic,避免硬编码日志路径。
2. README 内容占位、命名不规范、死代码。**决策**:提供完整、中文、使用说明的 README,移除死代码。
3. 必须使用 **长度前缀协议**、**ACL 拒绝远程访问**、**仅在解锁场景激活**、**密码使用后 zeroize**。*来源: [memory:67499b3a-97a6-4982-9c16-4afaa59d45f3]*
## 5. 开发与测试约束
- **协作约定**:AI 负责完整实现(多 crate、安装/卸载脚本、中文文档),用户在虚拟机中验证后再部署到生产机器。
- **禁止** 在开发机器上实际执行 `regsvr32`、修改注册表或创建真实计划任务,只做构建、导出检查等只读验证。*来源: [memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20]*
---
*本决策文档仅引用了项目记忆来源,未添加任何未在来源中出现的事实。*
@@ -0,0 +1,180 @@
---
title: WinUnLock 项目概述
type: curated
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/curated/win-un-lock-项目概述
stable_id: baa442ef-76f5-4390-a518-067156d17d3a
scope: project
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
workspace_type: development
usage_profile_id: null
preference_context: development
document_type: overview
revision: 1
source_memory_ids:
- 0882a1ad-94c0-4a20-9e3b-f65210c0f8b1
source_checkpoint_ids: []
source_file_ids: []
source_git_commit: null
source_git_commits: []
source_agent_sync_ids: []
model_connection: Sub2API
model_name: openai/gpt-oss-120b
source_count: 12
source_revisions:
memory:0882a1ad-94c0-4a20-9e3b-f65210c0f8b1: '1'
source_dispositions:
processed: 12
unchanged: 0
unsupported: 0
skipped: 0
cited_source_ids:
- project:ea207d36-693c-4349-b3c8-7c40c8c889f5
- memory:0882a1ad-94c0-4a20-9e3b-f65210c0f8b1
- global_guidance_memory:bf88c265-4749-4c50-85bc-4bae25298cd5
- global_guidance_memory:105b328f-4bda-4641-90a7-7282ef156316
- global_guidance_memory:3f91189b-11a1-45bb-8357-4f413dc1609d
- global_guidance_memory:5ed86f53-b53e-4534-8e51-d3a010069d5e
job_cited_source_ids:
- project:ea207d36-693c-4349-b3c8-7c40c8c889f5
- memory:0882a1ad-94c0-4a20-9e3b-f65210c0f8b1
- global_guidance_memory:bf88c265-4749-4c50-85bc-4bae25298cd5
- global_guidance_memory:105b328f-4bda-4641-90a7-7282ef156316
- global_guidance_memory:3f91189b-11a1-45bb-8357-4f413dc1609d
- global_guidance_memory:5ed86f53-b53e-4534-8e51-d3a010069d5e
conflicts: []
supersedes: []
preferences:
- statement: 使用最简单且正确的实现(KISS & YAGNI),不为假设的未来需求添加依赖或抽象层。
level: scenario
workspace_types:
- development
workspace_ids: []
source_ids:
- global_guidance_memory:bf88c265-4749-4c50-85bc-4bae25298cd5
counterexample_source_ids: []
occurrence_count: 1
explicit: true
confidence: 1.0
status: current
- statement: 优先复用项目已有的框架、服务、工具和约定,避免重复实现。
level: scenario
workspace_types:
- development
workspace_ids: []
source_ids:
- global_guidance_memory:bf88c265-4749-4c50-85bc-4bae25298cd5
counterexample_source_ids: []
occurrence_count: 1
explicit: true
confidence: 1.0
status: current
- statement: 在任何登录、SSH、数据库或 API 调用前先查询 Vaultwarden,唯一匹配时自动使用。
level: scenario
workspace_types:
- development
workspace_ids: []
source_ids:
- global_guidance_memory:105b328f-4bda-4641-90a7-7282ef156316
counterexample_source_ids: []
occurrence_count: 1
explicit: true
confidence: 1.0
status: current
- statement: 新增或修改的账户、密码、Token、API‑Key 与 TOTP 种子必须立即写入密码库。
level: scenario
workspace_types:
- development
workspace_ids: []
source_ids:
- global_guidance_memory:105b328f-4bda-4641-90a7-7282ef156316
counterexample_source_ids: []
occurrence_count: 1
explicit: true
confidence: 1.0
status: current
- statement: 普通记忆只记录密码库条目名称、用途、使用方式,不保存明文凭证。
level: scenario
workspace_types:
- development
workspace_ids: []
source_ids:
- global_guidance_memory:105b328f-4bda-4641-90a7-7282ef156316
counterexample_source_ids: []
occurrence_count: 1
explicit: true
confidence: 1.0
status: current
- statement: AI‑驱动的记忆整理与 Git 同步默认关闭,未开启时系统不应尝试加载模型或创建 `.git` 目录。
level: scenario
workspace_types:
- development
workspace_ids: []
source_ids:
- global_guidance_memory:3f91189b-11a1-45bb-8357-4f413dc1609d
counterexample_source_ids: []
occurrence_count: 1
explicit: true
confidence: 1.0
status: current
- statement: 项目记忆存放于 `aidocs/project_context.md`,采用秒级时间戳倒序记录,`aidocs/` 加入 `.gitignore`,记忆文件不提交。
level: scenario
workspace_types:
- development
workspace_ids: []
source_ids:
- global_guidance_memory:5ed86f53-b53e-4534-8e51-d3a010069d5e
counterexample_source_ids: []
occurrence_count: 1
explicit: true
confidence: 1.0
status: current
source_cursor: 89
source_hash: 2b2e3b97e81a12b79f132b76603f0fc21b774662a94ff357a992fe64de84070a
prompt_version: 2026-08-12.3
schema_version: '3'
curation_job_id: 3865944f-e527-4841-9c75-2bcbf95b6b94
created_at: '2026-08-19T09:41:26.322861+00:00'
updated_at: '2026-08-19T09:41:26.323331+00:00'
tags:
- 项目概述
- WinUnLock
---
# WinUnLock 项目概述
## 项目定位
- **目标**:在用户拥有的 Windows 电脑上,通过用户自行提供的账号密码,实现每日固定时间的自动解锁(锁屏恢复)
- **合规前提**:全程本地运行,机器归用户所有,凭据仅由用户本人提供,属于合法合规的本机自动化,不涉及未经授权的设备访问。
## 技术路线
- 使用 **Rust** 实现 **Windows Service** + **Credential Provider**(CP)
- 锁定会话不能可靠地通过 `SendInput`/键盘模拟解锁,必须走 Credential Provider DLL → LogonUI 的正规凭据提交路径。
- 关键 API:`Credential Provider COM` 接口、`CPUS_UNLOCK_WORKSTATION`、`GetCredentialCount()`、`GetSerialization()`、`CredPackAuthenticationBufferW`。
- 建议使用账户的文本密码(而非 Windows Hello PIN)进行自动解锁。
- 参考项目:
- 52破解贴([链接](https://www.52pojie.cn/thread-2083713-1-1.html))对应的 Gitee 仓库(Rust 实现 CredentialProvider)
- GitHub 项目 PsyChip/hodor(C++ 实现,处理管道权限、密码清零等)
## 当前状态
- 项目根目录 `E:\code\WinUnLock` 仅包含 `AGENTS.md`,尚未初始化代码,也未创建 Git 仓库。
- 项目已在 MemRelay 中登记,标识为 **development** 工作空间,使用 **shared** 用例配置。
## 开发实施原则(引用全局共享规则)
- **KISS & YAGNI**:采用最简、正确的实现,不为假设的未来需求添加依赖或抽象(源: `memory:0882a1ad-94c0-4a20-9e3b-f65210c0f8b1`、`global_guidance_memory:bf88c265-4749-4c50-85bc-4bae25298cd5`)。
- **复用**:优先使用已有框架、服务、工具和约定,避免重复实现(同上)。
- **凭证边界**:在任何登录、SSH、数据库或 API 调用前先查询 Vaultwarden,唯一匹配自动使用;新增或修改的凭证立即写入密码库,记忆仅记录名称、用途、使用方式(源: `global_guidance_memory:105b328f-4bda-4641-90a7-7282ef156316`)。
- **可选 AI 与 Git 集成**:默认关闭,不会自动加载模型或创建 `.git` 目录(源: `global_guidance_memory:3f91189b-11a1-45bb-8357-4f413dc1609d`)。
- **项目记忆与 Git 工作流**:项目记忆保存在 `aidocs/project_context.md`,采用秒级时间戳倒序记录,`aidocs/` 加入 `.gitignore`,完成任务后清理、更新记忆并使用 `type: 中文说明` 形式提交(源: `global_guidance_memory:5ed86f53-b53e-4534-8e51-d3a010069d5e`)。
## 开发环境与协作约定
- **语言**:中文沟通为默认;如需其他语言需明确声明(源: `global_guidance_document:ff34c6eb-6bba-41e5-9e43-ff80941fa823`)。
- **平台**:全部命令、路径和验证步骤必须兼容 Windows(同上)。
- **沟通**:持续通报关键进展,独立完成可直接验证并提交。
---
*本文档基于已登记的项目信息及全局共享规则编写。*
@@ -0,0 +1,27 @@
---
title: forum-winlogon(Gitee lieranhuasha/winlogon)Rust Credential Provider 原型验证结论
type: experience
permalink: main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/forum-winlogon-gitee-lieranhuasha-winlogon-rust-credential-provider-原型验证结论
stable_id: 67499b3a-97a6-4982-9c16-4afaa59d45f3
scope: project
memory_type: experience
project_id: ea207d36-693c-4349-b3c8-7c40c8c889f5
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
status: active
revision: 1
request_id: winunlock-exp-forumwinlogon-20260819a
created_at: '2026-08-19T09:45:16.705852+00:00'
updated_at: '2026-08-19T09:45:16.705852+00:00'
---
来源:吾爱破解帖 52pojie thread-2083713;Gitee git clone https://gitee.com/lieranhuasha/winlogon.git。本地参考副本在 C:\Users\Administrator\AppData\Local\Temp\winunlock-research\forum-winlogon(同目录另有 hodor(C++工程化参考)、rust-cp-sample)。
验证结论(用 rustc/cargo 1.94.1 + x86_64-pc-windows-msvc 实测):
- 能编译,产出 winlogon.dll(~256KB)。dumpbin /exports 确认正确导出 DllGetClassObject / DllCanUnloadNow / DllMain —— 因为 Rust cdylib 会自动导出 #[no_mangle] pub extern 函数。
- Cargo.toml 里写的 [target.x86_64-pc-windows-msvc] rustflags = /DEF:exports.def 是无效键(cargo 明确警告 unused manifest key,rustflags 应放 .cargo/config.toml),但因 cdylib 自动导出,不影响结果;说明作者构建理解有偏差。
- 缺陷1:DllMain 硬编码日志路径 D:\log\winlogon.log 且用 .expect(),D:\log 不存在时 DLL 被 LogonUI 加载即 panic。
- 缺陷2:README 全是 Gitee 模板占位符;命名不规范、有死代码。定性=可行的教学原型,验证了『命名管道 + Credential Provider + CredPackAuthenticationBufferW 序列化给 LSA』路线,但非拿来即用成品。
用法(测试.txt):DLL 加载后监听命名管道 \\.\pipe\MansonWindowsUnlockRust;外部脚本按 UTF-16LE 依次写用户名(.\机器名 格式,如 .\OMEN)与密码即可解锁。
关键教训(新实现须规避):DllMain 绝不 panic;日志路径不硬编码;管道要带长度前缀协议;管道 ACL 拒绝远程;只在 UNLOCK 场景激活;密码用完 zeroize。