# 機能設計書 98-Windows Console Host

## 概要

本ドキュメントは、Windows Console Host（conhost.exe）の機能設計を記述する。従来型Windowsコンソールアプリケーションをホストするための全体アーキテクチャ、初期化、入出力処理の構造を解説する。

### 本機能の処理概要

Windows Console Host（conhost.exe）は、Windowsのコンソールサブシステムの中核であり、cmd.exe、PowerShell等のCUIアプリケーションに画面出力と入力処理のプラットフォームを提供する。Console APIの実装、テキストバッファ管理、GDIレンダリング、入力処理、VT処理を統合する。

**業務上の目的・背景**：Windowsは1990年代からコンソールサブシステムを提供しており、conhost.exeはその現在の実装である。Windows Terminalが登場した後も、レガシーコンソールアプリケーションのサポート、ConPTYを介したWindows Terminal連携、および直接的なコンソールウィンドウ表示の3つのモードで動作し続ける。

**機能の利用シーン**：cmd.exeやPowerShellを直接起動した場合のコンソールウィンドウ表示、Windows Terminal経由でのConPTY接続、バックグラウンドサービスでのコンソールI/O処理。

**主要な処理内容**：
1. コンソールサーバーの初期化（ConsoleServerInitialization）
2. Console API の実装（ApiRoutines）
3. 入力バッファ管理（InputBuffer）
4. 画面バッファ管理（SCREEN_INFORMATION）
5. VT出力パーサーの統合（StateMachine）
6. VT入力処理（VtInputThread）
7. ConPTY信号処理（PtySignalInputThread）
8. コマンド履歴管理（CommandHistory）
9. コマンドエイリアス管理
10. レンダリング（GDIレンダラー統合）
11. 選択・コピー機能

**関連システム・外部連携**：ConPTY経由でWindows Terminalと連携。Console API経由でCUIアプリケーションとI/O。VtInputThreadでVT入力を受信、VtIoでVT出力を送信。

**権限による制御**：プロセスのセキュリティコンテキストに基づくConsole APIアクセス制御。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | conhost.exe ウィンドウ | 主画面 | コンソールアプリケーションの表示 |

## 機能種別

システム基盤 / アプリケーションホスティング

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| Server | HANDLE | Yes | コンソールサーバーハンドル | 有効なハンドル |
| args | ConsoleArguments | Yes | コマンドライン引数 | - |

### 入力データソース

- Windows カーネルからの ConDrv デバイス通信
- キーボード・マウスのWindowsメッセージ
- ConPTY経由のVT入力ストリーム

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 画面出力 | GDI描画 | コンソールウィンドウへのテキスト描画 |
| VT出力 | バイトストリーム | ConPTY経由のVTシーケンス出力 |
| Console API応答 | 各種 | ReadConsole/WriteConsole等のAPI応答 |

### 出力先

コンソールウィンドウ（GDI）、ConPTYパイプ（VT出力）

## 処理フロー

### 処理シーケンス

```
1. ConsoleServerInitialization() - サーバー初期化
   └─ グローバル設定、ConDrvデバイス通信、デリゲーション確認
2. DoCreateScreenBuffer() - 画面バッファ作成
   └─ SCREEN_INFORMATION::CreateInstance
3. _InitializeOutputStateMachine() - VTパーサー初期化
   └─ StateMachine/OutputStateMachineEngine作成
4. メインI/Oループ
   └─ Console API リクエスト処理（IoSorter経由）
5. 入力処理
   └─ InputBuffer への入力イベント書き込み
6. 出力処理
   └─ StateMachine 経由のVTシーケンス解析、TextBuffer書き込み
```

### フローチャート

