(57)【要約】 【課題】ＯＳ上で実行されるアプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、コンピュータ・システムのハードウエア資源を仮想化する方法を提供すること。【解決手段】前記ＯＳは、前記ＯＳ上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含み、本発明の方法は、（Ａ）アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップと、前記ステップ（Ａ）は、（Ａ１）前記データフローの管理に関連するＡＰＩサービスを前記ピース・オブ・コードに含まれる対応するサービスに向けるステップを含み、（Ｂ）前記データフローを、前記ステップ（Ａ）に基づいて、ピース・オブ・コードで管理するステップとを有する。【選択図】  図２
2015517158.tif 000002
【特許請求の範囲】
【請求項１】
オペレーティング・システム（ＯＳ）上で実行されるアプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、コンピュータ・システムのハードウエア資源を仮想化する方法において、
前記ＯＳは、前記ＯＳ上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含み、
（Ａ）アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップと、
前記ステップ（Ａ）は、（Ａ１）前記データフローの管理に関連するＡＰＩサービスを前記ピース・オブ・コードに含まれる対応するサービスに向けるステップを含み、
（Ｂ）前記データフローを、前記ステップ（Ａ）に基づいて、前記ピース・オブ・コードで管理するステップと、
を有し、
前記ＡＰＩサービスは、ファンクション又はオブジェクト・メソッドであり、
前記ステップ（Ａ１）は、
（Ａ１１）メモリ内に、向け直すべきＡＰＩファンクション又はオブジェクト・メソッドを含むダイナミック・リンク・ライブラリを記憶するステップと、
（Ａ１２）前記記憶されたダイナミック・リンク・ライブラリに含まれるＡＰＩファンクション又はオブジェクト・メソッド用のファンクション・ポインタ・テーブル内で、向け直すべきＡＰＩファンクション又はオブジェクト・メソッドが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するファンクション又はオブジェクト・メソッドが記憶されている初期メモリアドレスで、置換するステップと
を含み、
前記ステップ（Ａ１２）は、前記ＡＰＩサービスがオブジェクト・メソッドの場合には、向け直すべきメソッドに関連するオブジェクトが初めて形成されたと確認された後に、行われる
ことを特徴とするコンピュータ・システムのハードウエア資源を仮想化する方法。
【請求項２】
前記ＡＰＩサービスはファンクションであり、前記ステップ（Ａ１）は、
（Ａ１３）第１変数内に、向け直すべきファンクションが記憶されている初期メモリ・アドレスを記憶するステップ、
を有することを特徴とする請求項１記載の方法。
【請求項３】
前記ＡＰＩサービスはオブジェクト・メソッドであり、前記ステップ（Ａ１）は、
（Ａ１４）第２変数内に、向け直すべきオブジェクト・メソッドが記憶されている初期メモリ・アドレスを記憶するステップ、
を有することを特徴とする請求項１記載の方法。      
【請求項４】
前記ステップ（Ａ）は、
（Ａ２）前記プロセスから前記データフローの管理に関連するＡＰＩサービスに対応するピース・オブ・コードに含まれるサービスへのコールを受領するステップ、
を有することを特徴とする請求項１記載の方法。      
【請求項５】
前記アプリケーションに属するプロセスはスリープ状態で初期化され、
（Ｃ）スリープ状態にあるアプリケーションに属するプロセスの実行を再開するステップを更に有することを特徴とする請求項１記載の方法。
【請求項６】
前記ステップ（Ｂ）は、
（Ｂ１）前記ハードウエア資源に対応する仮想化されたハードウエア資源が生成されたか否かを認証するステップと、前記ステップ（Ｂ１）で生成されたと認証されない場合には、
（Ｂ２）仮想化されたハードウエア資源を生成するステップと、
を有することを特徴とする請求項１記載の方法。
【請求項７】
前記ステップ（Ｂ２）は、
（Ｂ２１）前記ハードウエア資源に関連する仮想化されたバッファを生成するステップ
を有することを特徴とする請求項６記載の方法。
【請求項８】
前記ステップ（Ｂ２）は、
（Ｂ２２）前記ハードウエア資源の挙動をエミュレートするスレッド・オブ・エクセキューションを生成するステップ
を有することを特徴とする請求項６記載の方法。
【請求項９】
前記ステップ（Ｂ）は、
（Ｂ３）前記仮想化されたバッファ内に、前記プロセスからハードウエア資源に送られたデータを記憶するステップ
を有することを特徴とする請求項７記載の方法。
【請求項１０】
前記ステップ（Ｂ）は、
（Ｂ４）前記ハードウエア資源の挙動をエミュレートする生成されたスレッド・オブ・エクセキューションを所定の間中断するステップと、
（Ｂ５）前記仮想化されたバッファ内に記憶されているデータを獲得するステップと、
（Ｂ６）前記獲得されたデータを処理するステップと
を有することを特徴とする請求項９記載の方法。
【請求項１１】
前記ステップ（Ｂ）は、
（Ｂ７）前記処理されたデータを第１のリモートコンピュータ・システムに送信するステップ
を有することを特徴とする請求項１０記載の方法。
【請求項１２】
（Ｄ）仮想化されたハードウエア資源から前記アプリケーションに属するプロセスに向けて生成されたデータフローを管理するステップ
を更に有することを特徴とする請求項６記載の方法。
【請求項１３】
前記ステップ（Ｄ）は、    
（Ｄ１）データを第２のリモートコンピュータ・システムから受領するステップと、
（Ｄ２）前記受領したデータを処理するステップと、
（Ｄ３）前記処理されたデータを仮想化されたバッファ内に記憶するステップと
を有することを特徴とする請求項１２記載の方法。
【請求項１４】
前記ステップ（Ａ）は、
（Ａ３）前記アプリケーションに属するプロセスから前記ハードウエア資源から前記プロセスに向けて生成されたデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップ
を有し、
前記ステップ（Ｄ）は、
（Ｄ４）仮想化されたバッファ内に記憶されたデータを取り出すステップと、
（Ｄ５）前記取り出されたデータをプロセスに送るステップと
を有することを特徴とする請求項１３記載の方法。
【請求項１５】
前記ステップ（Ａ）は、
（Ａ４）前記プロセスから、前記データフローの管理に関連するＡＰＩサービスに対応するピース・オブ・コードに含まれるサービスへのコールを受領するステップ、
を有することを特徴とする請求項１３記載の方法。      
【請求項１６】
前記ステップ（Ｂ）は、
（Ｂ３）前記ハードウエア資源からプロセスに向けて生成されたデータフローを管理するステップを有し、
前記ステップ（Ｂ３）は、
（Ｂ３１）前記バッファ内にハードウエア資源からのデータが存在するか否かを確認するステップと、
前記ステップでデータの存在が確認された場合には、
（Ｂ３２）前記データを削除するステップと
を有することを特徴とする請求項１３記載の方法。
【請求項１７】
メモリとプロセッサとを有し、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を含むＯＳが実行されるコンピュータ・システムにおいて、
前記メモリは、前記アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードに対応するプロセッサで実行可能なインストラクションを記憶し、前記インストラクションは、
（Ａ）延期アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップと、
前記ステップ（Ａ）は、（Ａ１）前記データフローの管理に関連するＡＰＩサービスを前記ピース・オブ・コードに含まれる対応するサービスに向けるステップを含み、
（Ｂ）前記データフローを、前記ステップ（Ａ）に基づいて、ピース・オブ・コードで管理するステップと、
を実行する機能を有し、
前記ＡＰＩサービスは、ファンクション又はオブジェクト・メソッドであり、
前記ステップ（Ａ１）は、
（Ａ１１）メモリ内に、向け直すべきＡＰＩファンクション又はオブジェクト・メソッドを含むダイナミック・リンク・ライブラリを記憶するステップと、
（Ａ１２）前記記憶されたダイナミック・リンク・ライブラリに含まれるＡＰＩファンクション又はオブジェクト・メソッド用のファンクション・ポインタ・テーブル内で、再方向づけられるべきＡＰＩファンクション又はオブジェクト・メソッドが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するファンクション又はオブジェクト・メソッドが記憶されている初期メモリアドレスで、置換するステップと
を含み、
前記ステップ（Ａ１２）は、ＡＰＩサービスがオブジェクト・メソッドの場合には、向け直すべきメソッドに関連するオブジェクトが初めて形成されたと確認された後に、行われることを特徴とするコンピュータ・システム。      
【請求項１８】
前記ＯＳ上で複数のアプリケーションが実行され、前記メモリ内に、実行中の各アプリケーション用のピース・オブ・コードに対応するインストラクションを記憶する
ことを特徴とする請求項１７記載のコンピュータ・システム。
【請求項１９】
コンピュータ・システム上で実行されるＯＳ上で実行され、コンピュータ・システムに関連するハードウエア資源を仮想化する方法を実行するインストラクションを含む実行可能なピース・オブ・コードを含むコンピュータ・プログラムを記憶する記憶媒体において、前記方法は、
（Ａ）アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップと、
前記ステップ（Ａ）は、（Ａ１）前記データフローの管理に関連するＡＰＩサービスを前記ピース・オブ・コードに含まれる対応するサービスに向けるステップを含み、
（Ｂ）前記データフローを、前記ステップ（Ａ）に基づいて、ピース・オブ・コードで管理するステップと、
を有し、
前記ＡＰＩサービスは、ファンクション又はオブジェクト・メソッドであり、
前記ステップ（Ａ１）は、
（Ａ１１）メモリ内に、向け直すべきＡＰＩファンクション又はオブジェクト・メソッドを含むダイナミック・リンク・ライブラリを記憶するステップと、
（Ａ１２）前記記憶されたダイナミック・リンク・ライブラリに含まれるＡＰＩファンクション又はオブジェクト・メソッド用のファンクション・ポインタ・テーブル内で、再方向づけられるべきＡＰＩファンクション又はオブジェクト・メソッドが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するファンクション又はオブジェクト・メソッドが記憶されている初期メモリアドレスで、置換するステップと
を含み、
前記ステップ（Ａ１２）は、ＡＰＩサービスがオブジェクト・メソッドの場合には、向け直すべきメソッドに関連するオブジェクトが初めて形成されたと確認された後に、行われることを特徴とするコンピュータ・プログラムを記憶する記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ・システムのハードウエア資源を仮想化する方法に関し、特にオペレーティング・システム（ＯＳ）上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含むアプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、コンピュータ・システムのハードウエア資源を仮想化する方法に関する。本発明は、更に上記方法を実行するに適したシステムと実行可能なピース・オブ・コードに関する。
【背景技術】
【０００２】
何年も前から、クラウド・コンピューティング・モデルが構築され、「仮想化」の概念はコンピュータの世界では顕著なものとなっている。仮想化とは、技術的資源（ハードウエア，プラットホーム、ＯＳ、データ記憶装置、他のネットワーク資源）の仮想化版のソフトウエアの手段による創設として定義されている。その結果、これらの資源は複数の実行環境に分割することができる。このソフトウエアが、仮想化ハードウエア技術（例えば、Intel-VT AMD-V）により補助されるような場合も可能である。（Wikipedia in Spanish - http://es.wikipedia.org/wiki/Virtualizacio'n）
【０００３】
最も頻繁に仮想化される技術資源の１つは、コンピュータ・システム（例、パソコン又はサーバ）であり、これによりコンピュータ・システムは、様々なＯＳの複数のインスタンスを同時に実行できるようになった。かくしてコンピュータ・システムは、様々なＯＳを必要とする様々なアプリケーションを実行できる。
【０００４】
ある種の仮想化により、コンピュータシステムのハードウエア資源をエミレーティングすることがが可能となった。この為に、コンピュータ・システム内の仮想化ソフトウエアをインストールする必要がある。その目的は、コンピュータ・システムのハードウエア資源が全てのインストールされたＯＳにアクセス可能にすることである。この仮想化ソフトウエアの別の目的は、コンピュータ・システムにインストールされた様々なＯＳ用の仮想化されたハードウエア資源へのアクセスを調整することである。
【０００５】
コンピュータ・システムのハードウエア資源の仮想化は、幾つかの利点（例、同じコンピュータ・システムと別のあるコンピュータ・システム上の複数のＯＳを同時に実行できる点）もあるが、欠点も多くある。
【０００６】
例えばこの仮想化は、コンピュータ・システム上の仮想化ソフトウエアの実行に関連して発生する過剰負荷の結果として、コンピュータ・システムのパフォーマンスが下がる。特にアプリケーションの実行は、仮想化されていないシステム上ではかえって遅くなり、悪影響を受ける。
【０００７】
上記の欠点に関連して多くの場合、従来の仮想化技術は、将来も仮想化されることのない又は仮想化する必要のない資源をも仮想化してしまう。かくして例えばコンピュータ・システムのキーボードが仮想化されると、実行中のアプリケーションも仮想化されたキーボードを有し、従来技術においては実行中の様々なアプリケーションにより必要とされる仮想キーボードと同じ数の仮想コンピュータ・システム（バーチャルマシーン＋ＯＳ）を創設する必要がある。これはシステム資源の浪費に繋がり、システムの性能に悪影響を及ぼすことになる。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明の目的は、システムのハードウエア資源全てを仮想化することなく、コンピュータ・システムに関連するあるハードウエア資源のみを仮想化する方法を提供することである。
【課題を解決するための手段】
【０００９】
上記目的は、請求項１に記載の方法で達成される。即ち、ＯＳ上で実行されるアプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードを用いて、コンピュータ・システムのハードウエア資源を仮想化する本発明の方法において、前記ＯＳは、前記ＯＳ上で実行されるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を含み、
（Ａ）アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップと、
前記ステップ（Ａ）は、（Ａ１）前記データフローの管理に関連するＡＰＩサービスを前記ピース・オブ・コードに含まれる対応するサービスに向け直すステップを含み、
（Ｂ）前記データフローを、前記ステップ（Ａ）に基づいて、前記ピース・オブ・コードで管理するステップと、
を有する。
【００１０】
それ故に、従来技術とは異なり、挿入されたピース・オブ・コードを用いて、コンピュータ・システムのＯＳ上で実行される各アプリケーションが、実行に必要とされるハードウエア資源を仮想化する。しかしシステムに関連するハードウエア資源の全てを仮想化するわけではない。これによりシステムの資源の浪費を減らす事になり、全く用いられない資源、将来も仮想化されない資源、仮想化する必要のない資源（ＯＳあるいはＯＳのハードウエア資源）は、仮想化されない。本発明では、従来技術とは異なり、コンピュータ・システムの資源の全てを仮想化する仮想化ソフトウエアは存在しない。コンピュータ・システム上で実行されるアプリケーションに挿入される（injected）ピース・オブ・コードが、アプリケーションの正しい実行のために、どのハードウエア資源を仮想化すべきかを決定する。
【００１１】
コンピュータ・システムのキーボードを仮想化する例を続ける。本発明は、コンピュータ・システム全体を仮想化するのではなく、キーボードのみを仮想化（仮想化されたキーボードを生成）するだけである。それ故にこのアプリケーションは、実際のマシーンで実際に実行されるのあって、仮想化されたマシーンで実行されるのではない。その結果、仮想化により導入される負荷を大幅に減らすことができる。この負荷は、キーボードのデータを読み出すときのみ発生する極めて小さい負荷であり、各プログラムのインストラクションを実行する際に発生する大きな負荷ではない。
【００１２】
用語「データフローの管理」は、データフローの伝送又は制御に関連して使われる。その結果、プロセスがコールするサービスは、データフローの管理に関連する。挿入されたピース・オブ・コードがコールをインターセプトすると、このピース・オブ・コードが、仮想バッファのコンテンツを送信することにより、データフローの管理を行う。
【００１３】
上記の目的を達成するために、まず、アプリケーションに属するプロセスからプロセスとハードウエア資源との間で生成されたデータフローの管理に関連するサービスになされたコールをインターセプトする必要がある。用語「インターセプト」とは、プロセスからアプリケーションサービスへのコールを、ピース・オブ・コード内に含まれるサービスに向け直すことを意味する。その結果、ピース・オブ・コードそのものが、プロセスからコールを受領し、このＡＰＩサービスに対応するこのサービスを実行する。即ちプロセスからのコールはＡＰＩサービスには到達しない。このインターセプトによって、ピース・オブ・コードは、プロセスがＯＳにリクエストを行いそれにアクセスする時に、プロセスとハードウエア資源との間のデータフローの制御を行うことができる。これが行えるのは、ピース・オブ・コードがＯＳ上で動作しているからである。
【００１４】
インターセプトの前は、ピース・オブ・コードは、プロセスとハードウエア資源との間で生成されたデータフローの管理に関連するＡＰＩのサービスを、ピース・オブ・コードに含まれる対応するサービスに向け直しする。その結果、上記したように、プロセスからのコールは、ＡＰＩサービスに対しなされるのではなく、ピース・オブ・コードに含まれる対応するサービスに対しなされることになる。
【００１５】
インターセプトの後は、ピース・オブ・コードはプロセスからのコールを受領し、ピース・オブ・コードに含まれるサービスは実行中であるので、ピース・オブ・コードはプロセスとハードウエア資源との間で生成されたデータフローの管理を実行し、ハードウエア資源を仮想化する。それはピース・オブ・コードに含まれるサービスが、その目的に適用するよう構成されているからである。
【００１６】
用語「サービス」、「ＡＰＩ」、「コール」「ハードウエア資源」は、それぞれ少なくとも１つのサービス、少なくとも１つのＡＰＩ、少なくとも１つのコール、少なくとも１つのハードウエア資源に関連してもよい。例えば、同一のＡＰＩとある別のＡＰＩの２つのサービスを、ピース・オブ・コードに含まれる２つのサービスに向け直す。即ち複数のコールがプロセスにより出される。あるいは第１のＡＰＩのサービスをピース・オブ・コードに含まれる第１サービスに向け直す、又は第２のＡＰＩのサービスをピース・オブ・コードに含まれる第２のサービスに向け直す。同様に向け直すサービスによっては、同一のピース・オブ・コードとある別のピース・オブ・コードがハードウエア資源（ビデオカード、オーディオカード、ハードドライブ、キーボード又はマウス）が、実行中のアプリケーションのニーズに応じて、仮想化する。
【００１７】
実行可能なピース・オブ・コードをプロセスに挿入する１つの方法は、"Windows NT System-Call Hooking", Mark Russinovich and Bryce Cogswell, Dr. Dobb's Journal, January 1997"に記載されている。
【００１８】
本発明の一実施例によれば、アプリケーションに属するプロセスは、スリープ状態で初期化される。そして実行可能なピース・オブ・コードは、このスリープ状態の間にプロセスに挿入される。それ故に、本発明の方法は、プロセスがスリープ状態で初期化された場合には、プロセスを再度初期化する可能性もある。ピース・オブ・コードの正確な動作がそれ故に確保される。
【００１９】
本発明の一実施例によれば、前記ＡＰＩサービスはファンクションであり、
前記プロセスとハードウエア資源との間に生成されたデータフローの管理に関連するＡＩＰサービスをピース・オブ・コードに含まれる対応するサービスに向け直すステップは、
メモリ内に、向け直すべきＡＰＩファンクション又はオブジェクト・メソッドを含むダイナミック・リンク・ライブラリを記憶するステップと、
前記記憶されたダイナミック・リンク・ライブラリに含まれるＡＰＩファンクション又はオブジェクト・メソッド用のファンクション・ポインタ・テーブル内で、向け直すべきべきＡＰＩファンクションが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するファンクションが記憶されている初期メモリアドレスで、置換するステップとを含む。
【００２０】
それ故にピース・オブ・コードは、ＡＰＩのファンクションをピース・オブ・コードに含まれる対応するファンクションに向け直し、その結果ピース・オブ・コードは、プロセスによりこれらのファンクションに向けられたコールをインターセプトし、プロセスとハードウエア資源との間に生成されたデータフローを管理する。これにより仮想化が実現できる。
【００２１】
更にプロセスとハードウエア資源との間に生成されたデータフローの管理に関連するＡＩＰサービスをピース・オブ・コードに含まれる対応するサービスに向け直すことは、第１変数内に初期メモリアドレスを記憶するステップを含む。この初期メモリアドレス内に向け直すべきＡＰＩファンクションが記憶される。その結果、このＡＰＩファンクション（即ち元のファンクション）は、アプリケーションが実行中は必要な場合はいつでも、実行可能なピース・オブ・コードそのものからコールされる。
【００２２】
他方で、ＡＰＩサービスはオブジェクト・メソッドである。
前記プロセスとハードウエア資源との間に生成されたデータフローの管理に関連するＡＩＰサービスをピース・オブ・コードに含まれる対応するサービスに向け直すステップは、メモリ内に、向け直すべきオブジェクト・メソッドを含むダイナミック・リンク・ライブラリを記憶するステップと、
前記向け直すべきメソッドに関連するオブジェクトが初めて生成されたか否かを確認するステップと、
前記ステップで生成されたと確認された場合には、前記記憶されたダイナミック・リンク・ライブラリに含まれるオブジェクト・メソッド用のメソッド・ポインタ・テーブル内で、再方向づけるべきオブジェクト・メソッドが記憶されている初期メモリアドレスを、前記ピース・オブ・コードに含まれる対応するメソッドが記憶されている初期メモリアドレスで、置換するステップとを有する。
【００２３】
ファンクションの場合と同様に、オブジェクトに属するメソッドをピース・オブ・コードに含まれるメソッドに向け直すことも可能であり、その結果、ピース・オブ・コードは、プロセスによりメソッドになされたコールをインターセプトし、プロセスとハードウエア資源との間に生成されたデータフローを管理する。
【００２４】
ＡＰＩのサービスを向け直すことも可能であるので、サービスの１つはファンクションであり他のサービスはメソッドである可能性もある。その結果２つの実施例は、実行中の同一のアプリケーションと別のあるアプリケーションに対し補い合うものである。
【００２５】
更に、前記プロセスとハードウエア資源との間に生成されたデータフローの管理に関連するＡＩＰサービスをピース・オブ・コードに含まれる対応するサービスに向け直すステップは、第２変数内に、向け直すべきオブジェクト・メソッドが記憶されている初期メモリ・アドレスを記憶するステップを有する。その結果、アプリケーションの実行中に必要な時はいつでも、このメソッド（オリジナルなメソッド）は、ピース・オブ・コードによりコールすることができる。
【００２６】
本発明の他の実施例によれば、アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップは、前記プロセスから前記データフローの管理に関連するＡＰＩサービスに対応するピース・オブ・コードに含まれるサービスへのコールを受領するステップを有する。データフローの方向（即ちプロセスから資源に又は資源からプロセス）によっては、プロセスがコールを行うピース・オブ・コードに含まれるサービスが、異なることもある。
【００２７】
好ましくは前記プロセスとハードウエア資源との間に生成されるデータフローをピース・オブ・コードで管理するステップは、
前記ハードウエア資源に対応する仮想化されたハードウエア資源が生成されたか否かを認証するステップと、
前記ステップで認証されない場合には、仮想化されたハードウエア資源を生成するステップと、を有する。
【００２８】
コンピュータ・システムの大部分のハードウエア資源が、プロセスとハードウエア資源との間に生成されたデータフローを管理するために、ハードウエア資源を生成し、これでコンピュータ・システムのハードウエア資源を仮想化する（即ち仮想化ハードウエア資源を生成する）ことも必要である。それ故にコンピュータ・システムのハードウエア資源に依存して、ピース・オブ・コードは、対応する仮想化されたハードウエア資源が存在するか否かを認証しなければならない。存在しない場合には、この仮想化されたハードウエア資源を生成するステップは、
前記ハードウエア資源に関連するバッファを仮想化するバッファを生成するステップと／又は
前記ハードウエア資源の挙動をエミュレートするスレッド・オブ・エクセキューションを生成するステップとを有する。
【００２９】
仮想化されたバッファを生成する理由は、大部分のコンピュータ・システムのハードウエア資源はバッファを含む、あるいはバッファに接続されている（より具体的には各ハードウエア資源は予約されたメモリ領域を有する）。このバッファ内にハードウエア資源はデータを記憶する。その結果データはプロセスに達する（プロセスは通常それを得るためのリクエストを生成する）、あるいはプロセスはデータを記憶する。その結果データはプロセスに達する、即ちバッファはプロセスと資源との間のデータを交換するツールとして機能する。仮想化されたバッファを生成する目的は、プロセスと資源との間でデータを交換するために確保されたメモリ領域は、ＯＳの制御下にはない即ち実際の資源に関連するドライバーの制御下にはない異なるメモリ領域である。即ちピース・オブ・コードの制御下にあるメモリ領域である。更に各ハードウエア資源にとって、ピース・オブ・コードが挿入される実行中の各アプリケーションは、それ故にそれ自身の専用のバッファを有し、ハードウエア資源に属する他のアプリケーションと共有するバッファは有さない。
【００３０】
ある場合においては、データが仮想化されたバッファ内に記憶されると、プロセスに対し全ての動作が正確に行われたことを通知する必要がある。更にプロセスに対しどの程度の量のデータがバッファ内に書き込まれたかを示す必要がある。その理由はバッファ内にメモリ空間がまだ存在するかを知るため、又は全てのデータがバッファ内に記憶されておらずデータを記憶する更なるステップが必要となるかを知るためである。
【００３１】
スレッド・オブ・エクセキューションを生成する必要があるが、それは、主にスレッド・オブ・エクセキューションが、コンピュータ・システムのハードウエア資源の挙動をシミュレートするように、特にピース・オブ・コードにより生成されたデータの適切な管理を、仮想化されたハードウエア資源で制御できるように、更に又それらの間で交換されたプロセスにより仮想化されたバッファーを介して生成されたデータの管理を適切にできるようにするためである。スレッド・オブ・エクセキューションは、ピース・オブ・コードに含まれるファンクションによって表示され、実際のスレッドの実行はこのファンクションの実行に関連する。
【００３２】
前記プロセスとハードウエア資源との間のデータフローを前記ピース・オブ・コードで管理するステップは、前記仮想化されたバッファ内に、前記プロセスからハードウエア資源に送られたデータを記憶するステップを有する。その為このピース・オブ・コードは、プロセスとハードウエア資源の間で生成されたデータフローを管理する。その理由は、データは仮想化されたバッファ内に記憶されており、このバッファはピース・オブ・コードの制御下にあるからである。プロセスにより生成されたこのデータの宛先は、実際にはコンピュータ・システムのハードウエア資源（即ち実際のハードウエア資源）であるが、プロセスからあるＡＰＩサービスへのコールのピース・オブ・コードによるインターセプトにより、このデータはその制御下に入るようになる。
【００３３】
前記プロセスとハードウエア資源との間のデータフローを前記ピース・オブ・コードで管理するステップは、
前記ハードウエア資源の挙動をエミュレートする生成されたスレッド・オブ・エクセキューションを所定の間中断するステップと、
前記仮想化されたバッファ内に記憶されているデータを獲得するステップと、
前記獲得されたデータを処理するステップとを有する。      
【００３４】
仮想化されたハードウエア資源が、コンピュータ・システムのハードウエア資源の挙動をシミュレートするスレッド・オブ・エクセキューションを有する場合には、ピース・オブ・コードは、所定の時間（通常数ミリ秒のオーダー）スレッド・オブ・エクセキューションを中断しなければならない。その結果スレッド・オブ・エクセキューションは、プロセスが仮想化されたバッファ内に記憶させたデータを得る。このデータが得られるとスレッド・オブ・エクセキューションは、このデータをコンピュータ・システムのハードウエア資源が行うように処理しなければならない。例えばハードウエア資源がオーディオカードの場合には、このデータの処理は、データを例えばｍｐ３フォーマット（即ち、ＭＰＥＧ−１オーディオ、レイヤＩＩＩ標準に従って）に変換し、その結果このデータは解読できるようになる。
【００３５】
前記プロセスとハードウエア資源との間のデータフローを前記ピース・オブ・コードで管理するステップは、前記処理されたデータを第１のリモートコンピュータ・システムに送信するステップを有する。データが処理された後、データがピース・オブ・コードにより仮想化されたハードウエア資源で制御されているとすると、このデータはリモートのコンピュータ・システム（即ち、実際のハードウエア資源を含むコンピュータ・システム以外のコンピュータ・システム）に送られ、リモートのコンピュータ・システムがそのデータを利用する。しかしこのデータは、アプリケーションが実行されているコンピュータ・システムそのものに送信することも又は他のローカルのコンピュータ・システムに送信することも可能である。その為このオーディオカード例で更に説明すると、ピース・オブ・コードがオーディオカードの制御機能を有するとすると、このピース・オブ・コードは、このオーディオデータをリモートのコンピュータ・システム（例、モバイル端末、例えばスマートフォン、タブレット）を介して聞くことができるが、これはコンピュータ・システムに関連する実際のオーディオカードを介して聞けるようにする代わりに行われる。データがスレッド・オブ・エクセキューションにより処理される（これはスレッド・オブ・エクセキューションに含まれる１つのファンクションが処理するのであるが）と、このデータは、このコンピュータ・システムのオーディオカードにより解釈され、そのため他のコンピュータ・システムのオーディオカードにより読み取られるような問題はない。その理由はこの様なデータは既にその目的のために適合されているからである。
【００３６】
コンピュータ・システムに関連する仮想化する方法は上記では一般的に記載したが以下具体的方法でアプリケーションに属するプロセスからハードウエア資源へのデータフローを管理することを具体的に記載する。本発明はプロセスからハードウエア資源へ流れるデータをピース・オブ・コードが如何に制御するかを記載する。データフローが資源（より具体的には仮想化されたハードウエア資源）とアプリケーションに属するプロセスとの間で生成された時の本発明の方法を以下説明する。
【００３７】
従って本発明の方法は、前記仮想化されたハードウエア資源から前記アプリケーションに属するプロセスに向けて生成されたデータフローを管理するステップを含む。この特定の方向にデータを流すステップは、    
データを第２のリモートコンピュータ・システムから受領するステップと、
前記受領したデータを処理するステップと、
前記処理されたデータを仮想化されたバッファ内に記憶するステップとを有する。
【００３８】
ピース・オブ・コードは、第２リモートのコンピュータ・システム（通常第１と第２のリモートのコンピュータ・システムは同一のリモートのコンピュータ・システムであるが）からデータをいつでも受領すると、そのデータは処理され以前に生成された仮想化されたバッファ内に記憶され、それにプロセスがアクセス可能である。そのため仮想化されているハードウエア資源が例えばコンピュータ・システムのキーボードの場合には、ピース・オブ・コード（具体的にはハードウエア資源の挙動をシミュレートするスレッド・オブ・エクセキューション）は、キーボードデータをリモートのコンピュータ・システム（例えば、タブレット）から受領する。キーボードデータは、例えばユーザがタブレットのタッチパネルを介して入力するキーボードをベースに生成されたデータである。このデータは、スレッド・オブ・エクセキューションにより処理され、バッファ内に記憶される。
【００３９】
その後プロセスがデータの獲得を要求すると、このプロセスは、あるＡＰＩサービスにコールを行わなければならない。このＡＰＩサービスはハードウエア資源（このハードウエア資源の仮想化はプロセスに透明であるが故に実際のハードウエア資源と解釈される）とプロセスとの間のデータフローの管理に関連する。これらのコールはピース・オブ・コードによりインターセプトされる。その結果ピース・オブ・コードは、仮想化されたバッファ内に記憶されたデータ（コンピュータ・システムのハードウエア資源即ち実際のハードウエア資源に記憶されたデータ）を取り出し、それをプロセスにとってアクセス可能なように処理し、得られた後それを必要により処理する。
【００４０】
前記アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップは、
前記アプリケーションに属するプロセスから前記ハードウエア資源から前記プロセスに向けて生成されたデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップを有し、
前記前記仮想化されたハードウエア資源から前記アプリケーションに属するプロセスに向けて生成されたデータフローを管理するステップは、
仮想化されたバッファ内に記憶されたデータを取り出すステップと、
前記取り出されたデータをプロセスに送るステップとを有する。
【００４１】
一般的な状況（即ちプロセスとハードウエア資源の間のデータフロー）に記載したように、プロセスからＡＰＩサービス（これはハードウエア資源からプロセスへのデータフローの管理に関連する）へのコールをインターセプトするステップは、プロセスからピース・オブ・コードに含まれるサービスへのコールを受信するステップを含む。このピース・オブ・コードは、ハードウエア資源からプロセスへのデータフローの管理に関連するＡＰＩサービスに対応する。
【００４２】
最後に、本発明の方法は、アプリケーションに属するプロセスからハードウエア資源からプロセスに向けて生成されるデータフローを管理するステップを有する。これは、仮想化された資源（実際の資源ではなく）がアプリケーションを正しく制御し続けていることを確認するあためである。この為、プロセスとハードウエア資源との間のデータフローを管理するステップは、
前記ハードウエア資源からプロセスに向けて生成されたデータフローを管理するステップを有し、前記ステップは、
前記バッファ内にハードウエア資源からのデータが存在するか否かを確認するステップと、
前記ステップでデータの存在が確認された場合には、前記データを削除するステップとを有する。      
【００４３】
実行されているコンピュータ・システムのハードウエア資源の仮想化は、このハードウエア資源にとってはトランスペアレントであるために、このハードウエア資源は、関連するバッファにデータを送り続けることができる。その結果バッファは、ある時点で最終的に容量が満杯になる。この様な状況においては、実際のハードウエア資源は実際のコンピュータ・システムのＯＳの内部容量を飽和させることになる。それに応答して動作するかあるいは正確に作業を停止することがある。この様な状況を回避するために、ピース・オブ・コードは、バッファ内にデータがあるか否かを頻繁に確認し、データがある場合には、そのデータを削除する。
【００４４】
第２の態様においては、本発明は、コンピュータ・システムに関連するハードウエア資源を仮想化する方法を実行するインストラクションを含む実行可能なピース・オブ・コードを提供する。このピース・オブ・コードは、このアプリケーションがコンピュータ・システム上で実行されているＡＰＩを含むＯＳ上で実行されている時には、ピース・オブ・コードは、アプリケーションに属するプロセス内に挿入される。
【００４５】
この実行可能なピース・オブ・コードは、物理的記憶媒体（例、記憶媒体、コンピュータメモリ、ＲＯＭ）に記憶され、搬送波（例、電磁波、光）で搬送される。
【００４６】
第３の態様においては、メモリとプロセッサとを有し、ＡＰＩを含むＯＳが実行される本発明のコンピュータ・システムにおいて、前記メモリは、前記アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードに対応するプロセッサで実行可能なインストラクションを記憶し、本発明のコンピュータ・システムは、
前記アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップを実行するコンピュータ手段と、
前記ステップは、前記データフローの管理に関連するＡＰＩサービスを前記ピース・オブ・コードに含まれる対応するサービスに向けるステップを含み、
前記データフローを、前記ステップ（Ａ）に基づいて、ピース・オブ・コードで管理するステップを実行するコンピュータ手段とを有する。
【００４７】
メモリとプロセッサとを有し、ＡＰＩを含むＯＳが実行される本発明のコンピュータ・システムにおいて、前記メモリは、前記アプリケーションに属するプロセスに挿入される実行可能なピース・オブ・コードに対応するプロセッサで実行可能なインストラクションを記憶し、前記インストラクションは、
前記アプリケーションに属するプロセスから、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップと、
前記ステップは、前記データフローの管理に関連するＡＰＩサービスを前記ピース・オブ・コードに含まれる対応するサービスに向けるステップを含み、
前記データフローを、前記ステップ（Ａ）に基づいて、ピース・オブ・コードで管理するステップと、を実行する機能を有する。
【００４８】
本発明の一実施例によれば、上記のコンピュータ・システム上で複数のアプリケーションがこのＯＳ上で実行可能であり、メモリは、実行中の各アプリケーション用のピース・オブ・コードに対応するプロセッサが実行可能なインストラクションを記憶する。
【００４９】
更に本発明はコンピュータ・システム上で実行されるＯＳ上で実行可能なアプリケーションを提供する。このアプリケーションは、実行可能なピース・オブ・コードを含む。
【００５０】
本発明の一実施例によれば、ハードウエア資源はオーディオカードであり、前記コールをインターセプトするステップは、前記プロセスから前記オーディオカードに向けて生成されたデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップを含む。前記ピース・オブ・コードによりプロセスとハードウエア資源との間のデータフローを管理するステップは、前記プロセスから前記オーディオカードに向けて生成されたオーディオデータフローを管理するステップを含む。
【００５１】
より具体的には、前記プロセスから前記オーディオカードに向けて生成されたデータフローの管理ステップは、コンピュータシステムのオーディオカードに対応する仮想化されたオーディオカードが生成されたか否かを認証するステップと、前記ステップで生成されたとは認証されない場合には、仮想化されオーディオカードを生成するステップと、を有する。
【００５２】
前記仮想化されたオーディオカードを生成するステップは、コンピュータシステムのオーディオカードに関連する仮想化されたバッファを生成するステップと、前記コンピュータシステムのオーディオカードの挙動をエミュレートするスレッド・オブ・エクセキューションを生成するステップとを有する。
【００５３】
前記プロセスと前記オーディオカードとの間に生成されたオーディオデータフローの管理ステップは、前記仮想化されたバッファ内に、前記プロセスからオーディオカードに送られたデータを記憶するステップを含む。
【００５４】
他方で、前記プロセスから前記オーディオカードとの間に生成されたオーディオデータフローの管理ステップは、前記コンピュータシステムのオーディオカードの挙動をエミュレートする生成されたスレッド・オブ・エクセキューションを所定の間中断するステップと、スレッド・オブ・エクセキューションにより、プロセスからオーディオカードに送られた前記仮想化されたバッファ内に記憶されているデータを獲得するステップと、スレッド・オブ・エクセキューションが前記獲得されたオーディデータを処理するステップとを有する。
【００５５】
仮想化されたバッファからスレッド・オブ・エクセキューションにより得られたオーディオデータを処理するステップは、仮想化されたバッファから得られたデータをミキシングし、このミキシングされたオーディオデータを読み取り可能（解釈可能）なフォーマット（例、ｍｐ３フォーマット）に変換するステップを含む。
【００５６】
本発明の他の実施例によれば、ハードウエア資源はビデオカードであり、前記コールをインターセプトするステップは、前記プロセスから前記ビデオカードに向けて生成されたデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトするステップを含む。前記ピース・オブ・コードによりプロセスとハードウエア資源との間のデータフローを管理するステップは、前記プロセスから前記ビデオカードに向けて生成されたビデオデータフローを管理するステップを含む。
【００５７】
より具体的には、前記プロセスから前記ビデオカードに向けて生成されたデータフローの管理ステップは、コンピュータシステムのビデオカードに対応する仮想化されたビデオカードが生成されたか否かを認証するステップと、前記ステップで生成されたとは認証されない場合には、仮想化されビデオカードを生成するステップと、を有する。
【００５８】
前記仮想化されビデオカードを生成するステップは、コンピュータシステムのビデオカードに関連する仮想化されたバッファを生成するステップと、前記コンピュータシステムのビデオカードの挙動をエミュレートするスレッド・オブ・エクセキューションを生成するステップとを有する。ビデオカードの場合には、このバッファはDrawing Conntext(DC)と称し、ビデオカードは得られたグラフをフレーム毎に記憶し、ウィンドに常に関連付けているメモリ領域として定義される。
【００５９】
他方で、前記プロセスと前記ビデオカードとの間に生成されたビデオデータフローの管理ステップは、前記コンピュータシステムのビデオカードの挙動をエミュレートする生成されたスレッド・オブ・エクセキューションを所定の間中断するステップと、ビデオカードにより以前生成され、仮想化されたＤＣ内に記憶されているビデオデータ（フレーム）を、スレッド・オブ・エクセキューションにより獲得するステップと、スレッド・オブ・エクセキューションが前記獲得されたオーディデータを処理するステップとを有する。
【００６０】
仮想化されたバッファから得られたビデオデータをスレッド・オブ・エクセキューションにより処理ステップは、コーデック（例、Ｈ．２６４）の手段によりフレームをコーディングするステップを含む。
【００６１】
本発明の他の実施例によれば、ハードウエア資源は、データ入力装置例えばキーボード、マウス等である。この時点で、コンピュータ・システム上で実行されているＯＳがメッセージ待ち行列システムを利用している場合は、このメッセージ待ち行列も仮想化することも必要かも知れない。
【００６２】
メッセージ待ち行列を仮想化するためには、メッセージ待ち行列システムをエミュレートするスレッド・オブ・エクセキューションとバッファとを生成する必要がある。即ち、あるデータ入力（例えばキーを押すこと）に基づいてアプリケーションに関連するメッセージを待ち行列にメッセージを送り、このメッセージのトリートメント・ファンクション（ウインドウズ・ファクションとして公知である）とインクワイアリ（問い合わせ）をインターセプトする。このトリートメント・ファンクションは、メッセージ待ち行列システムのファンクションを実行するために、ピース・オブ・コードに含まれるあるメッセージに応答して、アプリケーションの挙動を規定する為に決められたのものである。
この場合、ピース・オブ・コードは、プロセスからファンクションへのコールをインターセプトしなければならない。このファンクションは、インクワイアリをし（即ちメッセージを読み出すためにメッセージ待ち行列からそれを取り出し）、メッセージ待ち行列に含まれるメッセージをトリートする（即ちあるアクションを実行する）ものである。このメッセージ待ち行列はＯＳがアプリケーションに関連させたものである。メッセージ待ち行列のメッセージをトリートするピース・オブ・コードのファンクションは、アプリケーションによりトリートされるべきではないメッセージを削除する（即ち無視する）、又はこのメッセージをアプリケーションがトリートする（即ちアプリケーションがこのメッセージに応答して動くようにする）ために、オリジナルのファンクションにコールを行う。
【００６３】
ハードウエア資源がデータ入力装置（例、マウス、キーボード）の場合は、前記コールをインターセプトするステップは、前記プロセスからＡＰＩサービス（データ入力装置からプロセスに向けて生成されたデータフローの管理に関連する）へのコールをインターセプトするステップを含む。ピース・オブ・コードによるプロセスとハードウエア資源との間のデータフローを管理するステップは、前記データ入力装置から前記プロセスに向けて生成されたデータフローを管理するステップを含む。
【００６４】
より具体的には、前記データ入力装置から前記プロセスに向けて生成されたデータフローの管理ステップは、コンピュータシステムのデータ入力装置に対応する仮想化されたデータ入力装置が生成されたか否かを認証するステップと、前記ステップで生成されたとは認証されない場合には仮想化されたデータ入力装置を生成するステップとを有する。
【００６５】
前記仮想化されたデータ入力装置を生成するステップは、コンピュータシステムのデータ入力装置に関連する仮想化されたバッファを生成するステップと、前記コンピュータシステムのデータ入力装置の挙動をエミュレートするスレッド・オブ・エクセキューションを生成するステップとを有する。
【００６６】
仮想化されたデータ入力装置から前記アプリケーションに属するプロセスに向けて生成されたデータフローを管理するステップは、
データ（データ入力装置により生成されたデータ）をリモートコンピュータ・システムから受領するステップと、前記受領したデータを処理するステップと、前記処理されたデータを仮想化されたバッファ内に記憶するステップとを有する。
【００６７】
前記仮想化されたハードウエア資源から前記アプリケーションに属するプロセスに向けて生成されたデータフローを管理するステップは、仮想化されたバッファ内に記憶されたデータを取り出すステップと、前記取り出されたデータをプロセスに送るステップとを有する。
【００６８】
本発明の他の実施例によれば、ハードウエア資源が記憶装置（ハードドライブ）の場合は、前記コールをインターセプトするステップは、前記プロセスからＡＰＩサービス（プロセスから記憶装置に向けて生成されたデータフローの管理に関連する）へのコールをインターセプトするステップを含む、ピース・オブ・コードによるプロセスとハードウエア資源との間のデータフローを管理するステップは、前記プロセスから記憶装置に向けて生成されたデータフローを管理するステップを含む。
【００６９】
より具体的には、プロセスからハードドライブへ生成されたデータフローを管理するステップは、プロセスからのデータを保存しているディレクトリー・パス（directory path）を変更するステップを含む。
【００７０】
上記したように、あるアプリケーションにおいては、ピース・オブ・コードは、上記のハードウエア資源の１つあるいは複数を仮想化できなければならないる。このため、ピース・オブ・コードは、これらのデバイスの仮想化をするのに必要なインストラクションを含まなければならない。
【００７１】
本明細書と請求の範囲において用語「を含む」とは、例えばＡを含むはＡ以外のものを含んでもよいことを意味する。
【図面の簡単な説明】
【００７２】
【図１】従来技術にかかるコンピュータ・システムでアプリケーションを実行する複数のを表す図。
【図２】コンピュータ・システム上でのアプリケーションの実行層とアプリケーションに属するプロセス内に挿入された実行可能なピース・オブ・コードを表す層とを有する本発明の複数層を表すブロック図。ピース・オブ・コードが、本発明によりアプリケーションによるコンピュータ・システムのハードウエア資源の仮想化を行う。
【発明を実施するための形態】
【００７３】
コンピュータ・システムのハードウエア資源を仮想化する実行可能なピース・オブ・コードを用いる本発明の方法を説明する。１個あるいは複数個のＡＰＩを含むＯＳがコンピュータ・システムに搭載されている。このピース・オブ・コードはＯＳ上で実行されるアプリケーションに関連するプロセス内に挿入されているものとする。
【００７４】
図１は、従来技術にかかるコンピュータ・システム（例、パソコン、サーバ）でアプリケーション（例ゲーム）を実行する層を表す。
【００７５】
同図において、最低レベル層１０はコンピュータ・システムのハードウエア資源（例、マイクロプロセッサ（ＣＰＵ）、メモリ、グラフィック・プロセッシング・ユニット（ＧＰＵ）、キーボード、マウス、ビデオカード、オーディオカード、ハードドライブ等）を表す。
【００７６】
最低レベル層１０上の第２層１１には、最低レベル層１０との間の双方向通信（資源即ちリソースに関する情報（制御信号１４またはデータ信号１５）を送受信する）に必要なドライバーを有する。
【００７７】
第２層１１上の第３層１２は、ＯＳを表し、ＡＰＩを有する。ＡＰＩは、ＯＳに含まれ、最低レベル層１０のリソース（資源）のドライバーを搭載することにより得られたものである。このＡＰＩは、通常ダイナミック・リンク・ライブラリ（dynamic link libraries）で実現されるが、それは使用されるＯＳを問わない。ＡＰＩを含む第３層１２と、ＯＳを表す第２層１１との間の通信は、制御信号１４とデータ（信号）１５の両方を交換する双方向通信である。
【００７８】
図１には第４層即ち最高レベル層１３がある。最高レベル層１３は実行中のアプリケーションを表す。最高レベル層１３が実行されていると、このアプリケーションは、ＡＰＩを表す第３層１２にアクセスし制御信号１４とデータ信号１５とを交換する。
【００７９】
この構成によれば、実行中のアプリケーション層である最高レベル層１３は、アプリケーションが実行されているコンピュータ・システムのディスプレイ・スクリーン上にウインドウを生成することを要求する。このアプリケーションは、ウインドウを生成するためにＡＰＩ層である第３層１２のサービス（ファンクションまたはメソッドのいずれか）にアクセスしなければならない。スクリーン上にウインドウを生成するために、これ等のサービスは、ＯＳ層である第２層１１と情報（制御信号、データ信号）を交換する必要があり、第２層１１は、スクリーン（最低レベル層１０）との間の通信を行うために必要なツール（ドライバー）を有し所望のウインドウを生成できる。
【００８０】
この構成の欠点は、コンピュータ・システムのハードウエア資源は、ユーザが選択し（あるいはＯＳが選択し）、フォアグラウンド（駆動中のウインドウズ）で活性状態にある１個のアプリケーションのみが使用可能である点である。即ちハードウエア資源が、ある時点で実行中の全てのアプリケーションの中で選択されたオーディオカードの場合、ユーザがフォアグラウンドで活性化したアプリケーションのみが、そのハードウエア資源を利用できる。それ故、唯一のアプリケーションのみが、オーディオデータをオーディオカードに送信しそれを再生できる。
【００８１】
ハードウエア資源が、実行中の様々なアプリケーションからデータを受領できる状況も可能である。この様な場合データは混じっていることになる。オーディオカードの例で説明を続けると、このハードウエア資源は実行中の複数のアプリケーションからオーディオデータを受領することができる場合には、オーディオカードは様々なオーディオデータが混じり合った混合物を生成することになる。
【００８２】
これらの欠点を解決するために、本発明は、初期化（例、スリープ状態で初期化されたアプリケーションに属するプロセス）時に、各アプリケーション内に挿入しなければならない実行可能なピース・オブ・コードをまず提供する。このピース・オブ・コードは、実行中のアプリケーション上でコンピュータ・システムに関連するハードウエア資源を仮想化するメソッドを実行できる。それ故に、ピース・オブ・コードの主要な目的は、実行するためにコンピュータ・システムからアプリケーションが要求するハードウエア資源を仮想化することである。その結果、ピース・オブ・コードが挿入されるアプリケーションにのみ使用可能に、仮想化されたハードウエア資源を生成でき、アプリケーションに属するプロセスとハードウエア資源との間のデータフローを管理できる。それ故に、実行中の各アプリケーションは、仮想化されたハードデバイスと、この仮想化されたハードデバイスとプロセスとの間で生成されるデータフローを管理できるツール（ピース・オブ・コード）とを有する。
【００８３】
図２は、図１のブロックに加えて、実行可能なピース・オブ・コードがアプリケーションに関連するプロセスに挿入された後の状態を表し、実行可能なピース・オブ・コードを表す層１６を、アプリケーションの最高レベル層１３とＡＰＩを表す第３層１２との間の論理レベルに配置する。その結果、ピース・オブ・コードは、このアプリケーションからあるＡＰＩサービス（例、ファンクションまたはメソッド）へのコールをインターセプトし、ハードウエア資源を仮想化する。      
【００８４】
ピース・オブ・コードを表す層１６の主なファンクションは、アプリケーションに属するプロセスが、前記プロセスとハードウエア資源との間に生成されるデータフローの管理に関連するＡＰＩサービスへのコールをインターセプトすること、前記プロセスとハードウエア資源との間に生成されるデータフローと、前記プロセスと仮想化されたハードウエア資源１０’との間に生成されるデータフローとを管理するステップとを有する。
【００８５】
具体的には、ピース・オブ・コードにより実行される方法は以下のとおりである。ユーザがアプリケーションを実行する初期状態において、このアプリケーションに帰属するプロセスがスリープ状態で初期化される。このスリープ状態の間、実行可能なピース・オブ・コードはプロセスに挿入される。
【００８６】
ピース・オブ・コードがプロセスに挿入されると、ピース・オブ・コードは、メモリ内に、プロセスと様々なハードウエア資源との間に生成されるデータフローの管理に関連するサービス（ファンクションまたはメソッドのいずれか）を含むＡＰＩを含む全てのダイナミック・リンク・ライブラリを記憶させる。このサービスは実行中にアプリケーションにより将来要求されるようになるものである。その後、ＯＳが、初期のメモリ・アドレス（そこにサービスが記憶されている）に従って、メモリ内に記憶されている別のＡＩＰサービス用のサービス・ポインター・テーブルを満たすと、このポインター・テーブル内で、実行中にアプリケーションにより将来必要とされる各サービスの初期メモリ・アドレスを、ピース・オブ・コードに含まれる対応するサービスが記憶されている初期メモリアドレスで置換する。そのため向け直しが実行されると、ピース・オブ・コードは、プロセスが実行中に関連するサービスに対し行ったコールを、インターセプトできる。即ちプロセスが様々なＡＰＩの様々な関連するサービスに対し行ったコールはピース・オブ・コードが受領する。その理由は、このポインターは、ＡＰＩサービスを指定せずに、ピース・オブ・コードに含まれる対応するサービスを指定するからである。
【００８７】
上記のインターセプトに基づいて、ピース・オブ・コードは、プロセスとコンピュータ・システムのハードウエア資源との間で生成されるデータフローを管理する機能を獲得する。即ちピース・オブ・コードは、プロセスにとって透明な方法で、プロセスとコンピュータ・システムのハードウエア資源との間で生成されるデータフローを管理する。
【００８８】
より具体的には、プロセスが、コンピュータ・システムのハードウエア資源に、あるＡＰＩサービスへのコールの手段により、アクセスしようとすると、ピース・オブ・コードは、それ自身のサービスを実行（即ちこれ等のコールのインターセプトを実行）する。このインターセプトに基づいて、データフローの制御を行う為に、プロセスがアクセスしようとしているコンピュータ・システムのハードウエア資源に対応する仮想化されたハードウエア資源１０’を生成する（これまでに生成されていない場合）ことが必要である。
【００８９】
仮想化されたハードウエア資源１０’は幾つかのアクションに関連する。第１アクションはバッファを生成することができることである。このバッファはコンピュータ・システムのハードウエア資源に関連するバッファを仮想化する。即ちピース・オブ・コードは特定のメモリ領域を予約し、これが仮想化されたバッファを表すのであるが、その中にプロセスはデータを記憶しなければならない。このデータは最初はコンピュータ・システムのハードウエア資源に送られるが、これはピース・オブ・コードによりインターセプトされたものである。
【００９０】
第２アクションは、スレッド・オブ・エクセキューションを生成することができることである。このスレッド・オブ・エクセキューションはコンピュータ・システムのハードウエア資源の挙動をエミュレートする。基本的にこのスレッド・オブ・エクセキューションは、ピース・オブ・コードそのものに含まれるファンクションである。
【００９１】
仮想化されたハードウエア資源１０’が生成されると（以前になかった場合）、ピース・オブ・コードは、プロセスにより送信されたデータを仮想化されたバッファ内に記憶し、必要によっては上記のスレッド・オブ・エクセキューションを生成する。このピース・オブ・コードは、所定の時間（約数ミリ秒）スレッド・オブ・エクセキューション（同一のピース・オブ・コードに含まれるファンクションでありコントロール可能である）を中断する。その後ピース・オブ・コードは仮想化されたバッファ内に記憶されたデータを読み出し（このデータはプロセスからきたものであるが）、それを処理する。データが処理されると、ピース・オブ・コードはそれを第１のリモートコンピュータ・システムに送る機能を有する。この実施例を次に説明する。
【００９２】
ハードウエア資源が、仮想化されたハードウエア資源でない場合でコンピュータ・システムのハードウエア資源そのものの場合には、ピース・オブ・コードは、データは正しく受信されたことを、プロセスへ通信することが必要である。
他方で、生成されたスレッド・オブ・エクセキューションは、第２のリモートコンピュータ・システム（この第１と第２のリモートコンピュータ・システムは通常同一のリモートコンピュータ・システムではあるが）からデータを受信することができる。この状況において、スレッド・オブ・エクセキューションは、受信したデータを処理し、その後仮想化されたバッファ内に記憶する。この仮想化されたバッファは仮想化されたハードウエア資源１０’の一部である。
【００９３】
アプリケーションが実行中されている間いつでも、プロセスはあるＡＰＩサービスにコールを行い、コンピュータ・システムのハードウエア資源がアプリケーション用に生成されたデータを有しているか否かを確認する。プロセスとコンピュータ・システムのハードウエア資源との間のデータフローの管理に関連するＡＰＩサービスの全ては、向け直しされるので、前記コールは、ピース・オブ・コード（より具体的にはピース・オブ・コードに含まれるサービス）が受領し処理する。このためにピース・オブ・コードは、仮想化されたバッファに含まれるデータ（データは仮想化されたバッファに含まれるデータに対応するデータ、即ちスレッド・オブ・エクセキューションにより受領され処理されるデータ）を取り出す。そのデータはリモートのコンピュータ・システムのスレッド・オブ・エクセキューションにより受領され、それを処理してそれを使用することができる。
【００９４】
コンピュータ・システムのハードウエア資源がアプリケーション用のデータを生成する（ピース・オブ・コードがデータフローレベルのみならず制御信号レベルにも関与している）状況においては、ピース・オブ・コードは、ハードウエア資源のバッファ内にデータが存在するか否かを頻繁に確認し、存在する場合にはそのデータを削除する。それ故に、アプリケーションが実行中の問題を回避できる。
【００９５】
本発明の実施例を以下に説明する。この実施例においては、ＯＳはウインドウズ例えばウインドウズ７であり、コンピュータ・システムはアプリケーション・サーバ具体的にはゲーム・サーバであり、実行すべきアプリケーションは、ゲーム、同一ゲームと別のあるゲームの様々なインタンスである。ゲームが行われるハードウエア資源は、ゲーム・サーバのオーディオカードである。ハードウエア資源がビデオカードの実施例、ハードウエア資源がデータ入力装置（キーボード、マウス）の実施例、ハードウエア資源がハードドライブの実施例を以下説明する。
【００９６】
より具体的には本発明の実施例は次のように動作する。このゲーム・サーバの目的は、そのサービスのユーザが様々なゲーム更には自分のモバイル端末（スマートフォン、タブレット）又はリモートコンピュータからの同一のゲームをプレイできるようにすることである。各ゲームの実行あるいは同一ゲームの各インタンスの実行は、ゲームサーバからユーザのモバイル装置へストリーミング技術により送られる。それ故に、ユーザのモバイル端末からユーザは遊びたいゲームを選択し、ユーザのモバイル端末のスクリーン上に示されているＧＵＩの制御要素（例えばゲームのアイコン）を動かすことにより、ゲームの実行を要求する。ユーザによる制御要素の活性化により、ゲーム・サーバに制御信号を送り、選択されたゲームをサーバ上で実行させる。
【００９７】
多数のユーザがゲームの実行を要求している（即ち多数のゲームが実行されている）とすると、本発明の目的は、各ゲームが、挿入されたピース・オブ・コードをベースに、実行に必要なゲームサーバのハードウエア資源を仮想化でき、それらを実行可能状態で利用できるようになることである。
【００９８】
そのため、ユーザーが自分の端末からゲームの実行を要求すると、実行中のアプリケーション（ゲーム）のメイン・プロセスは、ゲーム・サーバ内でスリープ状態で生成される。このため使用されるファンクションCreateProcess が、ＣＲＥＡＴＥ ＳＵＳＰＥＮＤＥＤ値を、クリエイション・モード・パラメータ(CreateFlags）に割り当てる。プロセスがスリープ状態で初期化されると、本発明による実行可能なピース・オブ・コードはプロセス内に挿入される。その目的は、ゲームサーバのハードウエア資源を仮想化することである。
【００９９】
本明細書において「ハードウエア資源を仮想化する」とは、コンピュータ・システムのハードウエア資源に対応する仮想化されたハードウエア資源を生成することのみならず、a posterioriに生成されたデータフローの管理全体も含む。
【０１００】
プロセス（このプロセスはスリープ状態で初期化される）の実行を再開する前に、挿入されたピース・オブ・コードはＡＰＩファンクションを方向付ける。このＡＰＩファンクションは、アプリケーション（具体的にはアプリケーションに属するプロセス）と様々なゲームサーバのハードウエア資源（本実施例においては、アプリケーションとオーディオカードとの間のデータフローを管理するためのファンクション）との間で生成されたデータフローの管理に関連する。かくして、この実施例においては、ファンクションとはIAudio Client or IAudio Render Clientである。
【０１０１】
一実施例のおいては、同一のサービス上で実行されているＯＳは、ウィンドウズ（より具体的にはウィンドウズ７）であるとすると、このＡＰＩは、ダイナミックリンクライブラリー（DLLS）で通常実行される。その理由は、ピース・オブ・コードはLoodLibrary ファンクションの手段で、目的とするファンクションを含むライブラリー（AudioRenderClient APIのGetBuffer とReleaseBuffer をdxgi.dll libraryを介して記憶する。基本的にLoodLibraryは、ライブラリをメモリ内に記憶し、ＯＳはIndex Address Table(IAT)（これはＡＰＩファンクション用のファンクションポインタテーブルである）をＡＰＩファンクションのメモリ内の初期アドレスで、満たす。RedirectIATファンクションの手段により、ピース・オブ・コードは、必要なポインタを修正し、それらをプロセスに挿入されたピース・オブ・コードに含まれるファンクションに対応させる。同時に、ピース・オブ・コードが向け直されたオリジナルなファンクションのいずれかにコールしなければならない場合には、テーブルのオリジナルのコンテンツ（即ち修正前のポインタの初期値）を変数内に記憶する。
【０１０２】
インターセプトが終了すると、即ち必要とする全てのＡＰＩの全てのファンクションが向け直されると、ピース・オブ・コードは、スリープ状態で初期化されたプロセスの実行を再開する。
【０１０３】
他方で、プロセスが、IAudioRenderClientタイプのインターフェース（COMタイプのインターフェース）の創設を、IAudioCLientインターフェースのGetServiceメソッドの手段により要求すると、ピース・オブ・コードは、このインターフェースがピース・オブ・コードにより既に修正された、即ち向け直されたか否かを認証する。これが認証されない場合には、インターフェースのポインタテーブルを修正して、インターセプトされるべきメソッド、例えばIAudioRenderClientとReleaseBufferを置換する。ＣＯＭタイプのインターフェースのメソッド用のポインタテーブルは、特定のコードで修正される。例えばGetBufferは、IAudioRenderClientインターフェースのメソッドテーブルのポジション４に対応し、それを修正して、挿入されたピース・オブ・コードに含まれるファンクションを指すようにする。同時に、元のメソッドへコールする必要がある場合、この位置のオリジナルのコンテンツは変数内にセーブされる。ＣＯＭタイプのインターフェースのポインタテーブルの修正だけが最初に実行しなければならず、そのタイプのオブジェクトが創設される。
【０１０４】
インターフェースIAudioRenderClientが創設され、オーディオカードへアクセスしようとするゲーム中に挿入されたピース・オブ・コードよりインターセプトされると、このピース・オブ・コードは、この対応するIAudioRenderClientオブジェクトをプロセスに戻す。
【０１０５】
アプリケーションに属するプロセスが、IAudioRenderClient GetBuffer メソッドにコールして、オーディオカード用のオーディオデータが書き込むことのできるバッファを要求する（より具体的には、オーディオデータを書き込まなければならないメモリ領域のアドレスを要求する）と、ピース・オブ・コードは、このコールをインターセプトする。即ち、GetBufferメソッドは、ピース・オブ・コードに含まれる対応するメソッドへ向け直され、その結果プロセスは、ピース・オブ・コードに含まれる対応するメソッドへ実際にコールする。ピース・オブ・コードに含まれる対応するメソッドが、ＡＰＩのオリジナルのメソッドにコール（ピース・オブ・コードはメソッド全体を含んではいるが）し、バッファを生成する。このバッファは、オーディオカードに関連するバッファを仮想化する。即ちメソッドはＩＰが書き込まれるメモリ領域のアドレスをプロセスに渡す。そのため、プロセスは、オーディオデータをゲームサーバのオーディオカードのバッファ内に記憶せず、実際のカードのバッファに対応する仮想化されたバッファ内に記憶する。
【０１０６】
アプリケーションが、全てのオーディオデータを仮想化されたバッファ内に書き込むと、アプリケーションはReleaseBufferファンクションへのコールを行い、アプリケーションがオーディオデータの書き込みを終了した事と書き込まれたか量とを示す。このコールは、再びピース・オブ・コードによりインターセプトされる。その結果、全てのオーディオデータが仮想化されたバッファ内に書き込まれた時とオーディオデータが書き込まれた量を知ることができる。
【０１０７】
更に、オーディオカードによるアプリケーションの制御に関連する問題故に、ピース・オブ・コードは同一サイズのバッファをオーディオカードに送る。このオーディオカードはサイレンスのみを含む。それ故にピース・オブ・コードは、オーディオカードが正確にアプリケーションを制御し続けていることを確認する。
【０１０８】
上記したプロセスと並列に、ピース・オブ・コードは、ゲームサーバのオーディオカードの挙動をシミュレートするスレッド・オブ・エクセキューションを生成する。このスレッド・オブ・エクセキューションは、同一のピース・オブ・コードに含まれるファンクション以上のものを含むことはない。ピース・オブ・コードは、スレッドの実行を数ミリ秒同期あるいは非同期で停止する。この停止後、スレッド・オブ・エクセキューションは、仮想化されたバッファ内に記憶されたプロセスからオーディオデータを読み出し、それを処理し、それを再生用に移動端末に送る。
【０１０９】
オーディオデータを処理することは、様々なオーディオデータをミキシングすることを含む。例えば、ゲームの実行中に聞こえてくるバックグランドミュージックと、ゲーム上でユーザが介在することにより聞こえてくる音（例、発射音、自動車のエンジン音、刀を振った音）、そしてそれを適宜のオーディオフォーマット例えばｍｐ３（例、ＭＰＥＧ１によればオーディオレイヤＩＩＩ標準）に変換する。このオーディオデータが正しいフォーマットを有すると、ピース・オブ・コードは、それをあらゆる通信ネットワーク（例、インターネット）を介して、移動端末に送り、ユーザがゲームをエンジョイしている間再生する。
【０１１０】
この実施例においては、ゲームによるオーディオカードへアクセス要求を記載した。実際には、複数のゲームと／又は同一ゲーム又はある別のゲームの複数のインスタンスがゲームサーバ上で同時に実行することができる。その為各ゲームは、上記のメソッドを実行するために、挿入されたピース・オブ・コードを含まなければならない。
【０１１１】
ゲームにより仮想化されるべきハードウエア資源がゲームサーバのビデオカードであって、それが手持ちのゲームのメインプロセスがスリープ状態で初期化されるような状況であって、かつピース・オブ・コードがプロセスに挿入される場合にはおいては、ビデオカードを仮想化するメソッドは次の通りである。
【０１１２】
他のハードウエア資源の場合と同様に、プロセスの実行を再開する前に、挿入されたピース・オブ・コードは、必要なＡＰＩファンクション、この場合は例えばDirectX APIのShowWindow 又はCreateDevice のファンクションを向け直す。このメソッドの主目的はピース・オブ・コードが、トランスペアレントな方法で、ビデオカードとアプリケーションに属するプロセスとの間で生成されたデータフローの管理を肩代わりすることである。
【０１１３】
上記したようにこのＡＰＩは、ダイナミック・リンク・ライブラリ（このＯＳがウィンドウズの場合の実施例においては、これらのライブラリはＤＬＬである）内で実行される。それ故にピース・オブ・コードは、LoodLibraryファンクションの手段により向け直されるファンクション（例えばShowWindowファンクション）を含むライブラリをユーザ３２．ｄｌｌライブラリを介して、記憶する。記憶された後、ＯＳが、ファンクションが記憶される初期メモリアドレスに基づいて、RedirectAITファンクションの手段により、このIndex Address Table(IAT)をＡＰＩファンクション用のファンクションポインタで充填した後、このピース・オブ・コードは、ビデオカードを仮想化する為に関連のあるこれらのファンクションのポインタを修正する。このため、それは、ＡＰＩファンクションが記憶されている初期メモリアドレスを、ピース・オブ・コードに含まれる対応するファンクションが記憶されている初期メモリアドレスで、置換する。別の構成としてＩＡＴを必要とよっては特定のコードで修正することもできる。
【０１１４】
他方で、ＣＯＭタイプのインターフェイス（IDirect3Device9）のサービスを向け直す為に、関連するメソッドを置換するために、インターフェイスのポインター・テーブルを修正する必要がある。ＣＯＭタイプのインターフェイスのメソッド・ポインター・テーブルは、特殊なコードで修正される。例えばPresentはIDirect3Device9のインターフェイスのメソッド・テーブルのポジション１８に対応し、それを修正しなければならない。その結果それは、挿入されたピース・オブ・コードに含まれる対応するファンクションを指す。同時に、このポジションのオリジナルのコンテンツは、元のメソッドをピース・オブ・コードからコールする必要がある場合には、変数の中に保存される。ＣＯＭタイプのインターフェイスのポインター・テーブルの修正は、そのタイプのオブジェクトが創設されたときに初めて、行わなければならない。インターセプトが終了した時に、即ち資源の仮想化を実行するのに必要な全てのＡＰＩのファンクションは向け直された時に、ピース・オブ・コードは、アプリケーションのプロセスの実行を再開する。
【０１１５】
プロセスが、グラフが描かれるウィンドウを表示するよう要求するか、又はIDirect3DDevice9-タイプのインターフェースの創設を、DirectX APIのCreateDeviceファンクションの手段により、要求すると、これらのコールはインターセプトされて、Drawing Context(DC)を捕獲するあるいは仮想化する。この場合これは元のＤＣか仮想化されたＤＣで行われる。このＤＣは、ビデオカードが得られたグラフをフレーム毎に記憶するメモリ領域として規定され、それは常にウィンドウズ内のウィンドウに関連付けられている。その為ゲームサーバのビデオカードの仮想化するために、この領域は、getDCファンクションの手段によりアクセスできなければならない。このＤＣへのアクセスは、互に排他的である。即ちビデオカードがこのメモリ領域にアクセスしていると、どのプロセスのスレッド・オブ・エクセキューションは、それにアクセスすることはできない。
【０１１６】
アプリケーションが、IDirect3DDevice9インターフェースを創設すると、又はグラフが示されるウィンドウを示すと、アプリケーションは、必要なデータをビデオカードに送信し始め、この情報の処理全部を開始し、その結果得られたフレームが形成される。これはピース・オブ・コードから独立して行われる。しばしばビデオ仮想化のスレッドは、ＤＣコンテンツを捕獲する。このビデオ仮想化は、これをアプリケーションと同期あるいは非同期で行われる。
【０１１７】
同期しているとは次の事を意味する。プロセスがビデオカードへアクセスするリクエストを、IDirect3DDevice9インターフェースのPresent メソッドを起動させることにより行いプロセスが生成されたフレームを示すと、ピース・オブ・コードは、このPresent メソッドをインターセプトする。その時に、スレッド・オブ・エクセキューションはＤＣ（この場合それはBackBufferと称する）にアクセスし、生成されたフレームを捕獲する。その後必要により、ピース・オブ・コードは、インターフェースのオリジナルのPresent メソッドをコールする。この方法が同期している。その理由は、Present メソッドがコールされた時に、ピース・オブ・コードがフレームを描くために行われるべき作業が終了したことを完全に知ることができる時点が、存在するからである。
【０１１８】
非同期の方法は、コンテンツにアクセスするために、ウィンドウ（ここでビデオカードはフレームを生成した結果を残す）のＤＣへ直接アクセスすることからなる。このＤＣへのアクセスは、互いに排他的に行わなければならない。この為スレッド・オブ・エクセキューションは、サーベイ（監視）の手段により、この相互に排他的な領域へアクセスを得ることを試みる。それが行われると、スレッド・オブ・エクセキューションは、ＤＣのコンテンツにアクセスして生成されたフレームの結果を得る。この方法が非同期的であるのは、フレーム捕獲のレートとフレーム生成のレートとが、同じではないからである。
【０１１９】
上記の２つの方法のいずれにおいても、ＤＣコンテンツ即ちフレームが捕獲さると、この情報の処理を開始するが、それは適宜のコーデック（例えばＨ．２６４）の手段によるコーディングに基づいて行われる。そしてこのコーディングをインターネットを介して送信する。
【０１２０】
ハードウエア資源がデータ入力装置（例えばマウス、キーボード等）の場合は、特定のメソッドは次の通りである。これまで記載したのとは異なり、このメソッドは、データ入力装置からアプリケーションに属するプロセスへ流れるデータフローを管理する、即ちこのメソッドは、ゲームを（例えばモバイル端末のキーボードから、又はタッチスクリーンから）エンジョイしているユーザからゲームサーバ上で実行されているゲームへオーダーを送信してその展開を得ようとする。
【０１２１】
それ故に、ピース・オブ・コードが既にプロセス（即ちゲーム）に挿入されるような状況に基づいて、ピース・オブ・コードは、関連するサービスを向け直して、仮想化されたハードウエア資源を生成する（即ち、バッファを生成し、このバッファがデータ入力装置のバッファを仮想化し、データ入力装置の挙動をエミュレートするスレッド・オブ・エクセキューションを仮想化する）。ピース・オブ・コード（より具体的には入力装置の挙動をシミュレートするスレッド・オブ・エクセキューション）は、ユーザのモバイル端末からデータを受領し、このデータはプロセスに送られ、その結果プロセスは、オーディオとビデオに関連するデータを修正し、それはその後モバイル端末に送られる。この為、そこからデータを受領する入力装置に依存して、ピース・オブ・コードは、この受領したデータ（仮想化されたキーボードのそれ又は仮想化されたマウスのそれのいずれかに対応する）を、対応する仮想化されたバッファ内に記憶する。
【０１２２】
プロセスが、入力装置（現実のキーボード、マウス、即ちゲームサーバーに関連した入力装置）からデータを得るために対応するサービスにコールを行うと、ピース・オブ・コードは、このコールをインターセプトし、ピース・オブ・コードに含まれる対応するサービスの実行を行わせる。その結果このサービスは、実際の入力装置のバッファではなく仮想化されたバッファ内に記憶されたデータを読み出す。
【０１２３】
この実施例のＯＳがウィンドウズであることを考慮に入れると、ウィンドウズのメッセージをアカウント内に入れる必要がある。この場合メッセージ待ち行列をエミュレートするスレッド・オブ・エクセキューションは、リモートシステム（モバイル端末）からネットワーク（インターネット）を介してデータ入力（キーボード又はマウスによる）を受領する。このデータは、モバイル端末からユーザが送ったオーダー又はイベントである。それ故に各データ入力に対しスレッド・オブ・エクセキューションは、メッセージを、アプリケーションのウィンドウに関連するメッセージ待ち行列（ユーザ３２．ｄｌｌライブラリのSendMessageファンクションとPostMessageファンクションの手段により）に導入する。このメッセージ待ち行列は、ＯＳにより提供されるメッセージ待ち行列システムのメカニズムにより自動的にアプリケーションに問い合わせる。更に、メッセージ待ち行列の仮想化を完了するために、メッセージ待ち行列の問い合わせファンクションとトリートメント・ファンクションを（ユーザ３２．ｄｌｌライブラリのSetWindowLongPteファンクションの手段により）変更する必要がある。その結果、メッセージ待ち行列（ウィンドウのファンクションあるいはメソッドとして公知であり、これはあるメッセージに応答して、アプリケーションの挙動を決定する為にプログラマが規定したファンクションである）の元のメッセージトリートメントファンクションを実行する代わりに、ピース・オブ・コードのファンクションが実行される。言い換えると、アプリケーションに対応するウィンドウのファンクション又はメソッドがインターセプトされる。このピース・オブ・コードのファンクションは、アプリケーションのウィンドウのオリジナルファンクションによりトリートすべきでないこれらのメッセージを削除し（即ちメッセージに応答して何のアクションも起こさない）、その結果このメッセージを無視するアプリケーションを得る。その理由はオリジナルなファンクションはそれらを実際にはトリートしないからである。あるいはピース・オブ・コードのファンクションから、オリジナルのメッセージトリートメント・ファンクションをコールする。その理由はこのアプリケーションはこれらのメッセージに応答して以下の２つの理由により反応すべきものだからである。第１の理由は、それらは、モバイル端末により送られたオーダーに基づいて、仮想化されたハードウエア資源（キーボード又はマウス）の入力データをエミュレートするピース・オブ・コードのスレッド・オブ・エクセキューションにより導入されたメッセージだからである。第２の理由は、それらは、モバイル端末のユーザの視点（ウィンドウズは実際のコンピュータシステムのスクリーン上で動くがこの位置はリモートシステムのユーザとは完全に無関係である）から、アプリケーションの挙動を変えることのできないメッセージだからである。
【０１２４】
最後に、プロセスがアクセス要求を行うハードウエア資源が記憶装置例えばハードドライブの場合には、本発明のメソッドは次の通りである。この場合ピース・オブ・コードは既にプロセス内に挿入されているものとする。
【０１２５】
プロセスの実行を再開する前に、この実施例においてはプロセスはスリープ状態で初期化されているが、挿入されたピース・オブ・コードは、要求された全てのＡＰＩファンクション（例、CreateFileとCreateDirectory）を向け直す。この主な目的は、ピース・オブ・コードがプロセスとハードドライブとの間のデータフローの制御を行うことである。
【０１２６】
残りのハードウエア資源での議論と同様に、これらのＡＰＩはダイナミックリンクライブラリで実行されているのでピース・オブ・コードは、それらを、メモリ内にLoadLibreryファンクションの手段により記憶する。それ故にLoadLibreryは、向け直すべきファンクションを含むライブラリ（例、kernel32.dllライブラリのCreateFileとCreateDirectory）を記憶する。このＯＳはＩＡＴを、各ＡＰＩファンクションが記憶されている初期メモリアドレスで充填する。必要なポインタは、RedirectIATファンクションの手段により修正され、このポインタが、ピース・オブ・コードに含まれる対応するファンクションを指すようにしている。ピース・オブ・コードが、プロセスとハードドライブとの間のデータフローの管理に関連するファンクションの向け直しを終了すると、ピース・オブ・コードそのものは、スリープ状態に初期化されていたアプリケーションに属するプロセスの実行を再開する。
【０１２７】
プロセスが、CreateFileファンクションの手段によりファイルを創設／生成する又は開こうとすると、ピース・オブ・コードはこのリクエストをインターセプトし、ピース・オブ・コードに含まれる対応するファンクションを実行する。このインターセプトに基づいて、このファンクションは、プロセスにより開かれるべきファイルは、ゲームの一試合（ラウンド）用のファイルかあるいは他のいずれかのファイルかであるかを認定する。このファイルがラウンド用のファイルの場合には、ファンクションは、必要によりあらゆる種類のアルゴリズムにより生成されるべき又は開かれるべきファイルパスを修正する。このファイルパスが修正されると、オリジナルなCreateFileファンクションは、新たに形成されたパスで実行されるが、ピース・オブ・コードに含まれる対応するファンクションも又実行される。CreateDirectoryファンクションの手段によりディレクトリを創設する方法は、CreateFileファンクションに記載したのと同じである。
【０１２８】
この実施例においては、各ハードウエア資源を仮想化することを別々に説明してきた。しかし同一のピース・オブ・コードとある別のピース・オブ・コードとが、複数のハードウエア資源を仮想化できる場合には、この本発明の方法の第１ステップ例えばメモリ内に様々なダイナミックリンクライブラリを記憶するステップ、又はサービスへのポインタ、共通であるが、即ちＡＰＩを含む全てのダイナミックリンクライブラリを、ピース・オブ・コードが仮想化できる全てのハードウエア資源の関連サービスで向け直すべき全てのサービスのポインタで、置換するステップとを同時にメモリに記憶でき、その結果、ピース・オブ・コードは仮想化できる全てのハードウエア資源を仮想化できる。
【０１２９】
上記の本発明の実施例は当業者はその様々な変形例を考え得り適宜に透過な手段で置換することができる。本発明の実施例はコンピュータ・システムとこのコンピュータ・システム上で行われるプロセスを例に説明したが、本発明は、コンピュータプログラムあるいは記録媒体内のコンピュータプログラムに関連する。コンピュータプログラムはソースコード、オブジェクトコードあるいはソースコードとオブジェクトコードとの間の中間コードの形態で部分的にコンパイルした形態あるいは他の適宜の形態でもよい。記録媒体はプログラムを搬送することのできる装置である。例えば記録媒体はＲＯＭ、ＣＤＲＯＭ、半導体ＲＯＭあるいは磁気記録媒体、フロッピーディスク、ハードディスク等である。更に記録媒体は電気ケーブルあるいは光学ケーブル、無線あるいは他の手段により送信できる電気信号あるいは光学信号の形態で搬送可能である。コンピュータプログラムがケーブルあるいは他の装置により直接送信されるような信号に含まれる場合には、伝送媒体はケーブルあるいは他の装置である。記憶媒体はコンピュータプログラムが集積回路あるいは関連のプロセスを実行するのに用いられる適宜のものである。
【０１３０】
以上の説明は、本発明の一実施例に関するもので、この技術分野の当業者であれば、本発明の種々の変形例を考え得るが、それらはいずれも本発明の技術的範囲に包含される。特許請求の範囲の構成要素の後に記載した括弧内の番号は、図面の部品番号に対応し、発明の容易なる理解の為に付したものであり、発明を限定的に解釈するために用いてはならない。また、同一番号でも明細書と特許請求の範囲の部品名は必ずしも同一ではない。これは上記した理由による。用語「又は」に関して、例えば「Ａ又はＢ」は、「Ａのみ」、「Ｂのみ」ならず、「ＡとＢの両方」を選択することも含む。特に記載のない限り、装置又は手段の数は、単数か複数かを問わない。
【符号の説明】
【０１３１】
１０：最低レベル層
１０’：仮想化されたハードウエア資源
１１：第２層
１２：第３層
１３：最高レベル層
１４：制御信号
１５：データ
１６：層
【図１】
2015517158.tif 000003
【図２】
2015517158.tif 000004
【国際調査報告】
2015517158.tif 000005
2015517158.tif 000006
2015517158.tif 000007
2015517158.tif 000008
2015517158.tif 000009
2015517158.tif 000010