# API設計書

## 概要

本ドキュメントは、Windows Terminal / Console Host（conhost.exe）プロジェクトの内部API設計を記述する。本プロジェクトはWebベースのREST APIではなく、Windowsカーネルドライバ（condrv）を介したIOCTLメッセージベースのプロセス間通信（IPC）APIで構成される。クライアントプロセス（cmd.exe、PowerShell等）がコンソールホストサーバーに対してAPI呼び出しを行い、`CONSOLE_API_MSG` メッセージ構造体を介してリクエスト・レスポンスが処理される。

APIは3つのレベル（L1: 基本I/O、L2: 画面バッファ操作、L3: 高度な機能）に階層化されており、`ApiSorter` がメッセージのルーティング、`ApiDispatchers` がデコードと実装ルーチンへのディスパッチを担当する。

## 共通仕様

### 通信方式

```
クライアントプロセス → condrv（カーネルドライバ） → コンソールホストサーバー（conhost.exe）
```

IOCTLベースのメッセージパッシングにより、クライアントプロセスとコンソールホスト間で通信が行われる。

### メッセージプロトコル

すべてのAPI呼び出しは `CONSOLE_API_MSG` 構造体にカプセル化される。

| フィールド | 型 | 説明 |
| --- | --- | --- |
| Descriptor | `CD_IO_DESCRIPTOR` | I/O記述子（操作種別の識別） |
| msgHeader | `CONSOLE_MSG_HEADER` | メッセージヘッダー（APIレベル・番号の指定） |
| u.consoleMsgL1 | `CONSOLE_MSG_BODY_L1` | L1レベルのメッセージボディ（共用体） |
| u.consoleMsgL2 | `CONSOLE_MSG_BODY_L2` | L2レベルのメッセージボディ（共用体） |
| u.consoleMsgL3 | `CONSOLE_MSG_BODY_L3` | L3レベルのメッセージボディ（共用体） |
| Complete | `CD_IO_COMPLETE` | 完了情報（ステータス・戻り値） |
| State | `CONSOLE_API_STATE` | メッセージ状態管理 |

### 認証・認可方式

プロセスレベルのポリシーベース認可を採用。Windows AppContainerセキュリティモデルに基づく。

| ポリシークラス | メソッド | 説明 |
| --- | --- | --- |
| `ConsoleProcessPolicy` | `CanReadOutputBuffer()` | 出力バッファの読み取り権限チェック |
| `ConsoleProcessPolicy` | `CanWriteInputBuffer()` | 入力バッファの書き込み権限チェック |
| `ConsoleShimPolicy` | `IsCmdExe()` | cmd.exe互換性シム適用判定 |
| `ConsoleShimPolicy` | `IsPowershellExe()` | PowerShell互換性シム適用判定 |

ハンドルベースのオブジェクトアクセス制御により、各クライアントプロセスは `DesiredAccess`（`GENERIC_READ` / `GENERIC_WRITE`）と `ShareMode` に基づいてオブジェクトへのアクセス権が決定される。

### 共通エラーレスポンス

| ステータスコード（HRESULT / NTSTATUS） | 説明 |
| --- | --- |
| `S_OK` / `STATUS_SUCCESS` | 成功 |
| `E_INVALIDARG` / `STATUS_INVALID_PARAMETER` | パラメータ不正 |
| `E_ACCESSDENIED` | アクセス拒否（ポリシーによるブロック） |
| `STATUS_BUFFER_TOO_SMALL` | バッファサイズ不足 |
| `STATUS_OBJECT_NAME_NOT_FOUND` | オブジェクト未検出 |
| `HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE)` | ハンドル不正 |

### API番号体系

APIはレベル番号とコールIDの組み合わせで識別される。

```
API番号 = (レベル番号 << 24) | コールID
例: API_NUMBER_GETCONSOLEINPUT = 0x01000004  （L1の5番目のAPI）
    API_NUMBER_READCONSOLE     = 0x01000005  （L1の6番目のAPI）
    API_NUMBER_WRITECONSOLE    = 0x01000006  （L1の7番目のAPI）
```

### I/Oディスパッチ処理フロー

```
1. IDeviceComm::ReadIo()      → ドライバからメッセージ受信
2. IoDispatchers::ConsoleDispatchRequest()  → I/O操作の種別判定
3. ApiSorter::ConsoleDispatchRequest()      → APIレベル・番号に基づくルーティング
4. ApiDispatchers::Server*()                → 具体的なAPI処理の実行
5. IApiRoutines::*Impl()                    → 実装ルーチンの呼び出し
6. IDeviceComm::CompleteIo()                → 結果をクライアントに返送
```

### I/Oオブジェクト種別

