Advanced Windows 改訂第4版
Amazon.co.jpで買う
正誤情報
詳細情報
Advanced Windows 改訂第4版
Jeffrey Richter 著、株式会社ロングテール/長尾高弘 訳
価格:10,260円 (本体9,500円)
発売日:2001年5月29日
形態:B5変 (1,040ページ)
付属品:CD-ROM1枚(Windows98、2000対応)
ISBN:4-7561-3805-5 (978-4-7561-3805-7)
内容
サーバ機能のマルチスレッドプログラミングや、実際のアプリケーションにおける効率的な仮想記憶処理、ファイルシステム管理、同期/非同期処理のこなし方などを詳細に解説。Windows2000に完全対応。
目次
序 章

第 1 部 必読の基礎知識

第 1 章 エラー処理
1.1 プログラマも同じことができる
1.2 ErrorShow サンプル
第 2 章 Unicode
2.1 キャラクタセット
2.1.1 SBCS と DBCS
2.1.2 Unicode:ワイドバイトキャラクタセット
2.2 Unicode の重要性
2.3 Windows 2000 と Unicode
2.4 Windows 98 と Unicode
2.5 Windows CE と Unicode
2.6 スコア
2.7 COM について一言
2.8 Unicode ソースコードの書き方
2.8.1 C ランタイムライブラリの Unicode サポート
2.8.2 Windows が定義している Unicode データ型
2.8.3 Windows の Unicode、ANSI 関数
2.8.4 Windows の文字列関数
2.9 アプリケーションを ANSI と Unicode に対応させる
2.9.1 Windows の文字列関数
2.9.2 リソース
2.9.3 テキストファイル
2.9.4 Unicode 文字列と ANSI 文字列の変換
第 3 章 カーネルオブジェクト
3.1 カーネルオブジェクトとは何か
3.1.1 参照カウンタ
3.1.2 セキュリティ
3.2 プロセスのカーネルオブジェクトハンドルテーブル
3.2.1 カーネルオブジェクトの作成
3.2.2 カーネルオブジェクトのクローズ
3.3 複数のプロセスによるカーネルオブジェクトの共有
3.3.1 オブジェクトハンドルの継承
3.3.2 名前付きオブジェクト
3.3.3 オブジェクトハンドルの複製の作成

第 2 部 仕事をさせる

