書籍をつつく11-Advanced Windows 改訂第4版。正しくバイブル・ピヨ♪2008-09-10 Wed 19:30
プログラミングWindowsを紹介したら、この書籍も紹介しないわけにはいかないピヨ♪
Advanced Windows 改訂第4版 この書籍は文句なしの名著でプログラミングWindowsと併読するべき本ピヨ♪ 本を選ぶ時は目次から。目次を見てみよう。 【目次】 序 章 第 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 マクロ 索 引 さて、この書籍を読んだ人は大概名著というわけから書くピヨ。理由はこの書籍程OSに近い部分をプログラミングできる本がないからんだよ。もちろん、デバイスドラバの本も深いけど、この書籍はデバイスドライバとは違う深さがあるんだ。みんなは、UNIX系ハッカーが凄いと思ったことない?その凄さの源は色々あるけど、その理由のひとつとしてOSに近い部部を知っているという事があると思うんだ。 .NET時代に時代錯誤だという人が居ると思うけど、料理の材料を知らない料理人が一流になれるだろうか?それを考えれば、何故OSに近い知識が必要なのかは伝わると思う。Windowsは残念ながら、UNIX系OSの様とは違い深い場所を探らせないようになっているから、余計にこういった情報は必要ピヨ。 もっとズバリ言えば、プロと名乗りたければこの書籍は必須ピヨ。その証拠に、Linux系プログラミングの書籍を見てごらん。システムコールの説明が必ずあるよね?それから考えると、正直言ってWindows系プログラマの質が劣りがちだと思うピヨ。もちろん、Windowsにもハッカーが居るけど、間違いなくこの書籍ぐらいは読んでいると思う。OSのAPIを知らないハッカーなんて聞いたことがないからね。それに、この書籍はハッカーレベルの入り口に過ぎない。プロが皆ハッカーでなくてもいいけど、入り口ぐらいはおさえておこう。プロ意識があるのならばそれぐらいはするべきだとボクは思うね! ※これはあくまでも一般論であって、立場上当てはまらない人もいます。そういった例外は本人が一番把握している筈だよね。 |
この記事のコメント |
コメントの投稿 |
||
|
|
||
| 管理者だけに閲覧 | ||
|
|
||
この記事のトラックバック |
|
| 無差別に技術をついばむ鳥 |
|