| オブジェクトタイプ | 定数 | 説明 |
| --- | --- | --- |
| 汎用 | `CD_IO_OBJECT_TYPE_GENERIC` | アクセスモードに基づき自動判定 |
| 入力バッファ | `CD_IO_OBJECT_TYPE_CURRENT_INPUT` | 現在のコンソール入力バッファ |
| 出力バッファ | `CD_IO_OBJECT_TYPE_CURRENT_OUTPUT` | 現在のアクティブ出力バッファ |
| 新規出力バッファ | `CD_IO_OBJECT_TYPE_NEW_OUTPUT` | 新規スクリーンバッファの作成 |

## API一覧

| カテゴリ | API名 | レベル | 説明 |
| --- | --- | --- | --- |
| コードページ | ServerGetConsoleCP | L1 | コンソールのコードページ取得 |
| コードページ | ServerSetConsoleCP | L2 | コンソールのコードページ設定 |
| コンソールモード | ServerGetConsoleMode | L1 | コンソールモードフラグ取得 |
| コンソールモード | ServerSetConsoleMode | L1 | コンソールモードフラグ設定 |
| 入力操作 | ServerGetNumberOfInputEvents | L1 | 入力イベント数の取得 |
| 入力操作 | ServerGetConsoleInput | L1 | 入力イベントの読み取り |
| 入力操作 | ServerReadConsole | L1 | コンソール入力の読み取り |
| 入力操作 | ServerFlushConsoleInputBuffer | L2 | 入力バッファのフラッシュ |
| 入力操作 | ServerWriteConsoleInput | L2 | 入力バッファへのイベント書き込み |
| 出力操作 | ServerWriteConsole | L1 | コンソールへのテキスト出力 |
| 出力操作 | ServerFillConsoleOutput | L2 | 指定文字/属性での出力バッファ充填 |
| 出力操作 | ServerWriteConsoleOutput | L2 | 出力バッファへのセルデータ書き込み |
| 出力操作 | ServerWriteConsoleOutputString | L2 | 出力バッファへの文字列書き込み |
| 出力操作 | ServerReadConsoleOutput | L2 | 出力バッファからのセルデータ読み取り |
| 出力操作 | ServerReadConsoleOutputString | L2 | 出力バッファからの文字列読み取り |
| スクリーンバッファ | ServerSetConsoleActiveScreenBuffer | L2 | アクティブスクリーンバッファの切替 |
| スクリーンバッファ | ServerGetConsoleScreenBufferInfo | L2 | スクリーンバッファ情報の取得 |
| スクリーンバッファ | ServerSetConsoleScreenBufferInfo | L2 | スクリーンバッファ情報の設定 |
| スクリーンバッファ | ServerSetConsoleScreenBufferSize | L2 | スクリーンバッファサイズの設定 |
| スクリーンバッファ | ServerScrollConsoleScreenBuffer | L2 | スクリーンバッファのスクロール |
| カーソル | ServerGetConsoleCursorInfo | L2 | カーソル情報の取得 |
| カーソル | ServerSetConsoleCursorInfo | L2 | カーソル情報の設定 |
| カーソル | ServerSetConsoleCursorPosition | L2 | カーソル位置の設定 |
| テキスト属性 | ServerSetConsoleTextAttribute | L2 | テキスト属性の設定 |
| ウィンドウ | ServerGetLargestConsoleWindowSize | L2 | 最大ウィンドウサイズの取得 |
| ウィンドウ | ServerSetConsoleWindowInfo | L2 | ウィンドウ情報の設定 |
| ウィンドウ | ServerGetConsoleWindow | L3 | コンソールウィンドウハンドルの取得 |
| タイトル | ServerGetConsoleTitle | L2 | コンソールタイトルの取得 |
| タイトル | ServerSetConsoleTitle | L2 | コンソールタイトルの設定 |
| 言語 | ServerGetConsoleLangId | L1 | 言語IDの取得 |
| 制御イベント | ServerGenerateConsoleCtrlEvent | L2 | Ctrl+C等の制御イベント生成 |
| マウス | ServerGetConsoleMouseInfo | L3 | マウスボタン数の取得 |
| フォント | ServerGetConsoleFontSize | L3 | フォントサイズの取得 |
| フォント | ServerGetConsoleCurrentFont | L3 | 現在のフォント情報の取得 |
| フォント | ServerSetConsoleCurrentFont | L3 | フォント情報の設定 |
| 表示モード | ServerSetConsoleDisplayMode | L3 | 表示モードの設定 |
| 表示モード | ServerGetConsoleDisplayMode | L3 | 表示モードの取得 |
| エイリアス | ServerAddConsoleAlias | L3 | コンソールエイリアスの追加 |
| エイリアス | ServerGetConsoleAlias | L3 | コンソールエイリアスの取得 |
| エイリアス | ServerGetConsoleAliasesLength | L3 | エイリアス一覧の必要バッファ長の取得 |
| エイリアス | ServerGetConsoleAliases | L3 | エイリアス一覧の取得 |
| エイリアス | ServerGetConsoleAliasExesLength | L3 | エイリアスExe一覧の必要バッファ長の取得 |
| エイリアス | ServerGetConsoleAliasExes | L3 | エイリアスExe一覧の取得 |
| コマンド履歴 | ServerExpungeConsoleCommandHistory | L3 | コマンド履歴の消去 |
| コマンド履歴 | ServerSetConsoleNumberOfCommands | L3 | コマンド履歴のサイズ設定 |
| コマンド履歴 | ServerGetConsoleCommandHistoryLength | L3 | コマンド履歴の必要バッファ長の取得 |
| コマンド履歴 | ServerGetConsoleCommandHistory | L3 | コマンド履歴の取得 |
| 選択情報 | ServerGetConsoleSelectionInfo | L3 | 選択状態情報の取得 |
| プロセス管理 | ServerGetConsoleProcessList | L3 | アタッチ済みプロセス一覧の取得 |
| 履歴設定 | ServerGetConsoleHistory | L3 | 履歴設定情報の取得 |
| 履歴設定 | ServerSetConsoleHistory | L3 | 履歴設定情報の設定 |
| 非推奨 | ServerDeprecatedApi | - | 非推奨APIのスタブ |

