diff --git a/electron/services/backupService.ts b/electron/services/backupService.ts index 1665f87..c63ef88 100644 --- a/electron/services/backupService.ts +++ b/electron/services/backupService.ts @@ -9,7 +9,7 @@ import { wcdbService } from './wcdbService' import { expandHomePath } from '../utils/pathUtils' import { decryptDatViaNative, encryptDatViaNative, type NativeDatMeta } from './nativeImageDecrypt' -type BackupDbKind = 'session' | 'contact' | 'emoticon' | 'message' | 'media' | 'sns' +type BackupDbKind = 'session' | 'contact' | 'emoticon' | 'message' | 'media' | 'sns' | 'hardlink' type BackupPhase = 'preparing' | 'scanning' | 'exporting' | 'packing' | 'inspecting' | 'restoring' | 'done' | 'failed' type BackupResourceKind = 'image' | 'video' | 'file' const TEMP_MARKER = '.weflow-backup-temp' @@ -497,7 +497,7 @@ export class BackupService { } private buildDbId(kind: BackupDbKind, index: number, dbPath: string): string { - if (kind === 'session' || kind === 'contact' || kind === 'emoticon' || kind === 'sns') return kind + if (kind === 'session' || kind === 'contact' || kind === 'emoticon' || kind === 'sns' || kind === 'hardlink') return kind return `${kind}-${index}-${safeName(basename(dbPath)).slice(0, 80)}` } @@ -521,6 +521,7 @@ export class BackupService { if (kind === 'contact') return 'contact/contact.db' if (kind === 'emoticon') return 'emoticon/emoticon.db' if (kind === 'sns') return 'sns/sns.db' + if (kind === 'hardlink') return 'hardlink/hardlink.db' return null } @@ -570,12 +571,19 @@ export class BackupService { join(dirname(dbStorage), 'sns', 'sns.db') ]) } + if (kind === 'hardlink') { + return this.findFirstExisting([ + join(dbStorage, 'hardlink', 'hardlink.db'), + join(dbStorage, 'hardlink.db'), + join(dirname(dbStorage), 'hardlink.db') + ]) + } return '' } private async collectDatabases(dbStorage: string): Promise>> { const result: Array> = [] - for (const kind of ['session', 'contact', 'emoticon', 'sns'] as const) { + for (const kind of ['session', 'contact', 'emoticon', 'sns', 'hardlink'] as const) { const dbPath = this.resolveKnownDbPath(kind, dbStorage) result.push({ id: kind, diff --git a/electron/services/keyServiceMac.ts b/electron/services/keyServiceMac.ts index 7d4e4d0..e094918 100644 --- a/electron/services/keyServiceMac.ts +++ b/electron/services/keyServiceMac.ts @@ -707,7 +707,7 @@ export class KeyServiceMac { } if (code === 'HOOK_FAILED') { if (normalizedDetail.includes('HOOK_TIMEOUT')) { - return 'Hook 已安装,但在等待时间内未触发目标函数。请保持微信前台并执行一次会话/数据库访问后重试。' + return 'Hook 已安装,但在等待时间内未触发登录流程。请退出微信账号后重新登录,或在未登录状态下直接登录微信,完成一次登录流程后重试。' } if (normalizedDetail.includes('attach_wait_timeout')) { return '附加调试器超时,未能进入 Hook 阶段。请确认微信处于可交互状态并重试。' diff --git a/resources/wcdb/linux/x64/libwcdb_api.so b/resources/wcdb/linux/x64/libwcdb_api.so index 504c2b5..d5feb7a 100644 Binary files a/resources/wcdb/linux/x64/libwcdb_api.so and b/resources/wcdb/linux/x64/libwcdb_api.so differ diff --git a/resources/wcdb/macos/universal/libwcdb_api.dylib b/resources/wcdb/macos/universal/libwcdb_api.dylib index 72f2368..bc24c25 100644 Binary files a/resources/wcdb/macos/universal/libwcdb_api.dylib and b/resources/wcdb/macos/universal/libwcdb_api.dylib differ diff --git a/resources/wcdb/win32/arm64/wcdb_api.dll b/resources/wcdb/win32/arm64/wcdb_api.dll index 198eedf..cd1799c 100644 Binary files a/resources/wcdb/win32/arm64/wcdb_api.dll and b/resources/wcdb/win32/arm64/wcdb_api.dll differ diff --git a/resources/wcdb/win32/x64/wcdb_api.dll b/resources/wcdb/win32/x64/wcdb_api.dll index 8eb70c7..c223d45 100644 Binary files a/resources/wcdb/win32/x64/wcdb_api.dll and b/resources/wcdb/win32/x64/wcdb_api.dll differ diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index f854fe4..7bf4cda 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -58,7 +58,7 @@ export interface BackupManifest { options?: BackupOptions databases: Array<{ id: string - kind: 'session' | 'contact' | 'emoticon' | 'message' | 'media' | 'sns' + kind: 'session' | 'contact' | 'emoticon' | 'message' | 'media' | 'sns' | 'hardlink' dbPath: string relativePath: string tables: Array<{