Skip to content

시스템 아키텍처 설계 ​

Lertaro는 밀리초 단위 검색과 데스크톱 통합을 달성하는 동시에 시스템 안정성과 보안을 보장하기 위해 다중 프로세스 격리 아키텍처를 채택하고 있습니다.

Runtime processes and communication
lff.exeOptional command-line client
Per-user, per-session search pipe
Desktop application
Lertaro.App.exeStandard user · WPF

Search windows, settings, previews and plugin search providers

App ↔ ServiceLertaroPipeSearch requests ↔ results
Indexing serviceLertaro.Service.exe --serviceLocalSystem · Windows service

NTFS / ReFS metadata, FAT / exFAT watchers and network directory caches

App ↔ HookLertaro_Hook_Events / CmdsWindow events ↔ commands
Hooks and window adaptersLertaro.Service.exe --hookInteractive user session

Keyboard / mouse hooks, active paths and file-dialog integration

Service launches the Hook for the signed-in session. Hook elevation is available only for administrator accounts.

Shared libraries — loaded into processes, not separate services

Lertaro.CoreIndex snapshots, fuzzy matching and IPC contracts

Lertaro.PluginSdkSearch / UI in App · adapters in Hook · aliases / translations also in Service

1. 3 프로세스 격리 모델 ​

단일 컴포넌트의 오류가 전체 시스템 충돌로 이어지는 것을 방지하고 관리자 권한 범위를 최소화하기 위해 런타임이 세 개의 독립된 프로세스로 분리되어 있습니다.

1. 백그라운드 인덱싱 서비스 (Lertaro.Service.exe) ​

  • 실행 권한: Windows 시스템의 LocalSystem 계정으로 상주하는 Windows 서비스.
  • 주요 역할: 전체 디스크 파일 인덱싱 및 증분 변경 추적. NTFS / ReFS 디스크의 USN 변경 저널 및 $MFT 테이블을 직접 파싱하고, FAT32 / exFAT 변경 이벤트를 실시간 감지하며, SMB / NAS 네트워크 공유를 주기적으로 스캔하여 캐싱합니다.
  • 보안 및 성능: SYSTEM 권한으로 실행되어 UAC 팝업 없이 원시 볼륨 메타데이터를 직접 읽을 수 있으며, 고속 명명된 파이프를 통해 사용자 모드 App으로 검색 결과를 전달하므로 UI 프로세스에 불필요한 관리자 권한을 부여하지 않습니다.

2. 사용자 상호작용 메인 프로세스 (Lertaro.App) ​

  • 실행 권한: 표준 사용자 모드 세션 격리 WPF 데스크톱 애플리케이션.
  • 주요 역할: 퀵 검색창, 메인 검색 윈도우, 설정 센터, 전역 단축키 처리, 액션 메뉴(Ctrl+O), QuickLook 파일 즉시 미리보기를 담당합니다.
  • IPC 통신 및 CLI 호스팅: 양방향 명명된 파이프 LertaroPipe를 통해 백그라운드 서비스와 통신합니다(Core.Services.Search.SearchService가 App 쪽 클라이언트입니다). 또한 사용자 전용 파이프(AppSearchPipeService)를 호스팅하여 lff CLI 도구가 App의 초기화된 메모리 별칭 테이블과 플러그인을 중복 초기화 없이 그대로 활용할 수 있도록 지원합니다.

3. 전역 키보드 후크 및 창 어댑터 프로세스 (Lertaro.Service --hook) ​

  • 실행 권한: 백그라운드 서비스가 시작하는 전용 보조 프로세스입니다. 로그인한 계정이 실제 관리자일 때만 승격(elevated)되어 실행되고, 그 외에는 사용자 자신의 토큰으로 동작하므로 아래의 우회는 그 기기에서만 사용할 수 있습니다.
  • 주요 역할: 저수준 전역 키보드 후크 및 마우스 이벤트 감지.
  • UIPI 권한 우회 및 충돌 격리: Windows UIPI(사용자 인터페이스 권한 격리) 규칙에 따라 일반 권한 프로세스는 관리자 권한으로 실행된 창에 메시지를 보낼 수 없습니다. 이 Hook 프로세스에서 창 통합 어댑터(IActivePathCollector, IFileDialogAdapter, IInlineSearchAdapter)를 실행함으로써, 후크가 승격되어 실행된 경우에는 관리자 권한으로 실행된 탐색기와 Total Commander, 파일 대화상자도 읽고 조작할 수 있습니다. 또한 후크 오류가 발생해도 메인 App의 동작은 안전하게 유지됩니다.

2. 공유 코어 라이브러리 (Lertaro.Core) ​

Lertaro.Core는 Service, App, Hook 프로세스에서 공통 참조하는 핵심 라이브러리입니다.

  • 자체 개발 fzf 퍼지 매칭 엔진 (Core/SearchIndex/Fzf/*): fzf 알고리즘 기반의 문자 점프 일치, 점수 산정 및 하이라이트 마스크 계산 구현.
  • 컬럼형 메모리 인덱스 (Core/IndexV2/*): 메모리 맵 컬럼형 스냅샷과 델타 오버레이를 결합하여 수억 건의 파일에 대해 서브밀리초 검색 달성.
  • 바이너리 IPC 프로토콜: SearchRequestMessage 등의 직렬화 구조를 통해 프로세스 간 제로카피 고속 통신 지원.
  • 통합 로깅 시스템 (Logger): service.log, app.log, hook.log로 분리 기록되며 설정 창의 로그 뷰어를 통해 통합 조회 가능.

3. 플러그인 시스템의 아키텍처 위치 ​

모든 플러그인은 Lertaro.PluginSdk를 기반으로 빌드되며 Lertaro.App 실행 시 동적으로 로드됩니다.

  • 무권한 직접 접근: 플러그인 자신의 코드는 자신을 로드한 프로세스 안에서 동작합니다 — 보통은 App이며, Service도 로드하는 두 종류는 다음 항목을 보세요. 플러그인이 스스로 프로세스 경계를 넘는 일은 없으므로, 사용자 지정 폴더 인덱싱이 필요한 플러그인은 디스크를 직접 훑는 대신 DirectoryIndexerService에 작업을 넘깁니다.
  • 선별적 이중 로드: 검색 소스와 액션, UI 확장은 App 프로세스에서만 동작합니다. 다른 프로세스에도 함께 로드되는 것은 세 가지입니다. 창 및 파일 대화상자 어댑터(IActivePathCollector, IFileDialogAdapter, IInlineSearchAdapter)는 권한 격리를 넘는 창 자동화를 위해 Hook 프로세스에 로드되고, IAliasProvider와 ITranslationProvider는 Service에도 로드됩니다(ServicePluginLoader). 인덱서가 별칭 행을 만들기 때문에 화면에 보이는 것과 같은 음역 표기와 이름이 인덱스에도 필요하기 때문입니다.