第 4 章 プロセス
4.1 初めて書く Windows アプリケーション
4.1.1 プロセスのインスタンスハンドル
4.1.2 プロセスの直前のインスタンスハンドル
4.1.3 プロセスのコマンドライン
4.1.4 プロセスの環境変数
4.1.5 プロセスのアフィニティ
4.1.6 プロセスのエラーモード
4.1.7 プロセスのカレントドライブ、ディレクトリ
4.1.8 システムのバージョン
4.2 CreateProcess 関数
4.2.1 pszApplicationName と pszCommandLine
4.2.2 psaProcess、psaThread、bInheritHandles
4.2.3 fdwCreate
4.2.4 pvEnvironment
4.2.5 pszCurDir
4.2.6 psiStartInfo
4.2.7 ppiProcInfo
4.3 プロセスの終了
4.3.1 主スレッドのエントリポイント関数のリターン
4.3.2 ExitProcess 関数
4.3.3 TerminateProcess 関数
4.3.4 すべてのスレッドの終了
4.3.5 プロセスの終了処理の内容
4.4 子プロセス
4.4.1 子プロセスのデタッチ
4.5 システム内で実行されているプロセスのリストアップ
4.5.1 ProcessInfo サンプル
第 5 章 ジョブ
5.1 ジョブ内プロセスへの制限の加え方
5.2 ジョブへのプロセスの追加
5.3 ジョブ内のすべてのプロセスの終了
5.4 ジョブの統計情報の取得
5.5 ジョブ通知
5.6 JobLab サンプル
第 6 章 スレッドの基礎
6.1 スレッドを作成するとよい場合
6.2 スレッドを作らないほうがよい場合
6.3 初めて書くスレッド関数
6.4 CreateThread 関数
6.4.1 psa
6.4.2 cbStack
6.4.3 pfnStartAddr と pvParam
6.4.4 fdwCreate
6.4.5 pdwThreadID
6.5 スレッドの終了
6.5.1 スレッド関数のリターン
6.5.2 ExitThread 関数
6.5.3 TerminateThread 関数
6.5.4 プロセス終了時
6.5.5 スレッド終了時
6.6 スレッドの内部構造
6.7 C/C++ランタイムライブラリについて考慮すべきこと
6.7.1 間違えて_beginthreadex の代わりに CreateThread を呼び出したら
6.7.2 呼び出してはならない C/C++ランタイムライブラリ関数
6.8 アイデンティティの発見
6.8.1 擬似ハンドルから実ハンドルへの変換
第 7 章 スレッドのスケジューリング、優先度、アフィニティ
7.1 スレッドの一時停止と実行再開
7.2 プロセスの一時停止と実行再開
7.3 スリープ
7.4 ほかのスレッドへの実行の切り替え
7.5 スレッドの実行時間
7.6 コンテキストをコンテキストに入れる
7.7 スレッドの優先度
7.8 優先度の抽象的な見方
7.9 優先度のプログラミング
7.9.1 スレッドの優先度のダイナミックなブースト
7.9.2 フォアグラウンドプロセスのためのスケジューラの操作
7.9.3 SchedulingLab サンプル
7.10 アフィニティ
第 8 章 ユーザーモードでのスレッド同期
8.1 アトミックなアクセス:Interlocked ファミリの関数
8.2 キャッシュライン
8.3 高度なスレッド同期
8.3.1 避けるべきテクニック
8.4 クリティカルセクション
8.4.1 クリティカルセクションのディテール
8.4.2 クリティカルセクションとスピンロック
8.4.3 クリティカルセクションとエラー処理
8.4.4 役に立つヒントとテクニック
第 9 章 カーネルオブジェクトを使ったスレッド同期
9.1 待機関数
9.2 待機の成功の副作用
9.3 イベントカーネルオブジェクト
9.3.1 Handshake サンプル
9.4 ウェイタブルタイマカーネルオブジェクト
9.4.1 ウェイタブルタイマに APC エントリをキューイングさせる
9.4.2 タイマのまとめ
9.5 セマフォカーネルオブジェクト
9.6 ミューテックスカーネルオブジェクト
9.6.1 放棄問題
9.6.2 ミューテックスとクリティカルセクションの比較
9.6.3 Queue サンプル
9.7 スレッド同期オブジェクトのクイックリファレンス
9.8 その他のスレッド同期関数
9.8.1 非同期デバイス入出力
9.8.2 WaitForInputIdle
9.8.3 MsgWaitForMultipleObjects(Ex)
9.8.4 WaitForDebugEvent
9.8.5 SignalObjectAndWait
第 10 章 スレッド同期ツールキット
10.1 クリティカルセクションの実装:オプテックス
10.1.1 Optex サンプル
10.2 マルチスレッド環境で安全に使えるデータ型と逆セマフォの作成
10.2.1 InterlockedType サンプル
10.3 シングルライタ/マルチリーダガード(SWMRG)問題
10.3.1 SWMRG サンプル
10.4 WaitForMultipleExpressions 関数の実装
10.4.1 WaitForMultipleExpressions サンプル
第 11 章 スレッドのプーリング
11.1 シナリオ 1:非同期関数実行のキューイング
11.2 シナリオ 2:周期的な関数呼び出し
11.2.1 TimedMsgBox サンプル
11.3 シナリオ 3:単一のカーネルオブジェクトがシグナル状態になったときの関数呼び出し
11.4 シナリオ 4:非同期入出力要求の処理が完了したときの関数呼び出し
第 12 章 ファイバ
12.1 ファイバの操作
12.1.1 Counter サンプル

第 3 部 メモリ管理

