アプリケーションの仮想化の準備のために前記アプリケーションを監視するための、コンピューターにより実行される方法であって、新しいプロセスの作成を検出して、コア仮想化システムを前記プロセスに注入するステップと、仮想化サブシステムの記憶装置から、登録された仮想化サブシステムをロードするステップと、前記検出されたプロセスに関連する仮想化されたアプリケーションのための構成情報を格納するために、アプリケーションパッケージを作成するステップと、前記登録された仮想化サブシステムから仮想化サブシステムを選択するステップと、前記選択された仮想化サブシステムに前記検出されたプロセスの作成を報知して、前記選択された仮想化サブシステムがプロセスを扱うことを望んでいるか否かを判断するステップと、前記選択されたサブシステムが前記検出されたプロセスを扱うことが可能であると判断されたとき、前記プロセスの実行の間に、前記検出されたプロセスに関連するサブシステム特有の構成情報を収集するステップと、収集された構成情報を前記作成されたパッケージ内に格納するステップを備え、上記のステップが少なくとも一つのプロセッサーによって実行されることを特徴とする方法。前記新しいプロセスの作成を検出することは、監視を開始すること、デスクトップアプリケーションの開始を検出すること、コア仮想化エンジンをスタートすること、および前記コア仮想化システムを前記プロセスに注入して前記システムが前記プロセスのAPIコールを監視できるようにすること、を含むことを特徴とする請求項1に記載の方法。前記登録された仮想化サブシステムをロードするステップは、前記システムに登録された仮想化サブシステムについての情報であって、オペレーティングシステムレジストリ内に格納された情報をロードすることを含むことを特徴とする請求項1に記載の方法。前記登録された仮想化サブシステムをロードするステップによって、前記システムの構成を行うことで、前記システムを変更し再構築することなしに、前記コア仮想化システムが新しいサブシステムと共に動作することを可能とすることを特徴とする請求項1に記載の方法。前記アプリケーションパッケージを作成するステップは、サブシステム特有の構成設定を格納するためのXMLextensiblemarkuplanguageマニフェストを作成することを含むことを特徴とする請求項1に記載の方法。前記仮想化サブシステムを選択するステップは、前記登録された仮想化サブシステムの一つが、前記検出されたプロセスを扱うことが可能であることを示すまで、前記登録された各仮想化サブシステムを繰り返すことを含むことを特徴とする請求項1に記載の方法。前記選択された仮想化サブシステムに報知することは、前記仮想化サブシステムをロードするための作成関数を呼び出すこと、および前記サブシステムに前記プロセスに関する情報を渡すこと、を含むことを特徴とする請求項1に記載の方法。前記サブシステム特有の構成情報を収集するステップは、Webサーバー仮想化サブシステムを使用してWebサーバーの構成情報を収集することを含むことを特徴とする請求項1に記載の方法。収集された構成情報を格納するステップはは、前記仮想化サブシステムからオブジェクトモデルインターフェースへのコールを受け取ることを含むことを特徴とする請求項1に記載の方法。前記仮想化されたアプリケーションを実行するために使用される前記仮想化サブシステム示すサブシステム識別子を、前記作成されたパッケージに格納するステップを更に含むことを特徴とする請求項1に記載の方法。アプリケーションレベルの仮想化のためのコンピューターシステムであって、ソフトウエア命令を実行するように構成されたプロセッサーおよびメモリーと、少なくとも一つの仮想化サブシステムから登録要求を受け取るように構成されたサブシステムカタログコンポーネントであって、登録によって、コア仮想化システムが前記仮想化サブシステムを使用して、前記コア仮想化システムの命令を更新することなく、アプリケーションを仮想化することを可能とするサブシステムカタログコンポーネントと、仮想化のために用意されている前記アプリケーションを監視する登録された仮想化サブシステムを呼び出すように構成されたサブシステム監視コンポーネントと、仮想化のために用意されている前記アプリケーションに関係する構成データを格納するためのパッケージを作成するように構成されたパッケージ作成コンポーネントと、アプリケーションパッケージをクライアントコンピューターシステムに配置して、前記クライアントコンピューターシステムが前記仮想化されたアプリケーションを呼び出すことができるようにするように構成されたアプリケーション配置コンポーネントと、前記仮想化されたアプリケーションと前記クライアントコンピューターシステムのホストオペレーティングシステムとの間の間接レベルを提供するように構成されたアプリケーション実行環境とを含むことを特徴とするシステム。前記サブシステム監視コンポーネントは、さらに、前記アプリケーションプロセスに興味を示す一つまたは複数の仮想化サブシステムを呼び出して、前記サブシステムが、前記アプリケーションの動作中に前記アプリケーションによってなされたサブシステム特有の設定の変化を監視することを可能とすることを特徴とする請求項11に記載のシステム。前記パッケージ構成コンポーネントは、さらに、新しいアプリケーションが仮想化のために準備されているときに前記パッケージを作成し、サブシステム特有の構成情報を前記パッケージ内に格納するためのAPIをサブシステムに提供するように構成されていることを特徴とする請求項11に記載のシステム。前記アプリケーション配置コンポーネントは、さらに、前記アプリケーションパッケージに関連する仮想化サブシステムを呼び出すことによって、前記クライアントシステム上のアプリケーション特有の設定を行うように構成されていることを特徴とする請求項11に記載のシステム。前記アプリケーション実行環境は、さらに、登録された仮想化サブシステムを呼び出して実行時に前記仮想化されたアプリケーションのサブシステム特有の処理を提供するように構成されていることを特徴とする請求項11に記載のシステム。拡張可能な仮想化システムが本明細書に記述されており、そのシステムはオブジェクトモデルを提供し、製品自体の再加工無しに仮想化製品を拡張するために新しい仮想化サブシステムが追加されることを可能にする方法で仮想アプリケーションのライフサイクルを管理する。アプリケーションを仮想化することは通常3つのステップを含み、それらはメタデータ抽出、メタデータの格納および再構成、並びに要求のランタイム管理である。メタデータの抽出は、アプリケーションが仮想化のための準備ができた時点を知り、構成情報を抽出するためにアプリケーションを監視するプロセスである。構成情報は、アプリケーションがそれ自身をオペレーティングシステム又は他のアプリケーションに結びつけるどのような方法も含むことができる。拡張可能な仮想化システムは、アプリケーション準備セッションの通知を受け取り、仮想化サブシステムが、アプリケーションがクライアント上で動作するために使用する各サブシステムに固有の構成情報を収集するためにセッションを監視することを可能にする。各サブシステムは、収集された情報を拡張可能な仮想化システムに提供し、拡張可能な仮想化システムは、仮想化されるべきアプリケーションが配置されるまで、収集された情報を格納する。アプリケーションが配置されるとき、システムは同じ仮想化サブシステムを呼び出し、格納された情報をサブシステムに提供する。サブシステムはこの情報とクライアントからの情報を使用してメタデータを再構成し、この知識からアプリケーションを仮想化するためにサブシステム特有のステップを実行する方法を知ることができる。例えば、もし管理者がマイクロソフトIISInternetInformationServerWebアプリケーションを仮想化しようと思ったならば、IISはアプリケーションプール識別子を使用してWebアプリケーションのインスタンスを管理する。この場合、拡張可能な仮想化システムの監視部が、登録された仮想化サブシステムを見つける。この場合、システムはIIS仮想化サブシステムを新しいプロセスに注入する。プロセスが作成されたとき、拡張可能な仮想化システムは通知を受け取り、サブシステム特有の方法で、IISがWebアプリケーションを登録していることを検出する。これに代えて、又はこれに加えて、サブシステムはアプリケーションのインストール前と後に構成情報のスナップショットをとり、その差分をアプリケーションメタデータとして格納しても良い。IIS仮想化サブシステムはWebアプリケーションプールの名称等のWebアプリケーションを仮想化するのに必要とされる情報を抽出し、他のクライアント上で動作するために例えば、アプリケーションプール名称が既に使用されていないことを確認することなどによって必要に応じて要求を変更し、要求を継続させる。Webアプリケーションが配置されるとき、拡張可能な仮想化システムは、この仮想アプリケーションがIIS仮想化サブシステムに依存していることを発見し、そのサブシステムをロードし、その後サブシステムにWebアプリケーションが作成されていること通知する。拡張可能な仮想化システムは、IIS仮想化サブシステムにサブシステムが監視中にWebアプリケーションについて集めた情報を提供する。実行時にIISがWebアプリケーションプールをその特定の名称で作成するとき、IIS仮想化サブシステムは特定の仮想アプリケーションを発見して作成するために充分な知識を得ているであろう。同一のステップは、他の様々な種類のアプリケーションおよびサブシステムに仮想化を提供するために使用することができる。こうして拡張可能な仮想化システムは、そのシステムを実施する仮想化製品がその製品に対してより少ない影響でより容易に拡張されることを可能にする多くの種類の仮想化サブシステムにとって、有用な汎用モデルを提供する。更に、このシステムを用いることにより、仮想化サブシステムの作者は、サブシステム特有の動作により集中することができ、サブシステムの実装は、拡張可能な仮想化システムによって扱われるオペレーティングシステム特有の知識のうち、必要となる知識はより少なくなる。アプリケーション仮想化サブシステムの主な責務は、監視、視覚化、登録、および実行時ランタイム仮想化にある。これらの各々についてここで個別に説明する。監視はインストールプロセスを注視してコンピューターシステムに対して加えられた変更を検知することを含む。幾つかの実施形態において、シーケンサーと呼ばれるアプリケーションがアプリケーション仮想化の監視段階の責任を負う。幾つかのサブシステムがアプリケーションプログラミングインターフェースAPIsをフックしてインストールを監視し、他のサブシステムが単にインストール前後のコンピューターシステムの状態を比較するようにしても良い。前者の一例は、仮想サービスサブシステムがCreateServiceAPIをフックして新しいオペレーティングシステムサービスがインストーラーによって追加された時点を検出することである。一方、前の例で記述されたIISサブシステムは、インストール前後のIIS構成を比較することによってそれ自身が使用する情報を収集する。視覚化は仮想化のためのアプリケーションを用意している管理者にアプリケーションによって生じた変化の視覚的な表示を示すことを含む。シーケンサーは監視の間に検出された変化を一連のタブとして表示する。拡張可能な仮想化システムは、視覚化を実行する責務を各サブシステムに与える。各サブシステムはそのサブシステムにとって適当な視覚化のためのユーザーインターフェースを提供する。これによってシーケンサーが視覚化段階の間に各サブシステムの明示的な知識を持っている必要が無くなる。サブシステムの視覚化インターフェースが拡張可能な仮想化システムの視覚化アプリケーションによってそれらの為に作成されたウインドウ内でそれらの結果を表示する責任を負う。登録は仮想アプリケーションを実行するためのクライアントコンピューターシステムを用意することを含む。仮想アプリケーションはクライアント上にインストールされないが、シームレスなユーザーエクスペリエンス例えば、アプリケーションがスタートメニューに表示されるようにを提供するために情報がクライアントに公開される。拡張可能な仮想化システムは、監視の間にサブシステムによって収集された情報を、クライアント上の適当な構成位置に公開する。例えば、仮想化されたIISWebアプリケーションは、クライアントのIIS構成を変更して、クライアントにアプリケーションが存在しているという知識を提供するユーザーがアプリケーションをスタートできるようにようにしても良い。登録に深く関係するサブシステムの他の責務は、設定configurationについてである。登録は一度行われる。しかしながら、設定はサブシステムがそのコンポーネントを登録した後に何回も行われ得る。登録の一例は、IISWebサイト、アプリケーション、および本明細書に記述されたアプリケーションプールを作成することである。設定項目の一例は、データベース接続文字列である。アプリケーションのためのバックエンドデータベースが移動されたときには、アプリケーションが登録された後にこの値は変更されなければならない。サブシステムは、例えばサブシステムの特定の知識を適用することを必要とする設定例えば、特定のAPIを呼び出すことによって設定されねばならないかもしれないなどの、サブシステムに特有のあらゆる設定値を適用する責任を持つ。実行時ランタイム仮想化は仮想化されたアプリケーションの実行時の間に機能をフックし、機能の動作を変更してアプリケーションがあたかもクライアント上にローカルにインストールされたかのようにそのリソースにアクセスすることを可能にすることを指している。実行時仮想化はまた、或るシステムプロセス即ち、仮想アプリケーションのパッケージの一部分でないプロセスが仮想化されるべきであるか否かについての決定を行うことを指している。例えば、IISサブシステムは、IIS作業プロセスがコマンドラインに渡されたアプリケーションプール名に基づいて仮想化されるべきであるか否かを決定する。図1は、一実施形態における拡張可能な仮想化システムの構成要素を示すブロック図である。システム100は、サブシステムカタログコンポーネント110、サブシステム監視コンポーネント120、パッケージ作成コンポーネント130、アプリケーションパッケージストア140、アプリケーション配置コンポーネント150、およびアプリケーション実行環境160を含む。ここで、これらのコンポーネントの各々について更に記述する。サブシステムカタログコンポーネント110は、少なくとも一つの仮想化サブシステムから登録要求を受取り、登録によってコア仮想化システムが仮想化サブシステムを使用するアプリケーションをコア仮想化システムの命令を更新すること無しに仮想化することが可能になる。例えば、クライアントコンピューターにインストールされたCOM仮想化サブシステムがそれ自身をコア仮想化システムに登録しても良い。ユーザーがCOMアプリケーションを仮想化することを要求したとき、仮想化システムがCOM仮想化サブシステムを呼び出し、それによって設定の変化を検出するためのサブシステム特有のCOMアプリケーションの監視が提供される。更に、仮想化されたアプリケーションがクライアント上で動作するとき、コア仮想化システムが再び仮想化サブシステムを呼び出してサブシステム特有のアプリケーションのランタイム処理が行われる。サブシステム監視コンポーネント120は、仮想化のための準備が行われているアプリケーションを監視するために、登録された仮想化サブシステムを呼び出す。サブシステム監視コンポーネント120は、登録されたサブシステムを通して各サブシステムにサブシステムが現在のアプリケーションを処理することに興味を持っているか否かを問い合わせることを反復するようになっていても良い。コンポーネント120は、アプリケーションプロセスに興味を示した一つ以上のサブシステムを呼び出し、サブシステムがアプリケーションによって行われたサブシステム特有の設定の変化を監視することができる。サブシステム監視コンポーネント120は、サブシステムにアプリケーションのライフタイムについて報知して、個々のサブシステムがサブシステムに関係したスタートアップおよびシャットダウンのタスクを実行できるようにしても良い。例えば、幾つかのサブシステムがアプリケーションの実行前後の構成データのスナップショットを撮ることによって監視するようにしても良い。パッケージ作成コンポーネント130は、仮想化のための用意が行われているアプリケーションに関係した構成データを格納するためのパッケージを作成する。パッケージは、圧縮、認証、暗号化、又はパッケージを小さくするかパッケージの作者のセキュリティもしくは確実性を提供する等の他の処理を含みうる種々のコンテナファイルフォーマットを含んでも良い。例えば、パッケージはZIP、CAB、又は多くのファイルおよび設定を単一のファイルに格納するのに適した他のアーカイブフォーマットとすることができる。パッケージ作成コンポーネント130は、新しいアプリケーションが仮想化のために用意されているときにパッケージを作成し、サブシステムがサブシステム特有の構成情報をパッケージ内に格納するためのAPIを提供する。例えば、コンポーネント130は、拡張可能な仮想化システムがサブシステムを呼び出したときにデータを格納するためのインターフェースへのポインタを渡しても良い。アプリケーションパッケージストア140は、仮想化のために用意されているアプリケーションの監視と仮想化されたアプリケーションの1以上のクライアントコンピューターシステムへの配置との間に、アプリケーションパッケージを格納する。アプリケーションパッケージストア140は、ファイルシステム、ネットワークベースストレージ、クラウドベース格納サービス、データベース、等の種々の記憶媒体を含むことができる。アプリケーション配置コンポーネント150は、クライアントコンピューターシステムが仮想化されたアプリケーションを呼び出すことができるようにアプリケーションパッケージをクライアントコンピューターシステムに配置する。コンポーネント150は、クライアントシステム上でファイルタイプ関連付けの追加、アプリケーションパッケージへのリンクの追加、オペレーティングシステムサービス設定の実行、およびWebサーバー構成情報の追加などのアプリケーション特有の設定を実行するようになっていても良い。アプリケーション配置コンポーネント150がアプリケーションパッケージに関連したサブシステムを呼び出して仮想化されたアプリケーションがクライアントコンピューターシステム上で動作するように用意するためのサブシステム特有の登録タスクを実行するようになっていても良い。アプリケーション実行環境160は、仮想化されたアプリケーションとクライアントコンピューターシステムのホストオペレーティングシステムとの間の、ある間接レベルlevelofindirectionを提供する。ラッパーwrapperは非常に薄くthin、アプリケーションがホストオペレーティングシステム上で動作するように設計されているときのように、アプリケーションに殆ど本来の状態で動作させることが可能である。これに代えて、又はこれに加えて、ラッパーはAPIを提供し、他のオペレーティングシステム又はオペレーティングシステムの他のバージョンの為に設計されたアプリケーションが予期するような制約を満足するようにしても良い。このようにしてアプリケーション実行環境160は、仮想アプリケーションに、そのためにアプリケーションがホストオペレーティングシステムの利用可能なリソースを使用するように設計された環境を提供する。アプリケーション実行環境160はまた、適当なサブシステム又は複数のサブシステムを呼び出して仮想化されたアプリケーションの実行時のサブシステム特有の処理を提供する。拡張可能な仮想化システムが実装されるコンピューティング装置は、中央処理装置、メモリー、入力装置例えば、キーボードおよびポインティング装置、出力装置例えば、表示装置、および記憶装置例えばディスクドライバ又は他の不揮発性記憶媒体を含む。メモリーおよび記憶装置は、システムを実現又は可能化するコンピューターにより実行可能な命令例えば、ソフトウエアでエンコードされていても良いコンピューターにより読み出し可能な記憶媒体である。加えて、データ構造およびメッセージ構造は通信リンク上の信号等のデータ伝送媒体を介して格納又は伝送することができる。インターネット、ローカルエリアネットワーク、広域ネットワーク、ポイント間ダイヤルアップアップ接続、携帯電話ネットワーク等の種々の通信リンクが使用可能である。システムの実施形態はパーソナルコンピューター、サーバーコンピューター、ハンドヘルド又はラップトップ装置、マルチプロセッサシステム、マイクロプロセッサベースシステム、プログラム可能な個人用電化製品、デジタルカメラ、ネットワークPC、ミニコンピューター、メインフレームフレームコンピューター、上記のシステム又は装置の何れかを含む分散コンピューティング環境等を含む種々の動作環境で実装することが可能である。コンピューターシステムは携帯電話、パーソナルデジタルアシスタント、スマートフォン、パーソナルコンピューター、プログラム可能な個人用電化製品、デジタルカメラ、等であっても良い。システムはプログラムモジュール等の、一以上のコンピューター又は他の装置によって実行されるコンピューターにより実行可能な命令の一般的なコンテキストで記述することができる。通常プログラムモジュールは特定のタスクを実行するか特定の抽象的なデータタイプを実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。通常、プログラムモジュールの機能は種々の実施形態において必要に応じて組み合わされるか又は分散されていても良い。図2は、一実施形態における拡張可能な仮想化システムのアプリケーションを監視する処理を示すフロー図である。処理はブロック210において開始し、システムは、新しいプロセスの作成を検出してコア仮想化システムをプロセスに注入する。例えば、もし管理者が監視を起動させてデスクトップアプリケーションを開始すると、システムがデスクトップアプリケーションの開始を検出し、コア仮想化エンジンをスタートさせ、コア仮想化システムをプロセスに注入し、例えば、システムがAPIコールおよび他のプロセスの状態を監視できるようになる。続くブロック220において、システムは仮想化サブシステムのリストから登録された仮想化サブシステムをロードする。例えば、システムはシステムに登録された仮想化サブシステムについての情報をオペレーティングシステムレジストリに格納するようにしても良い。この方法で、システムは単にシステムの設定を行うのみでシステムを変更したり再構成すること無く例えば、新しいサブシステムが必要とされる度に新しいコアリリースを出荷すること無く新しいシステムと共に動作することができる。続くブロック230において、システムは検出されたプロセスと関連した仮想化されたアプリケーションのための構成情報を格納するためのアプリケーションパッケージを作成する。例えば、パッケージは設定の設定値のためのXMLextensiblemarkuplanguage又は他のコンテナを含んでも良い。続くブロック240において、システムは第1の登録された仮想化サブシステムを選択する。その後の繰り返しにおいて、システムは次の登録されたサブシステムを選択する。続くブロック250において、システムは選択された仮想化サブシステムに検出されたプロセスの作成を報知し、仮想化サブシステムがプロセスを仮想化することを望んでいるか否かを判別する。例えば、システムは作成関数creationfunctionを呼び出して仮想化サブシステムをロードし、次にサブシステムにプロセスについての情報を渡す。サブシステムは、サブシステムがプロセスを仮想化することに興味を持っているか否かを示す、作成関数からの戻り値を提供するようにしても良い。異なるタイプのプロセスが異なるサブシステムによって仮想化され、こうして、典型的には、単一のサブシステムは、検出されたプロセスについての責任を示す。続く判断ブロック260において、もしシステムが、選択されたサブシステムが検出されたプロセスを扱うことができると判断したときには、システムはブロック270において動作を続ける。そうでなければシステムはブロック240にループして次の仮想化サブシステムを選択する。プロセス図示せずを扱うことができるサブシステムが無ければ、システムは終了し、プロセスは本来の状態で動作する即ち、仮想化されない。続く判断ブロック270において、仮想化サブシステムは、プロセスが動作している間に検出されたプロセスについてのサブシステム特有の構成情報を収集する。例えば、サブシステムは、プロセスによって変更されたファイルと登録キー、同様に、マイクロソフトアクティブディレクトリMICROSOFTACTIVEDIRECTORY又はIISメタベースmetabaseの変化等の他の設定の変化を検出しても良い。続くブロック280において、システムは収集された構成情報を、作成されたパッケージ内に格納する。サブシステムがサブシステム特有の情報を、作成されたパッケージに、又は作成されたパッケージからシリアル化serializeおよび逆シリアル化deserializeすることができるように、システムは、サブシステムにインターフェースを供給しても良い。このようにして、パッケージはコア仮想化システムに共通な情報とサブシステム特有の情報とを一つの場所に格納する。図3は、一実施形態における仮想化されたアプリケーションを配置するための拡張可能な仮想化システムの処理を示したフロー図である。処理はブロック310において開始し、システムは仮想化されたアプリケーションのインスタンスをクライアントコンピューターシステム上に登録する。例えば、拡張可能な仮想化システムは、クライアントのユーザーが仮想化されたアプリケーションを開始することを可能にするリンク、ファイルタイプ関連付け又は他のクライアントエントリーを作成しても良い。続くブロック320において、システムは、仮想化されたアプリケーションを開始するための要求を表示するアプリケーション実行指示を受け取る。デスクトップアプリケーションの場合には、その指示はオペレーティングシステムシェルを使用しているユーザーから発せられる。サーバーアプリケーションの場合には、その指示は例えば、サーバーによりホストされたWebページをアクセスするためのネットワーク又は他のソースを介して受け取った要求から発せられる。続くブロック330において、システムは、受け取ったアプリケーション実行指示に関連したアプリケーションパッケージをロードする。例えば、その指示は、システムが正しい仮想化されたアプリケーションを見つけて開始することができるようにするためにアプリケーションGUID又は他の識別子を特定する、呼び出されたリンクを含んでいても良い。システムはまた、ロードされたパッケージからコア仮想化設定の設定値を取り込むようにしても良い。続くブロック340において、システムは、アプリケーションパッケージに関連した仮想化サブシステムを識別する。例えば、システムは、プロセスコマンドラインから登録されたサブシステムに問い合わせることによってプロセスが仮想化されるべきか否かを決定するようなっていても良い。クライアントは、特にパッケージ名を引用するコマンドライン引数により又は各サブシステムに問い合わせることによってプロセスがパッケージにおいてそれらのパスで仮想化されるべきか否かを動的に決定しても良い。もし仮想化されれば、全てのサブシステムが仮想プロセス内で機能することになる。例えば、システムは、図2のステップ240から260と同様のステップを辿って登録されたサブシステムを通して動作を繰り返し、サブシステムが、利用できる情報に基いてプロセスを仮想化する選択を示すことができるようにしても良い。続くブロック350において、システムは識別された仮想化サブシステムをスタートさせる。例えば、システムは、サブシステムに関連したバイナリー実行可能モジュールを特定し、モジュールをロードし、サブシステムをスタートさせるエントリーポイントファンクションentrypointfunctionを実行するようにしても良い。続くブロック360において、システムは、識別された仮想化サブシステムにアプリケーションパッケージを実行する指令について報知する。例えば、システムは、サブシステムの開始時にパッケージのデータへのポインタをサブシステムに渡すようにしても良い。サブシステムは、サブシステムが仮想化されたアプリケーションの実行を扱うことを可能にするサブシステム特有のフックを設定するようにしても良い。続くブロック370において、システムは、識別されたサブシステムによる要求の時点でアプリケーションパッケージからサブシステム特有の情報を取り込む。拡張可能な仮想化システムは、アプリケーションパッケージへのおよびアプリケーションパッケージからの情報のシリアル化および逆シリアル化のための汎用インターフェースを提供し、サブシステムがインターフェースを使用して、本明細書に記述された監視処理の間にサブシステムによってパッケージに格納された設定を取り出すようにしても良い。続くブロック380において、システムは、識別されたサブシステムと取り込まれたサブシステム特有の情報を使用して仮想化されたアプリケーションを実行する。例えば、システムは、仮想化環境がロードできるようにCreateProcessコールCreateProcesscallの間に一時停止されていたプロセスに、実行を継続させるようにしても良い。アプリケーションの実行にしたがって、識別された仮想化サブシステムによって導入されたフック又は他の間接指定処理によって、サブシステムが、仮想化によって提供された分離を許容するリダイレクト又は他の処理を必要とするアプリケーションの要求を扱うことが可能になる。ブロック380の後、これらのステップは終了する。図4は、一実施形態における拡張可能な仮想化システムの動作環境および実装コンポーネントを示すブロック図である。幾つかの実施形態において、拡張可能な仮想化システムは、アプリケーションを仮想化するためにオペレーティングシステムドライバー430およびユーザーモードコンポーネントを使用する。仮想化ドライバー430例えば、sftplaysysは、オペレーティングシステムのカーネルレベルの仮想環境を管理する。ドライバーのプロセスマネージャーコンポーネントは、仮想環境マッピングへのプロセスIDを維持する。プロセスが生成されている間、プロセスマネージャーコンポーネントは、自動的に親プロセスの仮想環境に子プロセスを追加する。プロセスマネージャーコンポーネントはまた、ユーザーモード仮想化ライブラリー420に仮想プロセスの作成、終了、仮想環境中で動作しているプロセスが無くなった時点について報知する。ドライバー430の役割の一つは、レジストリとファイルシステムの仮想化を実行することである。仮想環境が仮想化ライブラリー420を使用して最初に作成されるときに、レジストリとファイルマッピング情報はドライバー430にアップロードされる。ドライバー430はこの情報を利用してレジストリとファイルシステムAPIの動作を変化させ、仮想アプリケーション440にはアプリケーションがクライアントコンピューターシステム上に局所的にインストールされたように見える。ユーザーモード仮想化ライブラリー420例えばosguardlibは、仮想環境とプロセスを管理するAPIを含んでおり、ユーザーモードと仮想化ドライバー430との間のインターフェースである。仮想化ライブラリー420はまた、種々の拡張可能なサブシステムに亘って使用される仮想ファイルシステムおよび仮想レジストリを含む、それに組みこまれる仮想サブシステムを有している。仮想化ライブラリー420は、仮想アプリケーションをパッケージ化するとき、および実行時に使用される。シーケンサー410は、アプリケーションインストールプロセスを監視することによって仮想アプリケーションをパッケージ化するときに管理者に使用されるアプリケーションであり、リスナー図示せずは仮想アプリケーションを実行時に管理するオペレーティングシステムのサービスである。仮想化実行時モジュール例えばsftldrdllは、子プロセスを作成するときに仮想化ライブラリー420又はそれ自身によって各仮想プロセスに注入されるライブラリーである。迂回路detoursライブラリーが仮想アプリケーション440のプロセス内の機能をフックするために用いられる。幾つかのコールがレジストリとファイルシステムの仮想化のために仮想化ドライバー430にリダイレクトされ、その他はRPCコールを仮想化ライブラリー420に作成してそれらの各々のサブシステムの仮想化を実行する。その初期化の間、仮想化ライブラリー420はレジストリ内にリストされた各サブシステムモジュールを動的にロードし、それらのファクトリーfactoryインターフェースへのポインタを格納する。シーケンサー410又はリスナーが仮想環境マネージャーを使用して仮想環境を作成するとき、各サブシステムのインスタンスを作成するためにファクトリーが使用される。サブシステムのインスタンスは仮想環境オブジェクト内に格納され、シーケンサー又はリスナーによって取り込まれうる。多くのサブシステムはそれらの仮想化を実行するために仮想ファイルシステムおよびレジストリにアクセスする必要がある。例えば、仮想COMおよび仮想サービスサブシステムの両方が仮想COMオブジェクトを作成し、仮想サービスを開始するためにそれぞれ仮想レジストリーキーにアクセスする必要がある。したがって、幾つかの実施形態では、仮想レジストリおよびファイルシステムサブシステムは汎用化されず、寧ろコアコンポーネントである。サブシステムは、それらの監視および実行時インターフェースを介して渡された仮想環境オブジェクトを通して、これらのコアサブシステムへのアクセスを得ることができる。監視インターフェースは、それが検出したサブシステムの変化をマニフェスト450ファイル内に格納する。このマニフェスト450は、表示を行いこの情報の編集を可能にする視覚化インターフェース、およびコンポーネントを登録するためにその情報を用いる登録インターフェースを含む他のインターフェースに渡される。幾つかの実施形態において、拡張可能な仮想化システムによって格納されるマニフェストはXMLファイルである。XMLファイルは情報を叙述的なフォーマットで階層的に格納し、仮想化のために使用される種々のコンポーネントおよびサブシステムがそのサブシステムによって必要とされる情報を個々に格納することを可能にする。実行時に、各コンポーネント又はサブシステムは、XMLファイルからそれ自身の、格納された情報を容易に特定し、抽出することができる。幾つかの実施形態において、拡張可能な仮想化システムは、仮想化サブシステムと対話するためのオブジェクトモデルを提供する。システムは、それぞれのサブシステムの責務のためにインターフェースを提供し、サブシステムを表すインターフェースは、他のインターフェースをラップwrapする。監視と実行時はそれぞれ2つのインターフェースを使用し、一つのインターフェースは仮想化されたプロセス内で使用され、本明細書に記述された仮想化ライブラリーによって使用されるもう一つのインターフェースと通信する。その結果のインターフェースは以下の通りである。classsubsystempublicサブシステム名を返すReturnsthesubsystemnamevirtualconststdwstringnameconst0サブシステムの視覚化インターフェースを返すReturnsthesubsystemsvisualizationinterface.virtualsubsystemvisualizervisualizer0サブシステムの登録インターフェースを返すReturnsthesubsystemsregistrationinterfacevirtualsubsustemregistratorregistrator0サブシステムの監視インターファースを返すReturnsthesubsystemsmonitoringinterface.virtualsubsystemmonitormonitor0仮想プロセス内で使用されたサブシステムの監視インターフェースを返すReturnsthesubsystemsmonitoringinterfaceusedwithinthevirtualprocess.virtualsubsystemprocessmonitorprocessmonitor0サブシステムの実行時インターフェースを返すReturnsthesubsystemsruntimeinterfacevirtualsubsystemruntimeruntime0仮想プロセス内で使用されたサブシステムの実行時インターフェースを返すReturnsthesubsystemsruntimeinterfaceusedwithinthevirtualprocessvirtualsubsystemprocessruntimeprocessruntime0サブシステムのVEラッパーインターフェースを返すReturnsthesubsystemsVEwrappperinterfacevirtualsubsystemvewrappervewrapper0幾つかの実施形態において、拡張可能な仮想化システムは、サブシステムと共に動作するために、仮想化サブシステムからファクトリーfactoryインターフェースを受け取る。幾つかのサブシステムは、仮想環境においてプロセスによって共有された状態を格納する必要がある。そこで、サブシステムオブジェクトのインスタンスは、ファクトリーインターフェースを使用して各仮想環境に作成される。各サブシステムモジュールは、モジュールによって実装されたサブシステム毎にひとつのファクトリーオブジェクトのリストを返すファンクションをエクスポートする。仮想化ライブラリーは、ファクトリーを使用して仮想環境が作成される毎にサブシステムのインスタンスを作成する。構成情報例えば、レジストリーキーは、どのサブシステムモジュールが仮想化ライブラリーによってロードされるかについて制御を行う。ファクトリーインターフェースの定義は以下の通りである。classsubsystemfactorypublicこのファクトリが作成するサブシステムのための名前を返すReturnsthenameforthesubsystemthisfactorywillcreatevirtualconststdwstringnameconst0サブシステムオブジェクトのインスタンスを作成するCreatesaninstanceofasubsystemobjectvirtualsharedptrcreateconst0幾つかの実施形態において、拡張可能な仮想化システムは、仮想化サブシステムをテストのために呼び出す。仮想サブシステムを実装することに加えて、これらのモジュールはテストとデバッグのために用いることができる。仮想アプリケーションをパッケージ化することの最も難しい点の一つは、アプリケーションが仮想環境内で正しく動作しないときの診断の問題である。サブシステムモジュールが仮想プロセスに注入されているため、モジュールがAPIをフックして具体的なエラーを探すことによって仮想プロセスを監視することができる。これらのモジュールの他の使用法は、仮想化ライブラリーおよびシーケンサーの機能のテストを行うことである。モジュールは、仮想レジストリおよびファイルシステムが生データを検査することによる監視の間に正しい情報を捕捉していることを確認することができる。それらはまた、それらのインターフェースからエラーを生成することによって、シーケンサーおよびリスナーの耐障害性をテストすることができる。以上の記述から、拡張可能な仮想化システムの特定の実施形態が単なる例示として本明細書に記述されてきたが、発明の趣旨および範囲から逸脱することなく様々な変形が可能であることが理解されるであろう。従って、本発明は添付の特許請求の記載による以外には限定されない。