## 各APIエンドポイント定義

### コードページ管理

#### 1. GetConsoleCP

コンソールの入力または出力コードページを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleCP` |
| 実装ルーチン | `IApiRoutines::GetConsoleInputCodePageImpl` / `GetConsoleOutputCodePageImpl` |
| レベル | L1 |
| 認証 | 不要（接続済みプロセスであれば呼び出し可能） |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| Input/Output指定 | `bool` | ○ | 入力コードページか出力コードページかの区別（msgHeader内フラグ） |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| codepage | `ULONG` | 現在のコードページ番号（例: 65001 = UTF-8, 932 = Shift_JIS） |

**レスポンス（エラー時）**

ステータスコード: `HRESULT`（失敗の場合は `E_*` コード）

---

#### 2. SetConsoleCP

コンソールの入力または出力コードページを設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleCP` |
| 実装ルーチン | `IApiRoutines::SetConsoleInputCodePageImpl` / `SetConsoleOutputCodePageImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| codepage | `ULONG` | ○ | 設定するコードページ番号 |
| Input/Output指定 | `bool` | ○ | 入力コードページか出力コードページかの区別 |

**レスポンス（成功時）**

ステータスコード: `S_OK`

**レスポンス（エラー時）**

ステータスコード: `HRESULT`（無効なコードページの場合は `E_INVALIDARG`）

---

### コンソールモード管理

#### 3. GetConsoleMode

コンソール入力バッファまたはスクリーンバッファのモードフラグを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleMode` |
| 実装ルーチン | `IApiRoutines::GetConsoleInputModeImpl` / `GetConsoleOutputModeImpl` |
| レベル | L1 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `InputBuffer` / `SCREEN_INFORMATION` | ○ | 対象ハンドル（入力 or 出力） |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| mode | `ULONG` | モードフラグのビットマスク |

---

#### 4. SetConsoleMode

コンソール入力バッファまたはスクリーンバッファのモードフラグを設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleMode` |
| 実装ルーチン | `IApiRoutines::SetConsoleInputModeImpl` / `SetConsoleOutputModeImpl` |
| レベル | L1 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleInputObject` / `IConsoleOutputObject` | ○ | 対象ハンドル |
| mode | `ULONG` | ○ | 設定するモードフラグ |

**レスポンス（成功時）**

ステータスコード: `S_OK`

**レスポンス（エラー時）**

ステータスコード: `HRESULT`

---

### 入力操作

#### 5. GetNumberOfInputEvents

入力バッファ内の未読イベント数を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetNumberOfInputEvents` |
| 実装ルーチン | `IApiRoutines::GetNumberOfConsoleInputEventsImpl` |
| レベル | L1 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleInputObject` | ○ | 入力バッファハンドル |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| events | `ULONG` | 入力バッファ内のイベント数 |

---

#### 6. GetConsoleInput

入力バッファからイベントレコードを読み取る。Peek（覗き見）モードをサポートし、待機動作にも対応する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleInput` |
| 実装ルーチン | `IApiRoutines::GetConsoleInputImpl` |
| レベル | L1 |
| API番号 | `0x01000004` |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleInputObject` | ○ | 入力バッファハンドル |
| eventReadCount | `size_t` | ○ | 読み取るイベント数 |
| IsUnicode | `bool` | ○ | Unicode形式で取得するか |
| IsPeek | `bool` | ○ | Peekモード（イベントを消費しない） |
| IsWaitAllowed | `bool` | ○ | イベントがない場合に待機可能か |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| outEvents | `InputEventQueue` | 読み取った入力イベントのキュー |

