Windows ゲーム開発 ® Kev Gee Software Design Engineer Windows Gaming & Graphics Technologies Microsoft Corporation Agenda Windows XP オペレーティング システムで正しく 動作させる方法 Windows ネットワークで正しく動作させる方法 Agenda Windows XP オペレーティング システムで正しく 動作させる方法 複数ユーザーと制限ユーザー アプリケーションの互換性 ドライバ Windows エラー レポート パッチ ゲーマーは Windows XP を使う Windows XP が主流のオペレーティング システム XP を基本ターゲットとすべき 開発機を顧客のPCと同じ方法で構成することは通 常ない 開発機は一般に 単一ユーザー 管理者特権 ドメインに接続 XP & 複数ユーザー 80% 以上のユーザーが他の家族と1台のコンピュー タを共有 制限ユーザー アカウント (LUA) の場合が多い 簡易ユーザー切り替え 複数ユーザーが同時にプログラムを実行している可能性がある ドメインに接続しているとこれは無効になる 制限ユーザー NTFS デバイスはいくつかのディレクトリへのアクセ スを制限あるいはブロックする すべての OEM インストールでデフォルト 制限ユーザーは以下に書き込めない HKEY_LOCAL_MACHINE レジストリ下 以下を除く全てのハードデバイス All Users と現在のユーザーの「My Document」 All Users と現在のユーザーの Application Data 制限ユーザーは、いくつかのディレクトリ / レジスト リ配下の読み込みや検索を制限される ゲームをどこにインストールするか? デフォルトでは “All Users” にインストール ユーザーインストールには、管理者特権が必要 これは、ゲームの実行に管理者特権が必要なことを意味するのでは ない デフォルトでは Program Files フォルダにインス トール これは必ずしも “C:\Program Files” ではない! このディレクトリは、ゲーム実行中は 読み取り専用 の場合が 多い アプリケーションが生成したデータを どこに置くか? ユーザーが直接そのデータをロード / 閲覧 / 変更 しないなら、 PC 単位のデータ (ex.システム構成) のとき、 All Users “Application Data” ディレクトリを使う ユーザー単位のデータ (ex.キーボード バインディング) の とき 現在のユーザーの“Application Data” ディレクトリを使う アプリケーションが生成したデータを どこに置くか? ユーザーが直接そのデータをロード / 閲覧 / 変更 するなら、 そのアプリケーションとファイルを確実に関連付ける これを行う最も簡単な方法については、サンプルコードを参照 それ以外に、商用インストーラを使ってもよい 全てのユーザーがそのデータを見るなら(ex.スクリーン ショットや共有カスタム「マップ」) 、 All Users “Documents” ディレクトリ下を使う 現在のユーザー専用のデータなら(ex. ゲームのセーブ) 、 現在のユーザーの “My Documents” ディレクトリ下を使う SHGetFolderPath( ) 以下は全て 9x および将来の OS でも動作する CSIDL_COMMON_ DOCUMENTS C:\Documents and Settings \username \Local Settings\ApplicationData C:\Documents and Settings\All Users \Application Data C:\Documents and Settings\username \My Documents C:\Documents and Settings\All Users \Documents CSIDL_PROGRAM_FILES C:\Program Files CSIDL_PROGRAM_FILES_CO MMON C:\Program Files\Common CSIDL_LOCAL_APPDATA CSIDL_COMMON_ APPDATA CSIDL_PERSONAL 本当に、実行してください… セキュリティは大きな問題なので、最低限の リソース許可しか与えないことが重要な戦略 “Documents and Settings” 下を正しく使うこと が、新しいシステムに移行したときユーザーがデー タを失わないことを意味する 将来のバージョンの Windows は、ゲームの実行 に「管理者」を必要とするアプローチを取らせないだ ろう! タスク切り替えと簡易ユーザー切り替え 消失したデバイスの正しい扱いは、両方を正しく処 理することで、完成する 簡易ユーザー切り替えは顧客の XP セットアップで よく使われ、いくつかの伝統的な「トリック」はうまく いかない 複数タスク 消失デバイスの扱い Present() と Reset() からの戻りコード D3DERR_DEVICELOST HRESULT hRes = g_pD3ddev->Present(NULL, NULL, NULL, NULL); while(hRes == D3DERR_DEVICELOST) { while(hRes != D3DERR_DEVICENOTRESET) { Sleep(1000); hRes = g_pD3ddev->TestCooperativeLevel(); } hRes = g_pD3ddev->Reset(&d3dpp); if(FAILED(hRes)) hRes = D3DERR_DEVICELOST; } 複数タスク 良き市民であれ 現在のデスクトップで、アプリケーションがアクティブでは ないとき: プロセッサの使用を最低限に ディスプレイを更新しない サウンドを鳴らさない この状態がかなり長時間続いても大丈夫なようにする 複数ユーザー 別のアプリケーション インスタンス FindWindow(Ex) はセッションを越えては機能しない グローバルに発見したとき、このセッションにそのインスタンスがあるかど うかをチェックするときに使う アプリケーションがすでに他のセッションで実行中かど うかの検出に Mutex を使ってもよい 前のインスタンスに切り替えるだけではだめ、別のセッ ション内にあるかもしれない Appendix を参照 複数ユーザー 簡易ユーザー切り替え WTSRegisterSessionNotification() ローカルとリモート両方の、セッションの接続と離脱を通知 フォーカスだけではなく、セッション全体がいつ消失したかを知るのに 役立つ アクティブなネットワーク ゲーム内での、リソースの開放や状態の変 更にも使える セッション切り替えの発生を止めてはならない メッセージを受け取るまでに、おそらくイベントは発生してしまっている 複数ユーザー Windows セッション切り替え フルスクリーンの DirectDraw® や Direct3D® のタ イトルは簡易ユーザー切り替えを許可しないだろう しかしタスク切り替え後に、ユーザーが簡易ユーザー切り 替えを行う場合がある ユーザーがリモートでデスクトップに接続して、他のユー ザーのデスクトップ セッションを引き落とす場合がある Appendix を参照 システム コードによるスタック消費の増加 システムはより多くのスタック空間を使用 小さなスタックしか割り当てていないアプリケーショ ンはクラッシュするかもしれない 以下のオプションをチェックし、(なるべく) 削除する か修正すること /STACK – リンカ オプション STACKSIZE - .DEF ファイル /F – コンパイラ オプション メッセージの順序 ある固有の順序で送付される Windows メッセージ に依存しないこと 新しいスレッド スケジューラがバグを露出させる Windows ではメッセージは非同期オブジェクト これについてはWin32 非同期オブジェクトを使うこと WaitForSingleObject() WaitForMultipleObjects() XP メモリ割り当て Windows 9x アロケータは、XP のようにはメモリ バグを検出しない XP SP2 はメモリ ページに関するより強力な セキュリティ特権を利用 NX “No Execute” 実行コードには EXECUTE 特権が必要 データ実行保護 (DEP: Data Execution Protection) を有効にした とき、 アプリケーションがこのアクセス保護違反を起こすと XP SP2 は警告ダイアログを表示する 全PC用にソフトウェアで実装 将来の CPU はこれをハードウェアで実施 AMD64 ではすでに可能 ネイティブ モード スクリプト言語と自己修正コードに発行! XP メモリー保護 デフォルトでは… コード セグメントは EXECUTE_READ データ セグメントは READ と READWRITE の混合 スタック・ヒープは READWRITE 別の保護属性を持つメモリー割り当てを行うには、 VirtualAlloc() API を使わなければならない XP メモリ保護 VirtualAlloc( ) MEM_RESERVE アドレス空間内の領域にメモリを確保 物理的ストレージをコミットするわけではない MEM_COMMIT 物理的ストレージをコミット MEM_RESERVE と共に使う ページ保護属性を指定 自動的にページ境界を丸める VirtualFree( ) で開放 XP メモリ保護 VirtualProtect( ) ページ保護属性を変更 コミットしたページのみで動作 ネイティブ コード スクリプトでは、READWRITE を使って設定してか ら、実行用に EXECUTE に切り替えよう EXECUTE_READWRITE はセキュリティ バグを招く可能性がある! データについては、 READWRITE を使って設定してから、内容を修正 する必要がなければ、READ に切り替え システムによる最適化が可能 危険なメモリ バグの追跡に役立つ Windows XP 互換性 アプリケーション互換性ツールキット ホワイトペーパーとドキュメント 共通の互換性問題をリスト アプリケーション内の問題を見つけるためのテスト チェックリスト アプリケーションをテストするためのユーティリティ アプリケーション検証ソフト ヒープテストなど どこでそのツールキットを得るのか? http://msdn.microsoft.com/compatibility ドライバ & WHQL ドライバの品質はナンバー1のユーザー問題 これについては IHV と一緒に努力しています 開始時に WHQL フラグをチェックしてください D3DENUM_WHQL_LEVEL を使って IDirect3D9::GetAdapterIdentifier() を呼び出す ワーカースレッドで行うのが一番よい、これはサーバーに対して チェック完了の認証を要求する 認証されていなければ、ユーザーに警告してください Windows Update にそれを送るよう提案してください WHQL をより良くするよう作業しています Windows エラー レポート (WER) 前提条件 皆さんのバイナリを Verisign ID でサイン 実行ファイルと DLL に有効バージョン情報をビルド 各リリース版にシンボルファイルを収容 なぜそれを使うべきか? 最も多くクラッシュを起こす上位の問題を容易に識別 顧客と共にループを閉じることが可能になる WER Logistics クラッシュしたときダイアログを出したくないときは どうする? SetUnhandledExceptionFilter() を使って例外を捕獲 可能ならそれを処理 できなければ、 それを再度投じるか、FaultReport() API を 使って、その例外を戻す データの取得方法は? WER サイトへのアクセスについては、Evangelist にコ ンタクトするか、 [email protected] にメールしてください WER サイト パッチ Windows Installer テクノロジ (MSI) は、パッチの作成と 適用を援助します Background Intelligence Transfer System (BITS) サポート ユーザーのバンド幅があいているときにだけ、少しづつダウンロード 自動再開に注意 両方のシステムを使うことで、パッチ適用の痛みをユーザーから取り除く MSI 3.0 は LUA パッチについて Verisign 署名を必要とす る ホワイトペーパーと優れた実践については http://msdn.microsoft.com/directx お願いしたいこと ! 制限ユーザー アカウント (LUA: Limited User Accounts) を使って実行してください ゲームによって、ユーザーのシステムを危険にさらさないように! 安全なアカウントを使って開発してください Home, Professional, Media Center Edition でテストして ください 32 ビットと 64 ビット両方のハードウェアを含む ビルド プロセスへのバージョン、コード サイン、シンボル収容 を統合してください Application Compatibility Toolkit にあるツールを使ってく ださい Agenda Windows XP オペレーティング システムで正しく 動作させる方法 Windows ネットワークで正しく動作させる方法 Agenda Windows ネットワークで正しく動作させる方法 概要 インターネット接続ファイアウォール Windows ファイアウォール (XP SP2) 良い知らせ 世界中がつながりつつある: 顧客は複数の PC を購入し、ネットワークに一緒につな いでいる ワイヤレス アクセスが著しく拡大している ブロードバンドがワールドワイドでさらに一般的になって いる インターネットはますます日常生活の一部になっている マルチプレーヤ ゲームについて潜在的なマーケッ トが成長している 悪い知らせ インターネットをベースとした脅威がより一般的に: Slammer, Blaster, Sobig, Mydoom, etc. End-to-end 接続が崩壊: ネットワーク アドレス転送 (NAT) が広くネットワークに 展開 ファイアウォールがさらに一般的になっている 通常、アプリケーションはこれらの状況をシームレスに 扱うようには設計されていない Microsoft の取り組み “Protect your PC” イニシアティブ http://www.microsoft.com/japan/security/protect ステップ バイ ステップの指示・ビデオ・スクリプトにより、 システム上のファイアウォールを利用可能に ファイアウォールとアンチビールス (試用版) の無償 CD そして、さらに… Windows XP Service Pack 2. デフォルトで有効なファイアウォールを含む その関連性 エンドポイント間のオープンな接続は例外となるだろう Windows ファイアウォールは広く展開されるだろう: Windows XP SP2 ではデフォルトで有効 使いやすく構成しやすい Windows ファイアウォールのサポートはゲームに 価値を付加する ユーザーは楽しむことに集中できる サポートコストの削減 ユーザーに「安全」を選ぶか「楽しむ」を選ぶかの選 択をさせずに済む ! なぜファイアウォールか ? ファイアウォールはネットワーク ベースの侵入に対 するバリアを提供: 要求しないのに入ってくるトラフィックをブロック システムをインターネット上でほとんど見えなくする (ICMP 要求を拒否) 無効なパケットをブロック 脆弱性となるバグがあろうと、システムを保護する どのように動作するのか ? ネットワーク トラフィックを遮断し、パケット フィルタ を提供: パケットの内容を使って、パケットを落とすべきか転送す べきかを決定 入と出のトラフィックをチェック 不正なパケットは拒否 ステートフル パケット フィルタ : フィルタ決定のために、接続をモニターし、コンテキスト (状態) を提供する 動作するものと動作しないもの デフォルトで動作するのは: 外への TCP 接続 外への UDP トラフックに対する適時応答 デフォルトで動作しないのは : 要求していない外からの TCP 接続 適時ではない、要求していない外からの UDP トラフィック ICMP トラフィック i.e. tracert と ping は動作しない マルチプレーヤ アーキテクチャ 一般に、マルチプレーヤ ゲームは以下の3つの アーキテクチャのうちの1つ : ピア ツー ピア: 全ての参加者が互いに直接接続 クライアント / サーバー: 全ての参加者が中央サーバー に接続 大規模マルチプレーヤ (MMP): 全ての参加者がデータ センターに接続 自分のゲームへの影響は ? 以下のものは、追加設定をしないと動作しない: ゲーム ホスト、どんなアーキテクチャを使っていても ピア ツー ピア セッションを使う全ての参加者 以下のものは、サーバーを正しく設定するか、明確 なら動作する: クライアント サーバー セッション、TCP による MMP、連 続的な UDP トラフィック インターネット接続ファイアウォール (ICF) 現在のファイア ウォール 概要 インターネット接続ファイアウォール (ICF): SP2 以前の Windows XP で利用可能 Windows Server™ 2003 で利用可能 デフォルトでは無効に ステートフル パケット フィルタを持つソフトウェア ファイ ア ウォール 構成は接続単位ベースで IPv4 をサポート “Advanced Networking Pack” がインストールされていると、 IPv6 をサポート サードパーティ ネットワーク スタックはサポートしない INetSharingManager INetSharingManager は以下を装備: ファイアウォールの制御 ポートマッピングの管理 Windows XP だけで利用可能 IPv4 ファイアウォール制御のみ IPv6 については INetFwV6Mgr を参照 推奨 推奨する実践: 既存のアプリケーションの場合、ウェブサイトで使い方を 提供 オプションとして、アプリケーション内でサポートを提供 ユーザーがファイアウォールを無効にすることは推奨し ない 新しい Windows ファイアウォールになって… Windows ファイアウォール XP SP2 内の拡張したファイアウォール 概要 Windows ファイアウォール: Windows XP SP2 (全 SKU) で利用可能 Windows Server SP1 で利用可能 デフォルトで有効 ステートフル パケット フィルタを持つソフトウェア ファイ アウォール 構成はグローバル IPv4 と IPv6 をサポート サードパーティ ネットワーク スタックをサポート Windows ファイアウォール 新しいセキュリティ機能: システムのブート時保護 “例外を許可しない” モードは、外からの要求しないパ ケットを全てブロック ローカル サブネットや指定したアドレスへのオープン ポートを制限できる これを使った開発がより容易に: アプリケーションの容易な構成を提供する例外リスト 全く新しい API Windows ファイアウォール ICF より使いやすい: 改善した UI 例外リスト上にないアプリケーションに対する自動ポップ アップ 新しいセキュリティ センター経由で露出 リモート アシスタンス、リモート デスクトップ、UPnP、ファ イルと印刷共有は、システム上で有効にしてから許可 ステートフル パケット フィルタ ステートフル パケット フィルタは、アクティブな接続 のリストを維持する: 外へ出るトラフィックが (それが存在しないとき) 新しいエ ントリを生成 外へ出るトラフィックのターゲットからの応答を許可する (要求したトラフィック) UDP 接続は、休止時間 (およそ 90 秒) 後にタイムアウト リストは必ずアダプタ単位で作成 追加の保護 パケット完全性評価: 偽造ソースアドレスを持つ外へ出るパケットを落とす 無効なフラグを持つ外から入るパケットを拒否 TCP 3way接続プロセスの強制 ICMP パケットはデフォルトで拒否: コンピュータは tracert と ping では見えない 新しい Windows ファイアウォール UI より見やすく コントロールパネル → Windows ファイアウォ-ル セキュリティ センター → Windows ファイアウォール ファイアウォールがないと、 ユーザーに通知 例外リスト ファイアウォール経由で受信するように設定された アプリケーションのグローバル リスト 完全に制限されたパスで権限を持つ 例外リスト上のアプリケーションは2つの状態のいず れかにある: 許可 –外から入る要求しないトラフィックが可能 2. 許可しない –外から入る要求しないトラフックを防止 1. 許可アプリケーション アプリケーションがファイアウォール内に自動的に 穴を開けることを許可: そのアプリケーションがソケットを開けている限り、その 穴は維持される アプリケーションが異常終了すると、その穴は自動的に 閉じる 管理者だけがリストに追加できる 設定したアプリケーションは制限ユーザーで動作する 例外リストへの追加 次のようにアプリケーションを例外リストに追加す る: ポップアップ ダイアログ経由でユーザーが選択 2. アプリケーションが API 経由で 3. ユーザー設定経由で 1. デフォルトでは、例外リスト内に認定されたアプリ ケーションはない リモート アシスタンス、リモート デスクトップ、IPnP、ファ イルと印刷の共有は、可能なら、例外リスト内に自分自 身を認可する 例外リスト UI リップル ランチャーの扱い ネットワークを必要とする実行ファイルを認可する必 要がある: リップル ランチャーではなく、リップル ランチャーが起動 するアプリケーションをリストする必要がある、 第二実行ファイルを起動するコピー保護を使っているなら、 その第二実行ファイルを認可 Windows ファイアウォール ポップアップ アプリケーションが例外リスト内にないと、 ポップアップ ウィンドウを表示 アプリケーションがネットワークを使い始めると、 アクティブになる: TCP: accept() 呼び出し UDP: 非ゼロのポートを持つ bind() ダイアログの許可オプションを使えるのは、管理者 だけ Windows ファイアウォール ポップアップ フルスクリーン Direct3D プリケーションを検出しない限り、 システム形態 バージョン リソース経由でアプリケーションについてフレンド リ情報を取得しようとする 実行ごと、アプリケーションごとに、1つのダイアログ ユーザーは「ブロックする」、「ブロックを解除する」、「後で確 認する」を選択 後で確認する = このアプリケーションのこの実行では拒否 このダイアログはブロックできない Windows ファイアウォール ポップアップ Windows ファイアウォールの検出方法 INetFwMgr を使って検出: 1. 2. 3. 4. NetFwMgr オブジェクトを CoCreateInstance する、 これが失敗したらシステムは XPSP2 ではない INetFwMgr::LocalPolicy を呼び出して、 INetFwPolicy インターフェイスを取得 INetFwPolicy::CurrentProfile を呼び出して、 INetFwProfile インターフェイスを取得 INetFwProfile::FirewallEnabled の値をチェック アプリケーションの追加方法 INetFwMgr は、例外リスト全体のプログラム的な制御を提 供。使い方は: 1. 2. 3. 4. NetFwMgr オブジェクトを CoCreateInstance する、 これが失敗したら XPSP2 ではない INetFwMgr::LocalPolicy を呼び出して、 INetFwPolicy インターフェイスを取得 INetFwPolicy::CurrentProfile を呼び出して、 INetFwProfile インターフェイスを取得 INetFwProfile::AuthorizedApplications を使って、 INetFwAuthorizedApplications インターフェイスを取得 アプリケーションの追加方法 (2) 新しい NetFwAuthorizedApplication オブジェクトを CoCreateInstance し、プロパティを設定 6. INetFwAuthorizedApplications::Add 経由で、新し いアプリケーションを追加 5. アプリケーションの削除方法 INetFwMgr は例外リスト全体のプログラム的な制 御を提供、使い方は: 1. 「アプリケーションの追加方法」の 1-4 に続いて 2. INetFwAuthorizedApplications::Remove を使って アプリケーションを削除 “例外を許可しない” モード ファイアウォールが “例外を許可しない” モードに なっているかどうかを検出するには: NetFwMgr オブジェクトを CoCreateInstance する、こ れが失敗したら、XPSP2 ではない 2. INetFwMgr::LocalPolicy を呼び出して、 INetFwPolicy インターフェイスを取得 3. INetFwPolicy::CurrentProfile を呼び出して、 INetFwProfile インターフェイスを取得 4. INetFwProfile::ExceptionsNotAllowed の値を チェック 1. ログ Windows ファイアウォールはその実行ログを提供 できる: デフォルトでは無効 統合ログに IPv6 と IPv4 デフォルトでは c:\windows\pfirewall.log ログファイルのヘッダにファイル フォーマットが説明され ている UDP ポート ゼロ バインディング ポート 0 に bind() した UDP ソケットは ファイアウォールに穴をあけない: たとえアプリケーションが許可しても これは「クライアント」動作だとみなされる サーバーかピアツーピアの場合だけの問題 DirectPlay の更新 XP SP2 では DirectPlay 4/8 を更新: アプリケーションは自分自身を例外リストに追加しなけ ればならない DPLAYSVR/DPNSVR はデフォルトでは例外リス ト内にない: アプリケーションは例外リストに自分でそれを追加しなけ ればならない 推奨 ユーザーにとってファイアウォールをシームレスにする: インストール中にアプリケーションを例外リストに追加し、 追加していることをユーザーに知らせる ! アンインストール中にアプリケーションを例外リストから取り除く ネットワークを使わないなら、ネットワーク機能を無効にする: “例外なし” モードを有効に アプリケーションを”ブロックする”に 既存のアプリケーションの場合、手順指示をウェブサイトか パッチで提供してください お願いしたいこと Windows ファイアウォールはすでに使われ始めてい ます: ファイアウォールを有効にしているユーザーをサポートして ください それを無効にしてほしいとユーザーに告げないでください ! アプリケーションに Windows ファイアウォールを理解させ てください 使わないときはマルチプレーヤ機能を無効にしてください Windows ファイアウォールを有効にしてテストしてください ユーザーが「安全」かつ「楽しむ」ようにしてください ! 詳細情報 Microsoft “Protect Your PC”: http://www.microsoft.com/japan/security/protect/ 以前のファイアウォール (ICF) の概要: http://www.microsoft.com/technet/prodtechnol/winx ppro/plan/icf.mspx ファイアウォール ログ情報: http://www.microsoft.com/windowsxp/home/using/productdoc/ en/default.asp?url=/WINDOWSXP/home/using/productdoc/en/h nw_firewall_log_understanding.asp 詳細情報 Windows XP SP2 開発者向け概要: http://www.microsoft.com/japan/msdn/securi ty/productinfo/xpsp2/default.aspx XPSP2 ファイアウォール概要: http://msdn.microsoft.com/library/enus/ics/ics/windows_firewall_start_page.asp 将来のホワイトペーパーとサンプル: MSDN® および DirectX SDK. ご質問は ? お知らせ SDK & 日本語ドキュメント送付申し込み 出口の箱に名刺を入れてください DirectX Graphics Meeting (9/8) 開発者の方と WGF の仕様などに対する フィードバックを個別に1時間づつ議論 講演終了後、川西にお問い合わせください
© Copyright 2024 ExpyDoc