第 13 章 Windows のメモリアーキテクチャ
13.1 仮想アドレス空間
13.2 仮想アドレス空間はどのように分割されているか
13.2.1 NULL ポインタ代入パーティション(Windows 2000、Windows 98)
13.2.2 MS-DOS/16 ビット Windows アプリケーション互換パーティション(Windows 98 のみ)
13.2.3 ユーザーモードパーティション(Windows 2000、Windows 98)
13.2.4 64K バイトオフリミットパーティション(Windows 2000 のみ)
13.2.5 共有メモリマップトファイルパーティション(Windows 98 のみ)
13.2.6 カーネルモードパーティション(Windows 2000、Windows 98)
13.3 アドレス空間内の領域
13.4 領域への物理ストレージのコミット
13.5 物理ストレージとページファイル
13.5.1 ページングファイルが管理していない物理ストレージ
13.6 保護属性
13.6.1 コピーオンライトアクセス
13.6.2 特殊なアクセス保護属性フラグ
13.7 メモリ管理コンポーネントの相互関係
13.7.1 領域の内部
13.7.2 Windows 98 のアドレス空間
13.8 データアラインメントの重要性
第 14 章 仮想メモリの探究
14.1 システム情報
14.1.1 SysInfo サンプル
14.2 仮想メモリの状態
14.2.1 VMStat サンプル
14.3 アドレス空間の状態チェック
14.3.1 VMQuery 関数
14.3.2 仮想メモリマップサンプルアプリケーション
第 15 章 アプリケーションでの仮想メモリの活用方法
15.1 アドレス空間内の領域の予約
15.2 予約済み領域へのストレージのコミット
15.3 領域の予約とメモリのコミットの同時処理
15.4 物理ストレージをコミットすべきタイミング
15.5 予約済み領域の解放
15.5.1 物理ストレージのコミットを解除すべきタイミング
15.5.2 VMAlloc サンプル
15.6 保護属性の変更
15.7 物理ストレージの内容のリセット
15.7.1 MemReset サンプル
15.8 AWE(Windows 2000 のみ)
15.8.1 AWE サンプル
第 16 章 スレッドのスタック
16.1 Windows 98 のスタック
16.2 C ランタイムライブラリのスタックチェック関数
16.3 Summation サンプル
第 17 章 メモリマップトファイル
17.1 .exe、DLL のメモリへのマッピング
17.1.1 静的データは.exe、DLL の複数のインスタンスの間で共有されない
17.1.2 .exe、DLL の複数のインスタンスの間での静的データの共有
17.1.3 AppInst サンプル
17.2 データファイルのメモリへのマッピング
17.2.1 方法 1:ファイル 1 つ、バッファ 1 つ
17.2.2 方法 2:ファイル 2 つ、バッファ 1 つ
17.2.3 方法 3:ファイル 1 つ、バッファ 2 つ
17.2.4 方法 4:ファイル 1 つ、バッファなし
17.3 メモリマップトファイルの使い方
17.3.1 ステップ 1:ファイルカーネルオブジェクトの作成、オープン
17.3.2 ステップ 2:ファイルマッピングカーネルオブジェクトの作成
17.3.3 ステップ 3:ファイルデータのプロセスのアドレッシング空間へのマッピング
17.3.4 ステップ 4:プロセスのアドレス空間からのファイルデータのマッピング解除
17.3.5 ステップ 5 と 6:ファイルマッピングオブジェクトとファイルのクローズ
17.3.6 FileRev サンプル
17.4 メモリマップトファイルを使った巨大ファイルの操作
17.5 メモリマップトファイルと一貫性
17.6 メモリマップトファイルの先頭アドレスの指定
17.7 メモリマップトファイルの実装の細部
17.8 メモリマップトファイルを使ったプロセス間でのデータ共有
17.9 ページングファイルによって支持されたメモリマップトファイル
17.9.1 MMFShare サンプル
17.10 切れ切れにコミットされたメモリマップトファイル
17.10.1 MMFSparse サンプル
第 18 章 ヒープ
18.1 プロセスのデフォルトヒープ
18.2 非デフォルトヒープを作成すべき理由
18.2.1 コンポーネントの保護
18.2.2 効率的なメモリアクセス
18.2.3 アクセスの局所化
18.2.4 スレッド同期オーバーヘッドの回避
18.2.5 高速解放
18.3 非デフォルトヒープの作り方
18.3.1 ヒープからのメモリの確保
18.3.2 ブロックのサイズ変更
18.3.3 ブロックサイズの取得
18.3.4 ブロックの解放
18.3.5 ヒープの破棄
18.3.6 C++でのヒープの使い方
18.4 その他のヒープ関数

第 4 部 DLL

第 19 章 DLL の基礎
19.1 DLL とプロセスのアドレス空間
19.2 全体の構図
19.3 DLL モジュールのビルド
19.3.1 エクスポートの本当の意味
19.3.2 Visual C++以外のツールと共存できる DLL の作り方
19.4 .exe モジュールのビルド
19.4.1 インポートの本当の意味
19.5 .exe モジュールの実行
第 20 章 DLL の高度なテクニック
20.1 明示的な DLL モジュールのロードとシンボルのリンク
20.1.1 DLL モジュールの明示的なロード
20.1.2 DLL モジュールの明示的なアンロード
20.1.3 エクスポートシンボルへの明示的なリンク
20.2 DLL のエントリポイント関数
20.2.1 DLL_PROCESS_ATTACH 通知
20.2.2 DLL_PROCESS_DETACH 通知
20.2.3 DLL_THREAD_ATTACH 通知
20.2.4 DLL_THREAD_DETACH 通知
20.2.5 DllMain 呼び出しのシリアライズの仕組み
20.2.6 DllMain と C/C++ランタイムライブラリ
20.3 DLL ロードの先延ばし
20.3.1 DelayLoadApp サンプル
20.4 呼び出し転送エントリ
20.5 既知の DLL
20.6 DLL のリダイレクト
20.7 モジュールの先頭アドレスの調整
20.8 モジュールのバインド
第 21 章 TLS
21.1 ダイナミック TLS
21.1.1 ダイナミック TLS の使い方
21.2 スタティック TLS
第 22 章 DLL の注入と API フック
22.1 DLL の注入:例
22.2 レジストリを使った DLL の注入
22.3 Windows フックを使った DLL の注入
22.3.1 DIPS(デスクトップアイテム位置保存)サンプル
22.4 リモートスレッドを使った DLL の注入
22.4.1 InjLib サンプル
22.4.2 ImgWalk DLL
22.5 トロイの木馬 DLL を使った DLL の注入
22.6 デバッガとしての DLL の注入
22.7 メモリマップトファイルを使ったコードの注入(Windows 98 のみ)
22.8 CreateProcess を使ったコードの注入
22.9 API フック:例
22.9.1 コードの上書きによる API フック
22.9.2 モジュールのインポートセクションの操作による API フック
22.9.3 LastMsgBoxInfo サンプル