**待機動作**

イベントが利用不可で `IsWaitAllowed` が `true` の場合、`ConsoleWaitQueue` を使用して非同期待機が行われ、イベント到着時に処理が再開される。

---

#### 7. ReadConsole

コンソール入力バッファからテキストデータを読み取る（行編集機能付き）。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerReadConsole` |
| 実装ルーチン | `IApiRoutines::ReadConsoleImpl` |
| レベル | L1 |
| API番号 | `0x01000005` |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleInputObject` | ○ | 入力バッファハンドル |
| buffer | `std::span<char>` | ○ | 読み取りデータの格納先バッファ |
| initialData | `std::wstring_view` | - | 初期入力データ |
| exeName | `std::wstring_view` | - | 呼び出し元実行ファイル名（履歴管理用） |
| IsUnicode | `bool` | ○ | Unicode形式で読み取るか |
| clientHandle | `HANDLE` | ○ | クライアントプロセスハンドル |
| controlWakeupMask | `DWORD` | ○ | 制御文字によるウェイクアップマスク |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| written | `size_t` | 実際に読み取ったバイト数 |
| controlKeyState | `DWORD` | 制御キーの状態 |

---

#### 8. WriteConsoleInput

入力バッファにイベントレコードを書き込む。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerWriteConsoleInput` |
| 実装ルーチン | `IApiRoutines::WriteConsoleInputAImpl` / `WriteConsoleInputWImpl` |
| レベル | L2 |
| 認証 | `ConsoleProcessPolicy::CanWriteInputBuffer()` によるポリシーチェック |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleInputObject` | ○ | 入力バッファハンドル |
| buffer | `std::span<const INPUT_RECORD>` | ○ | 書き込むイベントレコードの配列 |
| append | `bool` | ○ | バッファ末尾に追加するか |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| written | `size_t` | 実際に書き込んだレコード数 |

---

#### 9. FlushConsoleInputBuffer

入力バッファ内のすべてのイベントを消去する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerFlushConsoleInputBuffer` |
| 実装ルーチン | `IApiRoutines::FlushConsoleInputBuffer` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleInputObject` | ○ | 入力バッファハンドル |

**レスポンス（成功時）**

ステータスコード: `void`（常に成功）

---

### 出力操作

#### 10. WriteConsole

コンソールスクリーンバッファにテキストを出力する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerWriteConsole` |
| 実装ルーチン | `IApiRoutines::WriteConsoleAImpl` / `WriteConsoleWImpl` |
| レベル | L1 |
| API番号 | `0x01000006` |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| buffer | `std::string_view` / `std::wstring_view` | ○ | 出力するテキストデータ |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| read | `size_t` | 実際に処理した文字数 |

**待機動作**

出力バッファが一時的に処理不能な場合、待機ルーチンにより後続処理される。

---

#### 11. FillConsoleOutput

出力バッファの指定範囲を指定の文字または属性で充填する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerFillConsoleOutput` |
| 実装ルーチン | `IApiRoutines::FillConsoleOutputAttributeImpl` / `FillConsoleOutputCharacterAImpl` / `FillConsoleOutputCharacterWImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| OutContext | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| character / attribute | `char` / `wchar_t` / `WORD` | ○ | 充填する文字または属性値 |
| lengthToWrite | `size_t` | ○ | 充填するセル数 |
| startingCoordinate | `til::point` | ○ | 開始座標 {X, Y} |
| enablePowershellShim | `bool` | - | PowerShell互換性シムの有効化（属性充填時のみ） |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| cellsModified | `size_t` | 実際に変更されたセル数 |

---

#### 12. WriteConsoleOutput

出力バッファの指定矩形領域にセルデータ（文字＋属性）を書き込む。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerWriteConsoleOutput` |
| 実装ルーチン | `IApiRoutines::WriteConsoleOutputAImpl` / `WriteConsoleOutputWImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| buffer | `std::span<CHAR_INFO>` | ○ | 書き込むセルデータの配列 |
| requestRectangle | `Viewport` | ○ | 書き込み先の矩形領域 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| writtenRectangle | `Viewport` | 実際に書き込まれた矩形領域 |

---

#### 13. WriteConsoleOutputString

出力バッファの指定位置から文字列または属性列を書き込む。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerWriteConsoleOutputString` |
| 実装ルーチン | `IApiRoutines::WriteConsoleOutputCharacterAImpl` / `WriteConsoleOutputCharacterWImpl` / `WriteConsoleOutputAttributeImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| OutContext | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| text / attrs | `std::string_view` / `std::wstring_view` / `std::span<const WORD>` | ○ | 書き込むデータ |
| target | `til::point` | ○ | 書き込み開始座標 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| used | `size_t` | 実際に書き込んだ要素数 |

---

#### 14. ReadConsoleOutput

出力バッファの指定矩形領域からセルデータを読み取る。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerReadConsoleOutput` |
| 実装ルーチン | `IApiRoutines::ReadConsoleOutputAImpl` / `ReadConsoleOutputWImpl` |
| レベル | L2 |
| 認証 | `ConsoleProcessPolicy::CanReadOutputBuffer()` によるポリシーチェック |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| buffer | `std::span<CHAR_INFO>` | ○ | セルデータの格納先 |
| sourceRectangle | `Viewport` | ○ | 読み取り元の矩形領域 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| readRectangle | `Viewport` | 実際に読み取った矩形領域 |

