Skip to content

システムアーキテクチャ設計

Lertaro は、ミリ秒単位の超高速検索と高度なデスクトップ統合を実現しつつ、最高のシステム安定性とセキュリティを確保するために、疎結合なマルチプロセス分離モデルを採用しています。

Lertaro アーキテクチャ図

1. 3 プロセス分離モデル

単一コンポーネントの不具合によるシステム全体のクラッシュを防ぎ、管理者権限の範囲を最小限に抑えるため、Lertaro の実行環境は 3 つのプロセスに明確に分離されています。

1. バックグラウンドインデックスサービス(Lertaro.Service

  • 実行権限:Windows システムの LocalSystem 権限で常駐する Windows サービス。
  • 担当範囲:全ドライブのインデックス作成と変更監視を担当。NTFS / ReFS ドライブの USN 変更ジャーナルおよび $MFT を直接読み取り、FAT32 / exFAT の変更イベントを監視し、SMB / NAS 共有を定期的にキャッシュします。
  • セキュリティと性能:SYSTEM 権限で実行されるため UAC プロンプトなしで低レベルのボリュームメタデータに直接アクセスでき、高速な名前付きパイプを通じて結果をユーザープロセスの App に返します。UI プロセスに不要な管理者権限を持たせない安全な設計です。

2. ユーザー UI メインプロセス(Lertaro.App

  • 実行権限:標準ユーザー権限で動作するセッション分離された WPF デスクトップアプリ。
  • 担当範囲:クイック検索ウィンドウ、メイン検索ウィンドウ、設定画面、グローバルホットキー処理、アクションメニュー(Ctrl+O)、QuickLook プレビューを担当。
  • IPC と CLI 共有:名前付きパイプ(Core.Services.SearchService)を介してサービスと通信します。また、ユーザーごとの名前付きパイプ(AppSearchPipeService)をホストしており、lff コマンドラインツールが App の構築済みメモリテーブルやプラグインを再初期化なしで共有利用できます。

3. キーボードフック・ウィンドウ統合プロセス(Lertaro.Service --hook

  • 実行権限:バックグラウンドサービスから必要に応じて起動される専用の特権プロセス。
  • 担当範囲:低レベルキーボードフックおよびマウス監視を担当。
  • UIPI の回避と耐障害性:Windows の UIPI(ユーザーインターフェイス特権の分離)により、低権限プロセスから管理者権限で実行中のウィンドウへメッセージを送信することは制限されています。この特権 Hook プロセス上でウィンドウアダプター(IActivePathCollector, IFileDialogAdapter, IInlineSearchAdapter)を実行することで、管理者権限のエクスプローラーやダイアログにも支障なくフックできます。また、フック処理がクラッシュしてもメイン App には影響しません。

2. 共通コアライブラリ(Lertaro.Core

Lertaro.Core は、Service、App、Hook の各プロセスから共通して参照される基本ライブラリです。

  • 独自 fzf あいまい一致エンジン(Core/SearchIndex/Fzf/*fzf アルゴリズムに基づく高速な文字飛び一致、スコアリング、ハイライトマスク計算を実装。
  • 列指向インメモリインデックス(Core/IndexV2/*:メモリマップト列指向スナップショットとインメモリ差分レイヤーにより、数億件のファイルからミリ秒未満で結果を抽出。
  • バイナリ IPC 通信仕様SearchRequestMessage などの標準バイナリプロトコルにより、プロセス間でゼロコピーに近い高速なシリアライズを実現。
  • 統合ログシステム(Loggerservice.logapp.loghook.log にそれぞれ出力し、設定画面のログビューアーから統合的に閲覧可能。

3. プラグインシステムのアーキテクチャ上の位置づけ

すべてのプラグインは Lertaro.PluginSdk をベースに構築され、Lertaro.App 起動時に動的ロードされます。

  • 標準コンポーネント:通常の検索ソース、アクション、UI 拡張は App プロセス内のみで動作し、Service に直接アクセスすることはありません(ディレクトリのインデックス登録は DirectoryIndexerService を介して依頼)。
  • 特権アダプターの二重ロード:ウィンドウ統合用のアダプター(IActivePathCollector 等)は、管理者権限ウィンドウとの連携を担保するため、Hook プロセス側にも追加ロードされて実行されます。