第 5 部 構造化例外処理

第 23 章 終了ハンドラ
23.1 終了ハンドラのコード例
23.1.1 Funcenstein1
23.1.2 Funcenstein2
23.1.3 Funcenstein3
23.1.4 Funcfurter1
23.1.5 クイズの時間:FuncaDoodleDoo
23.1.6 Funcenstein4
23.1.7 Funcarama1
23.1.8 Funcarama2
23.1.9 Funcarama3
23.1.10 Funcarama4:最終バージョン
23.1.11 finally ブロックについての注意
23.1.12 Funcfurter2
23.1.13 SEHTerm サンプル
第 24 章 例外ハンドラとソフトウェア例外
24.1 例外フィルタ、ハンドラのコード例
24.1.1 Funcmeister1
24.1.2 Funcmeister2
24.2 EXCEPTION_EXECUTE_HANDLER
24.2.1 いくつかの役に立つ例
24.2.2 グローバルアンワインド
24.2.3 グローバルアンワインドの中止
24.3 EXCEPTION_CONTINUE_EXECUTION
24.3.1 EXCEPTION_CONTINUE_EXECUTION を使う場合の注意
24.4 EXCEPTION_CONTINUE_SEARCH
24.5 GetExceptionCode
24.5.1 メモリ関連の例外
24.5.2 例外関連の例外
24.5.3 デバッグ関連の例外
24.5.4 整数関連の例外
24.5.5 浮動小数点数関連の例外
24.6 GetExceptionInformation
24.7 ソフトウェア例外
第 25 章 未処理例外と C++例外
25.1 その場ですぐにデバッグ
25.2 例外メッセージボックスの消去
25.2.1 プロセスの強制終了
25.2.2 スレッド関数のラップ
25.2.3 すべてのスレッド関数のラップ
25.2.4 デバッガの自動起動
25.3 UnhandledExceptionFilter をプログラムから呼び出す
25.4 UnhandledExceptionFilter の内部構造
25.5 例外とデバッガ
25.5.1 Spreadsheet サンプル
25.6 C++例外と構造化例外
25.6.1 C++を使った構造化例外のキャッチ

第 6 部 ウィンドウシステム

第 26 章 ウィンドウメッセージ
26.1 スレッドのメッセージキュー
26.2 スレッドのメッセージキューへのメッセージのポスト
26.3 ウィンドウへのメッセージの送出
26.4 スレッドを起こす
26.4.1 キューステータスフラグ
26.4.2 スレッドのメッセージキューからメッセージを抜き出すためのアルゴリズム
26.4.3 カーネルオブジェクトやキューステータスフラグを使ってスレッドを起こす方法
26.5 メッセージによるデータの送信
26.5.1 CopyData サンプル
26.6 ウィンドウによる ANSI/Unicode 文字/文字列の処理方法
第 27 章 ハードウェア入力モデルとローカル入力状態
27.1 RIT
27.2 ローカル入力状態
27.2.1 キーボード入力とフォーカス
27.2.2 マウスカーソルの管理
27.3 VIQ とローカル入力状態の統合
27.3.1 LISLab(ローカル入力状態研究)サンプル
27.3.2 LISWatch(ローカル入力状態監視)サンプル

付録 A ビルド環境
A.1 CmnHdr.h ヘッダファイル
付録 B メッセージクラッカー、コントロールマクロ、API マクロ
B.1 メッセージクラッカー
B.2 コントロールマクロ
B.3 API マクロ

索 引


戻る
©KADOKAWA CORPORATION 2015