5.1 KiB
5.1 KiB
title, type, permalink, stable_id, scope, project_id, workspace_type, usage_profile_id, preference_context, document_type, revision, source_memory_ids, source_checkpoint_ids, source_file_ids, source_git_commit, source_git_commits, source_agent_sync_ids, model_connection, model_name, source_count, source_revisions, source_dispositions, cited_source_ids, job_cited_source_ids, conflicts, supersedes, preferences, source_cursor, source_hash, prompt_version, schema_version, curation_job_id, created_at, updated_at, tags
| title | type | permalink | stable_id | scope | project_id | workspace_type | usage_profile_id | preference_context | document_type | revision | source_memory_ids | source_checkpoint_ids | source_file_ids | source_git_commit | source_git_commits | source_agent_sync_ids | model_connection | model_name | source_count | source_revisions | source_dispositions | cited_source_ids | job_cited_source_ids | conflicts | supersedes | preferences | source_cursor | source_hash | prompt_version | schema_version | curation_job_id | created_at | updated_at | tags | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| WinUnLock 项目关键决策汇总 | curated | main/projects/ea207d36-693c-4349-b3c8-7c40c8c889f5/curated/win-un-lock-项目关键决策汇总 | 937e5888-0a9b-45ee-9312-6e110ef1619b | project | ea207d36-693c-4349-b3c8-7c40c8c889f5 | development | null | development | decisions | 1 |
|
null | Sub2API | openai/gpt-oss-120b | 15 |
|
|
|
|
92 | 4ba0814abe7570a9e62a54340ca352579628d92bc49f330cda285b38a0442283 | 2026-08-12.3 | 3 | 745df395-ccaa-47e8-ae23-c469ef26706f | 2026-08-19T10:01:20.395598+00:00 | 2026-08-19T10:01:20.396107+00:00 |
|
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 = 1user_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] - 缺陷 & 教训:
DllMain里硬编码日志路径D:\log\winlogon.log并使用.expect(),导致加载时在不存在路径下 panic → 系统卡住。决策:在实现中绝不在DllMain中 panic,避免硬编码日志路径。- README 内容占位、命名不规范、死代码。决策:提供完整、中文、使用说明的 README,移除死代码。
- 必须使用 长度前缀协议、ACL 拒绝远程访问、仅在解锁场景激活、密码使用后 zeroize。来源: [memory:67499b3a-97a6-4982-9c16-4afaa59d45f3]
5. 开发与测试约束
- 协作约定:AI 负责完整实现(多 crate、安装/卸载脚本、中文文档),用户在虚拟机中验证后再部署到生产机器。
- 禁止 在开发机器上实际执行
regsvr32、修改注册表或创建真实计划任务,只做构建、导出检查等只读验证。来源: [memory:ffcc24b6-2d1a-46e8-bceb-49e187dd0c20]
本决策文档仅引用了项目记忆来源,未添加任何未在来源中出现的事实。