---

#### 15. ReadConsoleOutputString

出力バッファの指定位置から文字列または属性列を読み取る。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerReadConsoleOutputString` |
| 実装ルーチン | `IApiRoutines::ReadConsoleOutputCharacterAImpl` / `ReadConsoleOutputCharacterWImpl` / `ReadConsoleOutputAttributeImpl` |
| レベル | L2 |
| 認証 | `ConsoleProcessPolicy::CanReadOutputBuffer()` によるポリシーチェック |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| origin | `til::point` | ○ | 読み取り開始座標 |
| buffer | `std::span<char>` / `std::span<wchar_t>` / `std::span<WORD>` | ○ | 格納先バッファ |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| written | `size_t` | 実際に読み取った要素数 |

---

### スクリーンバッファ管理

#### 16. SetConsoleActiveScreenBuffer

アクティブなスクリーンバッファを切り替える。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleActiveScreenBuffer` |
| 実装ルーチン | `IApiRoutines::SetConsoleActiveScreenBufferImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| newContext | `IConsoleOutputObject` | ○ | 新しいアクティブバッファのハンドル |

**レスポンス（成功時）**

ステータスコード: `void`（常に成功）

---

#### 17. GetConsoleScreenBufferInfo

スクリーンバッファの詳細情報を取得する（サイズ、カーソル位置、属性、ウィンドウ範囲、最大サイズ、カラーテーブル）。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleScreenBufferInfo` |
| 実装ルーチン | `IApiRoutines::GetConsoleScreenBufferInfoExImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| data | `CONSOLE_SCREEN_BUFFER_INFOEX` | バッファサイズ、カーソル位置、テキスト属性、ウィンドウ矩形、最大ウィンドウサイズ、カラーテーブル（16色） |

---

#### 18. SetConsoleScreenBufferInfo

スクリーンバッファの詳細情報を設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleScreenBufferInfo` |
| 実装ルーチン | `IApiRoutines::SetConsoleScreenBufferInfoExImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| OutContext | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| data | `CONSOLE_SCREEN_BUFFER_INFOEX` | ○ | 設定するバッファ情報 |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

#### 19. SetConsoleScreenBufferSize

スクリーンバッファのサイズを変更する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleScreenBufferSize` |
| 実装ルーチン | `IApiRoutines::SetConsoleScreenBufferSizeImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| size | `til::size` | ○ | 新しいバッファサイズ {Width, Height} |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

#### 20. ScrollConsoleScreenBuffer

スクリーンバッファの指定領域をスクロール（移動）する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerScrollConsoleScreenBuffer` |
| 実装ルーチン | `IApiRoutines::ScrollConsoleScreenBufferAImpl` / `ScrollConsoleScreenBufferWImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| source | `til::inclusive_rect` | ○ | スクロール元の矩形領域 |
| target | `til::point` | ○ | スクロール先の座標 |
| clip | `std::optional<til::inclusive_rect>` | - | クリッピング矩形（省略可） |
| fillCharacter | `char` / `wchar_t` | ○ | 空白領域の充填文字 |
| fillAttribute | `WORD` | ○ | 空白領域の充填属性 |
| enableCmdShim | `bool` | - | cmd.exe互換性シム（Wバリアントのみ） |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

### カーソル管理

#### 21. GetConsoleCursorInfo

カーソルのサイズと表示状態を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleCursorInfo` |
| 実装ルーチン | `IApiRoutines::GetConsoleCursorInfoImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `SCREEN_INFORMATION` | ○ | スクリーンバッファ |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| size | `ULONG` | カーソルサイズ（1-100、セルの充填率%） |
| isVisible | `bool` | カーソルの表示/非表示 |

---

#### 22. SetConsoleCursorInfo

カーソルのサイズと表示状態を設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleCursorInfo` |
| 実装ルーチン | `IApiRoutines::SetConsoleCursorInfoImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| size | `ULONG` | ○ | カーソルサイズ（1-100） |
| isVisible | `bool` | ○ | カーソルの表示/非表示 |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

#### 23. SetConsoleCursorPosition

カーソルの位置を設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleCursorPosition` |
| 実装ルーチン | `IApiRoutines::SetConsoleCursorPositionImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| position | `til::point` | ○ | カーソルの新しい位置 {X, Y} |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

### テキスト属性

#### 24. SetConsoleTextAttribute

デフォルトのテキスト属性（前景色・背景色）を設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleTextAttribute` |
| 実装ルーチン | `IApiRoutines::SetConsoleTextAttributeImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| attribute | `WORD` | ○ | テキスト属性値（前景4bit + 背景4bit） |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

### ウィンドウ管理

#### 25. GetLargestConsoleWindowSize

現在のフォントとディスプレイサイズに基づく最大ウィンドウサイズを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetLargestConsoleWindowSize` |
| 実装ルーチン | `IApiRoutines::GetLargestConsoleWindowSizeImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| size | `til::size` | 最大ウィンドウサイズ {Width, Height} |

---

#### 26. SetConsoleWindowInfo

コンソールウィンドウの表示範囲を設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleWindowInfo` |
| 実装ルーチン | `IApiRoutines::SetConsoleWindowInfoImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| isAbsolute | `bool` | ○ | 絶対座標指定か相対オフセットか |
| windowRect | `til::inclusive_rect` | ○ | ウィンドウの矩形範囲 |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

#### 27. GetConsoleWindow

コンソールウィンドウのHWNDハンドルを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleWindow` |
| 実装ルーチン | `IApiRoutines::GetConsoleWindowImpl` |
| レベル | L3 |
| 認証 | 不要 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| hwnd | `HWND` | コンソールウィンドウハンドル |

