Nailing the Fundamentals on Windows

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時間づつ議論
講演終了後、川西にお問い合わせください