```mermaid
flowchart TD
    A[conhost.exe 起動] --> B[ConsoleServerInitialization]
    B --> C[DoCreateScreenBuffer]
    C --> D[StateMachine初期化]
    D --> E{動作モード}
    E -->|直接表示| F[GDIレンダラー + ウィンドウ]
    E -->|ConPTY| G[VtIo + PtySignalInputThread]
    F --> H[I/Oループ]
    G --> H
    H --> I{リクエスト種別}
    I -->|入力| J[InputBuffer処理]
    I -->|出力| K[StateMachine → TextBuffer]
    I -->|API| L[ApiRoutines処理]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-98-01 | デリゲーション | Terminal等への処理委譲が設定されている場合はそちらに委譲 | 起動時 |
| BR-98-02 | モード切替 | ENABLE_VIRTUAL_TERMINAL_PROCESSINGによりVT処理を有効化 | 出力モード設定時 |
| BR-98-03 | コードページ管理 | 入力CP/出力CP/デフォルトCPを個別管理 | 文字エンコード処理時 |

### 計算ロジック

特記なし。

## データベース操作仕様

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| CONSOLE_EVENT_FAILURE_ID (21790) | 初期化エラー | コンソールイベント作成失敗 | エラーログ記録 |
| CONSOLE_LPC_PORT_FAILURE_ID (21791) | 初期化エラー | LPCポート作成失敗 | エラーログ記録 |

### リトライ仕様

初期化失敗時はリトライせずプロセスを終了する。

## トランザクション仕様

該当なし。

## パフォーマンス要件

- IoSorterによるI/Oリクエストの効率的なソート・処理
- ConPTYモードではVtIoによるバッファリングされたVT出力

## セキュリティ考慮事項

- Console APIはプロセスのセキュリティコンテキストで制御
- セッション0対応（非インタラクティブセッション）

## 備考

- conhost.exe は Windows OS に付属するシステムコンポーネント
- Windows Terminal とは ConPTY を介して連携する

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | globals.h | `src/host/globals.h` | グローバル状態（CONSOLE_INFORMATION等）の定義 |
| 1-2 | screenInfo.hpp | `src/host/screenInfo.hpp` | SCREEN_INFORMATION クラス定義 |
| 1-3 | inputBuffer.hpp | `src/host/inputBuffer.hpp` | InputBuffer クラス定義 |

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | srvinit.cpp | `src/host/srvinit.cpp` | ConsoleServerInitialization - サーバー初期化 |

**主要処理フロー**:
- **31-60行目**: ConsoleServerInitialization() - ConDrvデバイス通信設定、グローバル初期化、デリゲーション確認

#### Step 3: 各サブシステムを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | output.cpp | `src/host/output.cpp` | DoCreateScreenBuffer、画面出力処理 |
| 3-2 | input.cpp | `src/host/input.cpp` | 入力処理ユーティリティ |
| 3-3 | VtIo.hpp | `src/host/VtIo.hpp` | ConPTY VT I/O |
| 3-4 | VtInputThread.hpp | `src/host/VtInputThread.hpp` | VT入力スレッド |
| 3-5 | ApiRoutines.h | `src/host/ApiRoutines.h` | Console API 実装 |

### プログラム呼び出し階層図

```
conhost.exe main()
    │
    ├─ ConsoleServerInitialization()
    │      ├─ ConDrvDeviceComm 作成
    │      ├─ DelegationConfig チェック
    │      └─ FontDefaults 初期化
    │
    ├─ DoCreateScreenBuffer()
    │      └─ SCREEN_INFORMATION::CreateInstance()
    │             ├─ TextBuffer 作成
    │             └─ StateMachine 初期化
    │
    └─ I/O ループ
           ├─ Console API 処理 (ApiRoutines)
           │      ├─ ReadConsole → InputBuffer::Read()
           │      └─ WriteConsole → StateMachine::ProcessString()
           │
           ├─ VtInputThread (ConPTYモード)
           │      └─ InputStateMachineEngine
           │
           └─ VtIo (ConPTYモード)
                  └─ VT出力送信
```

### データフロー図

```
[入力]                    [処理]                          [出力]

キーボード/マウス    ───▶ InputBuffer               ───▶ CUIアプリケーション
                           (入力イベントキュー)             (ReadConsole)

CUIアプリ出力       ───▶ StateMachine              ───▶ TextBuffer
(WriteConsole)             (VTパーサー)                     (画面バッファ)
                                                           │
                                                         GdiEngine
                                                           (画面描画)

ConPTY入力          ───▶ VtInputThread             ───▶ InputBuffer
(VTシーケンス)             (VT入力パーサー)

TextBuffer          ───▶ VtIo                      ───▶ ConPTYパイプ
(変更差分)                 (VT出力送信)                     (Windows Terminal)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| srvinit.cpp | `src/host/srvinit.cpp` | ソース | サーバー初期化 |
| output.cpp | `src/host/output.cpp` | ソース | 画面出力処理 |
| output.h | `src/host/output.h` | ソース | 出力ヘッダー |
| input.cpp | `src/host/input.cpp` | ソース | 入力処理 |
| input.h | `src/host/input.h` | ソース | 入力ヘッダー |
| screenInfo.hpp | `src/host/screenInfo.hpp` | ソース | SCREEN_INFORMATION定義 |
| inputBuffer.hpp | `src/host/inputBuffer.hpp` | ソース | InputBuffer定義 |
| inputBuffer.cpp | `src/host/inputBuffer.cpp` | ソース | InputBuffer実装 |
| globals.h | `src/host/globals.h` | ソース | グローバル定義 |
| globals.cpp | `src/host/globals.cpp` | ソース | グローバル実装 |
| consoleInformation.cpp | `src/host/consoleInformation.cpp` | ソース | コンソール情報 |
| ApiRoutines.h | `src/host/ApiRoutines.h` | ソース | API実装 |
| VtIo.hpp | `src/host/VtIo.hpp` | ソース | ConPTY VT I/O |
| VtIo.cpp | `src/host/VtIo.cpp` | ソース | VT I/O実装 |
| VtInputThread.hpp | `src/host/VtInputThread.hpp` | ソース | VT入力スレッド |
| VtInputThread.cpp | `src/host/VtInputThread.cpp` | ソース | VT入力スレッド実装 |
| PtySignalInputThread.hpp | `src/host/PtySignalInputThread.hpp` | ソース | PTY信号入力 |
| stream.cpp | `src/host/stream.cpp` | ソース | ストリーム処理 |
| outputStream.hpp | `src/host/outputStream.hpp` | ソース | 出力ストリーム |
| selection.hpp | `src/host/selection.hpp` | ソース | 選択機能 |
| history.h | `src/host/history.h` | ソース | コマンド履歴 |
| alias.h | `src/host/alias.h` | ソース | エイリアス |
| settings.hpp | `src/host/settings.hpp` | ソース | 設定 |