---

### タイトル管理

#### 28. GetConsoleTitle

コンソールウィンドウのタイトル文字列を取得する。オリジナルタイトル（起動時のタイトル）の取得もサポートする。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleTitle` |
| 実装ルーチン | `IApiRoutines::GetConsoleTitleAImpl` / `GetConsoleTitleWImpl` / `GetConsoleOriginalTitleAImpl` / `GetConsoleOriginalTitleWImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| title | `std::span<char>` / `std::span<wchar_t>` | ○ | タイトル文字列の格納先バッファ |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| written | `size_t` | 書き込まれたバイト/文字数 |
| needed | `size_t` | 必要なバッファサイズ（バッファが不足した場合） |

---

#### 29. SetConsoleTitle

コンソールウィンドウのタイトル文字列を設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleTitle` |
| 実装ルーチン | `IApiRoutines::SetConsoleTitleAImpl` / `SetConsoleTitleWImpl` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| title | `std::string_view` / `std::wstring_view` | ○ | 設定するタイトル文字列 |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

### 言語

#### 30. GetConsoleLangId

コンソールの言語IDを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleLangId` |
| 実装ルーチン | `IApiRoutines::GetConsoleLangIdImpl` |
| レベル | L1 |
| 認証 | 不要 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| langId | `LANGID` | 言語識別子 |

---

### 制御イベント

#### 31. GenerateConsoleCtrlEvent

Ctrl+C / Ctrl+Break等の制御イベントをコンソールに送信する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGenerateConsoleCtrlEvent` |
| レベル | L2 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| ctrlEvent | `DWORD` | ○ | 制御イベント種別（CTRL_C_EVENT, CTRL_BREAK_EVENT） |
| processGroupId | `DWORD` | ○ | 対象プロセスグループID（0=全プロセス） |

---

### マウス情報

#### 32. GetConsoleMouseInfo

コンソールに接続されたマウスのボタン数を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleMouseInfo` |
| 実装ルーチン | `IApiRoutines::GetNumberOfConsoleMouseButtonsImpl` |
| レベル | L3 |
| 認証 | 不要 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| buttons | `ULONG` | マウスのボタン数 |

---

### フォント管理

#### 33. GetConsoleFontSize

指定インデックスのフォントサイズを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleFontSize` |
| 実装ルーチン | `IApiRoutines::GetConsoleFontSizeImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `SCREEN_INFORMATION` | ○ | スクリーンバッファ |
| index | `DWORD` | ○ | フォントインデックス |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| size | `til::size` | フォントサイズ {Width, Height} |

---

#### 34. GetConsoleCurrentFont

現在のフォントの詳細情報を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleCurrentFont` |
| 実装ルーチン | `IApiRoutines::GetCurrentConsoleFontExImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `SCREEN_INFORMATION` | ○ | スクリーンバッファ |
| isForMaximumWindowSize | `bool` | ○ | 最大ウィンドウサイズ用のフォント情報を取得するか |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| consoleFontInfoEx | `CONSOLE_FONT_INFOEX` | フォント情報（インデックス、サイズ、ファミリー、ウェイト、フェイス名） |

---

#### 35. SetConsoleCurrentFont

現在のフォントを設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleCurrentFont` |
| 実装ルーチン | `IApiRoutines::SetCurrentConsoleFontExImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `IConsoleOutputObject` | ○ | 出力バッファハンドル |
| isForMaximumWindowSize | `bool` | ○ | 最大ウィンドウサイズ用 |
| consoleFontInfoEx | `CONSOLE_FONT_INFOEX` | ○ | 設定するフォント情報 |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

### 表示モード管理

#### 36. GetConsoleDisplayMode

現在の表示モードを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleDisplayMode` |
| 実装ルーチン | `IApiRoutines::GetConsoleDisplayModeImpl` |
| レベル | L3 |
| 認証 | 不要 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| flags | `ULONG` | 表示モードフラグ |

---

#### 37. SetConsoleDisplayMode

表示モードを設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleDisplayMode` |
| 実装ルーチン | `IApiRoutines::SetConsoleDisplayModeImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| context | `SCREEN_INFORMATION` | ○ | スクリーンバッファ |
| flags | `ULONG` | ○ | 設定する表示モードフラグ |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| newSize | `til::size` | 変更後のバッファサイズ |

---

### エイリアス管理

#### 38. AddConsoleAlias

コンソールエイリアス（コマンドのショートカット）を追加する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerAddConsoleAlias` |
| 実装ルーチン | `IApiRoutines::AddConsoleAliasAImpl` / `AddConsoleAliasWImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| source | `std::string_view` / `std::wstring_view` | ○ | エイリアス元の文字列 |
| target | `std::string_view` / `std::wstring_view` | ○ | エイリアス先の文字列（空文字列で削除） |
| exeName | `std::string_view` / `std::wstring_view` | ○ | 対象実行ファイル名 |

**レスポンス（成功時）**

ステータスコード: `S_OK`

---

#### 39. GetConsoleAlias

指定のエイリアスの展開先を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleAlias` |
| 実装ルーチン | `IApiRoutines::GetConsoleAliasAImpl` / `GetConsoleAliasWImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| source | `std::string_view` / `std::wstring_view` | ○ | エイリアス名 |
| target | `std::span<char>` / `std::span<wchar_t>` | ○ | 展開先の格納バッファ |
| exeName | `std::string_view` / `std::wstring_view` | ○ | 対象実行ファイル名 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| written | `size_t` | 書き込まれたバイト/文字数 |

---

#### 40. GetConsoleAliasesLength / GetConsoleAliases

指定実行ファイルの全エイリアス一覧と必要バッファサイズを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleAliasesLength` / `ServerGetConsoleAliases` |
| 実装ルーチン | `IApiRoutines::GetConsoleAliasesLengthAImpl` / `GetConsoleAliasesAImpl` 等 |
| レベル | L3 |
| 認証 | 不要 |

---

#### 41. GetConsoleAliasExesLength / GetConsoleAliasExes

エイリアスが定義されている実行ファイル一覧と必要バッファサイズを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleAliasExesLength` / `ServerGetConsoleAliasExes` |
| 実装ルーチン | `IApiRoutines::GetConsoleAliasExesLengthAImpl` / `GetConsoleAliasExesAImpl` 等 |
| レベル | L3 |
| 認証 | 不要 |

---

### コマンド履歴管理（CMDext Private API）

#### 42. ExpungeConsoleCommandHistory

指定実行ファイルのコマンド履歴を全消去する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerExpungeConsoleCommandHistory` |
| 実装ルーチン | `IApiRoutines::ExpungeConsoleCommandHistoryAImpl` / `ExpungeConsoleCommandHistoryWImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| exeName | `std::string_view` / `std::wstring_view` | ○ | 対象実行ファイル名 |

---

#### 43. SetConsoleNumberOfCommands

コマンド履歴バッファのサイズを設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerSetConsoleNumberOfCommands` |
| 実装ルーチン | `IApiRoutines::SetConsoleNumberOfCommandsAImpl` / `SetConsoleNumberOfCommandsWImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| exeName | `std::string_view` / `std::wstring_view` | ○ | 対象実行ファイル名 |
| numberOfCommands | `size_t` | ○ | 履歴バッファの最大コマンド数 |

---

#### 44. GetConsoleCommandHistoryLength / GetConsoleCommandHistory

コマンド履歴の必要バッファサイズと履歴データを取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleCommandHistoryLength` / `ServerGetConsoleCommandHistory` |
| 実装ルーチン | `IApiRoutines::GetConsoleCommandHistoryLengthAImpl` / `GetConsoleCommandHistoryAImpl` 等 |
| レベル | L3 |
| 認証 | 不要 |

---

### 選択情報

#### 45. GetConsoleSelectionInfo

現在のテキスト選択状態（選択範囲、選択モード）を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleSelectionInfo` |
| 実装ルーチン | `IApiRoutines::GetConsoleSelectionInfoImpl` |
| レベル | L3 |
| 認証 | 不要 |

**レスポンス（成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| consoleSelectionInfo | `CONSOLE_SELECTION_INFO` | 選択状態情報 |

---

### プロセス管理

#### 46. GetConsoleProcessList

コンソールにアタッチされているプロセスの一覧を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleProcessList` |
| レベル | L3 |
| 認証 | 不要 |

**レスポンス（成功時）**

プロセスIDの配列が返される。

---

### 履歴設定管理

#### 47. GetConsoleHistory / SetConsoleHistory

コンソール履歴の設定情報（バッファサイズ、バッファ数、重複排除フラグ）を取得/設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `ApiDispatchers::ServerGetConsoleHistory` / `ServerSetConsoleHistory` |
| 実装ルーチン | `IApiRoutines::GetConsoleHistoryInfoImpl` / `SetConsoleHistoryInfoImpl` |
| レベル | L3 |
| 認証 | 不要 |

**パラメータ（Set）**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| consoleHistoryInfo | `CONSOLE_HISTORY_INFO` | ○ | 履歴設定情報（バッファサイズ、バッファ数、フラグ） |

**レスポンス（Get - 成功時）**

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| consoleHistoryInfo | `CONSOLE_HISTORY_INFO` | 履歴設定情報 |

---

### I/Oディスパッチャーレベル操作

以下はAPIレベルではなく、I/Oディスパッチャーレベルで処理されるシステム操作である。

#### ConsoleHandleConnectionRequest

新規クライアントプロセスの接続要求を処理する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `IoDispatchers::ConsoleHandleConnectionRequest` |
| レベル | システム |

---

#### ConsoleCreateObject

新規コンソールオブジェクト（入力バッファ、出力バッファ、スクリーンバッファ）の作成要求を処理する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `IoDispatchers::ConsoleCreateObject` |
| レベル | システム |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| ObjectType | `CD_IO_OBJECT_TYPE_*` | ○ | 作成するオブジェクトの種別 |
| DesiredAccess | `DWORD` | ○ | アクセスモード（GENERIC_READ / GENERIC_WRITE） |
| ShareMode | `DWORD` | ○ | 共有モード |

---

#### ConsoleCloseObject

コンソールオブジェクトハンドルを閉じる。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `IoDispatchers::ConsoleCloseObject` |
| レベル | システム |

---

#### ConsoleClientDisconnectRoutine

クライアントプロセスの切断処理を行う。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| ディスパッチャー | `IoDispatchers::ConsoleClientDisconnectRoutine` |
| レベル | システム |

---

## 備考

### Unicode / ANSI バリアント

多くのAPIはANSI（A）とUnicode（W）の2つのバリアントを持つ。ディスパッチャーレベルで呼び出し元のモードに応じて適切なバリアントにルーティングされる。

- `*AImpl` - ANSI（マルチバイト）文字列を使用
- `*WImpl` - Unicode（ワイド文字列）を使用

### 互換性シム

`ConsoleShimPolicy` クラスにより、以下のアプリケーション固有の互換性処理が適用される:

- **cmd.exe**: `ScrollConsoleScreenBufferW` における `enableCmdShim` フラグ
- **PowerShell**: `FillConsoleOutputAttribute` における `enablePowershellShim` フラグ

### 待機キュー機構

入力読み取り等のブロッキング操作は `ConsoleWaitQueue` を介して非同期待機が行われる。

- `WaitBlock`: 個別の待機ブロック
- `WaitTerminationReason`: 待機終了理由（正常完了、タイムアウト、キャンセル等）
- `IWaitRoutine`: 待機完了時のコールバックインターフェース

### エントリポイント

サーバーの起動は `Entrypoints` 名前空間の以下のメソッドで行われる:

- `StartConsoleForServerHandle`: サーバーハンドルを受け取ってコンソールを起動
- `StartConsoleForCmdLine`: コマンドライン文字列からコンソールを起動

### デバイス通信

`IDeviceComm` インターフェースにより、コンソールドライバ（condrv）との通信が抽象化される:

- `ReadIo` / `CompleteIo`: I/O操作の読み取りと完了通知
- `ReadInput` / `WriteOutput`: 入出力データの転送
- `PutHandle` / `GetHandle`: ハンドルの登録と取得
- `AllowUIAccess`: UI操作の許可制御
