(57)【特許請求の範囲】
【請求項１】
カーネルモードのドライバコンポーネントに追加機能を提供するシミングのためのシステムであって、
各ドライバコンポーネントがそれぞれ、コールすべきカーネルモードプロシージャへポイントする少なくとも１つのアドレスを有するインポートアドレステーブルを含む、複数のドライバコンポーネントと、
追加機能を前記複数のドライバコンポーネントに提供する共通シムコンポーネントと、
各ドライバコンポーネントに関連付けられ、各ドライバコンポーネントの前記インポートアドレステーブルに含まれる前記カーネルモードプロシージャへの前記少なくとも１つのアドレスをドライバ固有コンテキスト情報として前記共通シムコンポーネントに提供する、コンテキストコンポーネントであって、
該コンテキストコンポーネントを前記共通シムコンポーネントにリンクし、実行の流れが前記カーネルモードプロシージャから前記共通シムコンポーネントにリダイレクトされるように、該コンテキストコンポーネントに関連付けられたドライバコンポーネントの前記インポートアドレステーブル内の前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを、前記共通シムコンポーネントへのアドレスで置き換える、サンクコンポーネント
を含む、コンテキストコンポーネントと
を備え、
前記共通シムコンポーネントは、前記ドライバ固有コンテキスト情報に基づいて前記カーネルモードプロシージャをコールすることによって、前記追加機能を前記複数のドライバコンポーネントに提供することを特徴とするシステム。
【請求項２】
前記ドライバ固有コンテキスト情報は、ドライバのリンケージ構成を含むことを特徴とする請求項１に記載のシステム。
【請求項３】
前記コンテキストコンポーネントは、前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを、前記ドライバコンポーネントの前記インポートアドレステーブルから検索するフックコンポーネントを備えることを特徴とする請求項１に記載のシステム。
【請求項４】
前記フックコンポーネントは、前記共通シムコンポーネントの前記アドレスを決定することを特徴とする請求項３に記載のシステム。
【請求項５】
前記共通シムコンポーネントによって提供される前記追加機能は、前記ドライバコンポーネントのドライバ障害を補償することを含むことを特徴とする請求項１に記載のシステム。
【請求項６】
確率論的解析に基づいて前記ドライバ障害およびドライバ障害の原因を決定し、是正するための診断コンポーネントをさらに備えたことを含むことを特徴とする請求項１に記載のシステム。
【請求項７】
カーネルモードのドライバコンポーネントに追加機能を提供するシミングのためのシステムであって、
特定のドライバコンポーネントを該システムのメモリにロードし、および該特定のドライバコンポーネントが前記メモリにロードされたことを示す通知信号を生成するドライバローダコンポーネントと、
追加機能を提供する複数のシムコンポーネントを格納し、前記追加機能を提供してシムすべきドライバコンポーネントおよび該ドライバコンポーネントに関連付けられたシムコンポーネントを識別する情報を格納するシムデータベースと、
前記通知信号を前記ドライバローダコンポーネントから受信し、前記シムデータベースに問い合わせて、前記通知信号により特定される前記特定のドライバコンポーネントをシムする必要があるかどうかを判断し、シムする必要があるときに前記特定のドライバコンポーネントに関連付けられたシムコンポーネントを前記メモリにロードし、前記特定のドライバコンポーネントに関連付けられたコンテキストコンポーネントを生成する、シムエンジンコンポーネントと、
システムの問題、不安定性または非効率性を検出し原因を決定して、是正処置を開始するための診断コンポーネントと
を備え、
前記特定のドライバコンポーネントは、コールすべきカーネルモードプロシージャへポイントする少なくとも１つのアドレスを有するインポートアドレステーブルを含み、
前記コンテキストコンポーネントは、
前記特定のドライバコンポーネントの前記インポートアドレステーブル内の前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを格納するデータ構造と、
前記特定のドライバコンポーネントを前記コンテキストコンポーネントにリンクして、該コンテキストコンポーネントを前記特定のドライバコンポーネントに関連付けられた前記シムコンポーネントにリンクし、実行の流れが前記カーネルモードプロシージャから前記シムコンポーネントにリダイレクトされるように、前記インポートアドレステーブル内の前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを、前記特定のドライバコンポーネントに関連付けられた前記シムコンポーネントへのアドレスで置き換える、サンクコンポーネントと
を含み、前記データ構造内に格納された前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを含むドライバ固有コンテキスト情報を、前記特定のドライバコンポーネントに関連付けられた前記シムコンポーネントに提供し、
前記シムコンポーネントは、前記ドライバ固有コンテキスト情報に基づいて前記カーネルモードプロシージャをコールすることによって、前記追加機能を前記特定のドライバコンポーネントに提供することを特徴とするシステム。
【請求項８】
前記是正処置は、前記シムデータベース内に格納された前記複数のシムコンポーネントから、前記システムの問題、不安定性または非効率性を解決することができる１つまたは複数のシムコンポーネントを探し出し、該１つまたは複数のシムコンポーネントに関連付けられたドライバに適用することを含むことを特徴とする請求項７に記載のシステム。
【請求項９】
前記是正処置は、ユーザーに通知することを含むことを特徴とする請求項７に記載のシステム。
【請求項１０】
シムコンポーネントの開発および配置を容易にするためのインターフェイスコンポーネントをさらに備えることを特徴とする請求項７に記載のシステム。
【請求項１１】
前記インターフェイスコンポーネントは、シムコンポーネントを開発するため、あるいは以前に開発されたシムコンポーネントをドライバに適用するための一連のステップ中でユーザーをナビゲートするシムウィザードを含むことを特徴とする請求項１０に記載のシステム。
【請求項１２】
カーネルモードのドライバコンポーネントに追加機能を提供するシミングのための方法であって、
各ドライバコンポーネントに関連付けられたドライバ固有コンテキスト情報を生成するステップであって、各ドライバコンポーネントは、コールすべきカーネルモードプロシージャへポイントする少なくとも１つのアドレスを有する、インポートアドレステーブルを含み、生成されるドライバ固有コンテキスト情報は、各インポートアドレステーブル内の前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを含む、ステップと、
実行の流れを前記カーネルモードプロシージャからリダイレクトするために、前記インポートアドレステーブル内の前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを、前記追加機能を提供するシムコンポーネントへポイントするアドレスに置き換えるステップと、
前記ドライバ固有コンテキスト情報を前記シムコンポーネントに提供して、前記シムコンポーネントが前記ドライバ固有コンテキスト情報に基づいて全体のドライバリンケージ構成内で前記カーネルモードプロシージャをコールしようとする前記ドライバコンポーネントを決定し、前記カーネルモードプロシージャをコールすることによって前記追加機能を前記特定のドライバコンポーネントに提供することができるようにするステップと
を備えることを特徴とする方法。
【請求項１３】
前記ドライバ固有コンテキスト情報を前記シムコンポーネントに提供することは、前記ドライバ固有コンテキスト情報を、プロシージャまたはメソッドパラメータを介して前記シムコンポーネントに渡すステップを含むことを特徴とする請求項１２に記載の方法。
【請求項１４】
前記ドライバ固有コンテキスト情報を前記シムコンポーネントに提供することは、前記ドライバ固有コンテキスト情報をメモリにロードするステップを含むことを特徴とする請求項１２に記載の方法。
【請求項１５】
前記シムコンポーネントと前記ドライバ固有コンテキスト情報と前記ドライバコンポーネントとの間の関連付けを保持するように、前記シムコンポーネントおよび前記ドライバ固有コンテキスト情報をシムデータベースに格納するステップをさらに備えることを特徴とする請求項１２に記載の方法。
【請求項１６】
カーネルモードのドライバコンポーネントのカーネルモードプロシージャのコールを修正するための方法であって、
特定のドライバコンポーネントがメモリにロードされたことを示す通知信号を受信するステップと、
シムデータベースに問い合わせて、前記特定のドライバコンポーネントに関連付けられたシムコンポーネントが前記シムデータベースに存在するかどうかに基づいて、前記特定のドライバコンポーネントに追加機能を提供してシムすべきかどうかを判断するステップと、
前記特定のドライバに関連付けられたシムコンポーネントが前記シムデータベースに存在するとき、該関連付けられたシムコンポーネントを前記メモリにロードするステップと、
前記特定のドライバコンポーネントのドライバ固有コンテキスト情報を前記シムコンポーネントに提供するステップであって、前記特定のドライバコンポーネントは、コールすべきカーネルモードプロシージャへポイントする少なくとも１つのアドレスを有するインポートアドレステーブルを含み、前記ドライバ固有コンテキストは、前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを含む、ステップと、
前記インポートアドレステーブル内の前記カーネルモードプロシージャへの前記少なくとも１つのアドレスを、前記特定のドライバコンポーネントに関連付けられた前記シムコンポーネントへポイントするアドレスで置き換えることによって、実行の流れを前記カーネルモードプロシージャから前記シムコンポーネントにリダイレクトするステップと、
前記シムコンポーネントが、前記ドライバ固有コンテキスト情報に基づいて前記カーネルモードプロシージャをコールして、前記追加機能を前記特定のドライバコンポーネントに提供するステップと
を備え、前記シムコンポーネントは、前記ドライバ固有コンテキスト情報に基づいて、前記カーネルモードプロシージャをコールしようとする前記ドライバコンポーネントを識別することを特徴とする方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般にコンピュータに関し、特に、カーネルモードドライバをシム（ｓｈｉｍ）するシステムおよび方法に関する。
【背景技術】
【０００２】
シミング（Ｓｈｉｍｍｉｎｇ）は、追加の機能を、アプリケーションプログラミングインターフェイス（ＡＰＩ）クライアント（例えば、アプリケーション、ドライバ）とＡＰＩサービス（例えば、オペレーティングシステムによって提供されるもの）の間に挿入することができるようにする技術である。ＡＰＩクライアントアプリケーションは、外部から提供されるサービスの集まり（ＡＰＩ）を使用するように書くことができ、これらのサービスはある十分に記述された機能を提供する。これらのＡＰＩサービスは、例えばダイナミックリンクライブラリ（ＤＬＬ）に含まれ、クライアントプログラムの外部に常駐する。
【０００３】
外部ＡＰＩサービスによって提供される主な利点の１つは、ＡＰＩサービスコードをクライアントアプリケーションに直接含めることなく、クライアントアプリケーションを構築することができることである。特に、このようなスキームは、アプリケーションが特定のＡＰＩサービスの使用を宣言するが、アプリケーションが実際に実行のためにロードされるまでそのＡＰＩへのバインディングを保留するための方法を提供する。これにより、アプリケーションコードをＡＰＩサービスコードから分離させることができ、アプリケーションランタイム環境の構築におけるモジュール化が可能となる。外部ＡＰＩサービスは、クライアントアプリケーションに「インポート」され、アプリケーションへの「実行時バインディング」を有するといわれる。したがって、アプリケーションは、インポートされたＡＰＩサービスを使用するためにその目的（ｉｎｔｅｎｔ）を宣言し、それに応じて、コンパイラは「スタブ」エントリをアプリケーションのインポートアドレステーブル（ＩＡＴ）内に自動的に生成することができる。インポートスタブを含むＩＡＴを、コンパイラによって生成することができる。これらのＩＡＴスタブは、インポートＡＰＩの名前、およびＡＰＩとやり取りする外部サービスまたはＤＬＬを識別する。アプリケーションがロードされるとき、あるいはそうでない場合は実行のために準備されるとき、実行時バインディングが実行され、ＩＡＴスタブは、正しいＡＰＩサービスを参照するように更新される。
【０００４】
図１は、アプリケーション１１０およびＡＰＩサービスプロバイダ１２０をリンクするための従来のシステム１００を例示する。アプリケーション１１０はコードセクション１１２およびＩＡＴ１１４を備える。コードセクション１１２には、プロシージャ、ここではＦｏｏをインポートするためのコール（ｃａｌｌ）がある。ＩＡＴ１１４は、ＡＰＩサービスプロバイダ１２０内のＦｏｏプロシージャのアドレスへのポインタを含む。従来のユーザーモードアプリケーションシミング技術は、ＩＡＴテーブルエントリを操作して機能の挿入を達成することに基づいている。これは、アプリケーションのＩＡＴ内のインポートされたＡＰＩのエントリを、元のＡＰＩサービスコードではなくシムコード（ｓｈｉｍ  ｃｏｄｅ）を指すように変更することによって、達成することができる。
【０００５】
図２は、アプリケーション１１０とＡＰＩサービスプロバイダ１２０間のシム（ｓｈｉｍ）１３０の従来のユーザーモード利用を例示する。シム１３０は、「付加価値」の利点をＡＰＩサービスに提供するように書くことができ、すなわち、シム１３０は、決して元のＡＰＩサービスプロバイダ１２０をコールしないように完全にＡＰＩサービス機能に取って代わることができる。ユーザーモードアプリケーションは、アプリケーションによって本質的に所有されるプロセス内で動作する。したがって、ただ１つのクライアント、アプリケーションがプロセス内に存在する。このことは、カーネルモードドライバが実行するシステムプロセスには当てはまらない。システムプロセスでは、オペレーティングシステムカーネルなど、ＡＰＩサービスプロバイダは、多数の異なる、実質的に固有のドライバによってコールされる。
【０００６】
図３を簡単に参照すると、例示的システムドライバの対話が例示されている。ドライバＸ３１０はコード３１２を有し、このコードはＩＡＴ３１４を利用して、オペレーティングシステムカーネル３３０内のＦｏｏプロシージャ３３２をインポートし、またはこれにリンクする。ドライバＹ３２０はコード３２２を有し、このコードはＩＡＴ３２４を使用して、システムカーネル３３０内のＶｅｒｉｆｉｅｒＦｏｏプロシージャ３３４をインポートし、またはこれにリンクし、次いでＶｅｒｉｆｉｅｒＦｏｏプロシージャ３３４は、同じくカーネル３３０内にあるＦｏｏプロシージャ３３２をコールする。両方のドライバは、ＦｏｏプロシージャまたはＡＰＩ３３２を呼び出すように書かれたが、ドライバＸのリンケージはドライバＹのリンケージのものとは異なる。ドライバＹは、そのＦｏｏインポートをビルトインシム、すなわちＶｅｒｉｆｉｅｒＦｏｏによってシムさせているが、ドライバＸはカーネル内の元のＦｏｏ  ＡＰＩに直接リンクされる。
【０００７】
シムのデベロッパーの１つの重要な目標は再利用性である。したがって、よいシムフレームワークは、可能であれば、シムの再利用をサポートするべきである。ある拡張サービスまたは解決（ｆｉｘ）を提供するシムが作成される場合、例えば、そのシムが正すように設計されている問題を発現する任意のアプリケーションに、そのシムが適用されることが望ましい。例えば、シムＸが問題Ｘを解決し、アプリケーションＡ、ＢおよびＣが問題Ｘを有する場合、シムＸにいかなる変更を行うこともなく、シムＸがアプリケーションＡ、ＢおよびＣを解決できるようにすることが望ましいであろう。しかし、一つには、上記のドライバＸおよびドライバＹのような異なるドライバが、しばしば異なるリンケージ構成を有するという事実も手伝って、このような共通シムを提供することは現時点まで可能ではなかった。また、従来のユーザーモードシムおよびシミングシステムは、ただ１つのリンケージ構成、すなわち最新のものしか保持できず、以前にシムされたドライバに関連付けられた他のリンケージ構成は失われる。さらに問題を複雑にしているのは、インポートされたＡＰＩまたはサービスのための既存のインフラストラクチャは、どのドライバがそのＡＰＩまたはサービスを利用中であるかについてのいかなるコンテキスト情報をも簡単に提供できないという事実である。
【０００８】
したがって、シムされる各アプリケーションまたはドライバに固有の複数のリンケージ構成、コンテキストを決定および維持することができる、シムシステムおよび方法が当技術分野において必要である。
【発明の開示】
【課題を解決するための手段】
【０００９】
以下で、本発明のいくつかの態様の基本的理解を提供するために、本発明の簡単な概要を提示する。この概要は本発明の広範な概要ではない。本発明の主要／重要な要素を識別すること、または本発明の範囲を線引きすることを意図するものではない。その唯一の目的は、後に提示するより詳細な説明への前置きとして、本発明のいくつかの概念を簡単な形態で提示することである。
【００１０】
本明細書で開示するものは、共通シムを利用してあるサービスを提供することができるようにするか、あるいは、複数のドライバまたは他の類似のアプリケーションに関連付けられた特定の問題を解決することができるように、ドライバ固有コンテキスト情報を確立および維持するシステムおよび方法である。固有コンテキスト情報は、ドライバとシムコンポーネントの間に常駐する中間コンテキストコンポーネントによってシミングシステムに投入される。コンテキストコンポーネントは、フックコンポーネントおよびサンクコンポーネントを含む。フックコンポーネントは、ドライバによって参照されたカーネルプロシージャに関するコンテキスト情報を格納し、ドライバをコンテキストコンポーネントにリダイレクトする。サンクコンポーネントは、コンテキストコンポーネントをシムコンポーネントにリンクし、シムコンポーネントにドライバ固有コンテキスト情報を提供する。次いで、シムはその機能を実行し、続いて、ドライバによって最初に参照されたカーネルプロシージャまたはサービスにリンクするかまたはジャンプすることができる。
【００１１】
本発明の別の態様によれば、ドライバ固有コンテキスト情報を実装しおよびサポートするシミングシステムが本明細書で開示される。より詳細には、このシステムは、ドライバがロードされるときを指示する通知信号を受信する、シムエンジンコンポーネントを備える。信号を受信すると、シムエンジンはシムデータベースに問い合わせて、いずれかのシムコンポーネントまたはシムパッケージが、ロードされたドライバに関連付けられるかどうかを判断することができる。その後、シムエンジンは、任意の関連付けられたシムコンポーネントをもロードし、ロードされたドライバに関連付けられたコンテキストコンポーネントを生成またはロードすることができる。加えて、本明細書で開示されたシミングシステムは、システムを監視し、システムクラッシュの際に、あるいは、不安定性または非効率性が検知される際にシムデータベースに問い合わせて、適用された場合にクラッシュ、不安定性または非効率性の原因である問題を解決または補償するであろうシムコンポーネントが使用可能であるかどうかを判断する診断コンポーネントを含むことができる。さらに、本発明の一態様によるシミングシステムは、インターフェイスコンポーネントを使用して、ユーザーまたはデベロッパーによるシムコンポーネントおよびパッケージの開発、配置および管理を容易にすることができる。
【００１２】
前述および関連する目的を達成するために、本発明のある例示的態様を、以下の説明および添付の図面に関連して本明細書で説明する。これらの態様は、本発明を実施することができる様々な方法を示し、その方法のすべては本発明によって包含されることを意図している。本発明の他の利点および新規な特徴は、以下の本発明の詳細な説明を、図面と共に考慮するとき、明らかになるであろう。
【００１３】
本発明の前述の態様および他の態様は、以下の詳細な説明、および図面の簡単な説明で簡単に説明する添付の図面から明らかになるであろう。
【発明を実施するための最良の形態】
【００１４】
ここで、本発明を添付の図面を参照して説明する。図面においては、全体を通し類似の番号は類似の要素を指す。しかし、図面および詳細な説明は、開示された特定の形態に本発明を限定することを意図するものではないことを理解されたい。むしろ、その意図は、本発明の精神および範囲内に入るすべての修正、同等物、および代替物を包含することである。
【００１５】
本出願で使用されるとき、「コンポーネント」および「システム」という用語は、コンピュータ関連エンティティで、ハードウェア、ハードウェアおよびソフトウェアの組み合わせ、ソフトウェアまたは実行中のソフトウェアのいずれかを指すことを意図している。例えば、コンポーネントは、それだけに限定されないが、プロセッサ上で実行するプロセス、プロセッサ、オブジェクト、実行可能ファイル、実行スレッド、プログラムおよび／またはコンピュータであってよい。例として、サーバー上で実行するアプリケーションおよびサーバーの両方を１つのコンポーネントにすることができる。１つまたは複数のコンポーネントは、プロセスおよび／または実行スレッド内に存在することができ、１つのコンポーネントを１つのコンピュータ上でローカライズすることができ、および／または、２つ以上のコンピュータの間で分散させることができる。
【００１６】
さらに、本発明を、標準のプログラミングおよび／またはエンジニアリング技術を使用して、ソフトウェア、ファームウェア、ハードウェアまたはそれらの任意の組み合わせをも作成する、方法、装置または製造品として実施することができる。本明細書で使用される「製造品」（または「コンピュータプログラム製品」）という用語は、任意のコンピュータ読み取り可能なデバイス、搬送波または媒体からアクセス可能なコンピュータプログラムを包含することを意図している。言うまでもなく、本発明の範囲または精神から逸脱することなく多くの修正をこの構成に行うことができることは、当業者には理解されよう。
【００１７】
図４を参照すると、本発明の一態様によるシミングシステム４００が例示されている。システム４００は、ドライバコンポーネント４１０、カーネルコンポーネント４２０、プロシージャ４２２（プロシージャ１、プロシージャ２からプロシージャＮ、ただしＮは１より大きい）、コンテキストコンポーネント４４０およびシムコンポーネント４３０を備える。ドライバコンポーネント４１０（本明細書で単にドライバとも称する）を使用して、ほぼいかなる機能をもコンピュータ上で実行することができるが、ドライバコンポーネントは通常、特定のハードウェアデバイスまたはソフトウェアの要素へのインターフェイスを提供するために使用される。ドライバコンポーネント４１０は、特定のデバイスまたはソフトウェアの部分に関連付けられた特別な命令および情報をカプセル化し、ユーザー（例えば、ハードウェア、ソフトウェア）に、汎用命令のセットへのアクセスを提供することができる。デバイスまたはソフトウェアは汎用コマンドを使用して、デバイスまたはソフトウェアコンポーネントと通信する。ドライバコンポーネント４１０は、受信された汎用命令を、デバイスまたはソフトウェアコンポーネントによって使用される専用命令に変換することができる。ドライバコンポーネントをオペレーティングシステムによって、ソフトウェアアプリケーションによって、あるいは、特定のデバイス（例えば、ディスクドライブ、プリンタ、スキャナ、キーボード、マウス、スピーカなど）に関連付けられたソフトウェアを介して提供することができる。ドライバコンポーネント４１０は、コンピュータシステム内で、ダイナミックリンクライブラリ（ＤＬＬ）ファイルとして実装することができる。ＤＬＬファイルは小型のファイルであり、より大型のプログラムまたはデバイスによって、特定の機能を実行するために利用される。例えば、ドライバコンポーネントまたはＤＬＬファイルは、プリンタなどの特定のデバイスに対するサポートを提供することができる。ドライバコンポーネントまたはＤＬＬファイルは、文書処理プログラムのようなより大型のプログラムによって使用することができ、そのドライバコンポーネントに関連付けられた特定のプリンタを利用するドキュメントの印刷を容易にする。
【００１８】
図５を少し参照すると、本発明の一態様によるドライバコンポーネント４１０がさらに詳細に例示されている。ドライバコンポーネント４１０は、ドライバコード４１２およびインポートアドレステーブル４１４を含んでいる。ドライバコード４１２は、ドライバコンポーネント４１０がドライバの機能を実装するために利用するソフトウェア指定プロシージャおよび機能に対応する。ドライバコンポーネント４１０はその有用性を高めると同時に、その全体のサイズを、カーネルコンポーネントによって提供される外部サービスまたはプロシージャ４２２（図４）を使用することによって、最小化することができる。ドライバコンポーネント４１０は、インポートアドレステーブル４１４を使用して外部プロシージャ４２２を「インポート」することによって、外部プロシージャ４２２にアクセスする。ドライバコンポーネント４１０がロードまたは実行されるとき、インポートテーブル内にリストされたプロシージャ４２２をドライバにバインドさせて、ドライバがその中で提供された機能およびプロシージャを利用できるようにすることができる。このバインディングを本明細書では、ドライバリンケージまたはリンポートリンケージと称する。
【００１９】
この詳細な説明はほぼまったくドライバおよびドライバコンポーネントだけに焦点を合わせるが、本発明の範囲はそのように限定されないことに留意されたい。本発明の範囲は、シムされることが可能である任意のアプリケーションまたはコンポーネント、ドライバまたはそうでないものに及ぶ。この説明はドライバおよびドライバコンポーネントに焦点を合わせるが、これは、シムされることが可能であるすべての他のソフトウェアアプリケーションを除外することを意味するのではなく、むしろ、混乱させるような用語（例えば、クライアント／アプリケーション／コンポーネント／ドライバ）のない、本発明の明瞭かつ理解可能な説明を手助けすることを意味する。
【００２０】
図４に戻ると、カーネルコンポーネント４２０は、コンピュータオペレーティングシステムの中核またはコアである。オペレーティングシステムは一般に、データの処理および入力および出力の管理を担う。カーネルコンポーネント４２０は、オペレーティングシステムの一部として最初にロードされ、メインメモリ内に残る。プロセス管理、ファイル管理およびメモリ管理を担うことに加えて、特にカーネルコンポーネント４２０は、アプリケーションおよびドライバによって必要とされた必須のサービスまたはプロシージャ４２２を提供する。プロシージャ４２２は、Ｉ／Ｏスケジューリング、バッファリング、スプーリングおよびエラーハンドリングに対応することができるが、それらに限定されない。さらに、本明細書で使用するようなカーネルモードサービスまたはカーネルモードプロシージャという用語は、カーネルアドレス空間内に位置する任意のサービス、プロシージャ、ドライバ、アプリケーションまたは他のコンポーネントに及ぶことを意図していることに留意されたい。
【００２１】
シムコンポーネント４３０は追加の機能を、ドライバコンポーネント４１０とカーネルサービスまたはプロシージャ４２２の間に提供する。本発明の一態様によれば、このような機能は、障害のあるドライバに対する解決（ｆｉｘ）に対応することができるが、シムコンポーネント４３０はまた、原因分析を支援するための診断シムとして利用することもできる。障害のあるドライバは、多数のシステムクラッシュ、および、通常は誤ってオペレーティングシステムによるものとされる負のコンピュータエクスペリエンス（例えば、遅延、ロックアップなど）をもたらす他の問題の原因となる可能性がある。シムコンポーネント４３０は、ドライバの障害を補償することによって、ドライバの振る舞いを解決するためのメカニズムを提供する。したがって、シムコンポーネント４３０は、１つまたは複数のドライバコンポーネント４１０と、望ましいプロシージャ４２２を有するカーネルコンポーネントの間に存在する。しかし、従来のシミングシステムとは異なり、本発明はまたコンテキストコンポーネント４４０をも使用する。
【００２２】
コンテキストコンポーネント４４０は、ドライバシステムコールと共通シムコンポーネント４３０の間の中間コンポーネントである。コンテキストコンポーネント４４０は、固有のドライバ毎のリンケージ情報を確立しおよび維持するためのメカニズムを提供する。従来のシミングシステムは、シムコンポーネントをコールする各ドライバのためのコンテキストを確立せず、むしろ、シム自体に埋め込まれたただ１つのリンケージ構成、具体的には最後にシムされたドライバのリンキング構成のみを保持する。したがって、以前にシムされたドライバに関係するすべてのシムリンケージ構成データは失われる。図６を参照すると、本発明の一態様によるコンテキストコンポーネント４４０がさらに詳細に例示され、このコンテキストコンポーネント４４０は、フックコンポーネント４４２およびサンクコンポーネント４４４を含んでいる。
【００２３】
フックコンポーネント４４２を、対象ドライバのローディング中に構築することができる。フックコンポーネント４４２はコンテキスト情報を、シムされるドライバから検索し（例えば、後述のシムエンジンコンポーネントを使用）、このような情報をサンクコンポーネント４４４に対し使用可能にする。詳細には、フックコンポーネント４４２は、ドライバによって利用されるためにカーネルプロシージャまたはサービスのアドレスを、ドライバのインポートアドレステーブル（ＩＡＴ）から検索することができる。さらに、フックコンポーネント４４２は、利用されるシムのアドレスを決定することができる。次いで、このコンテキストデータをデータ構造内に、後にサンクコンポーネント４４４およびシムコンポーネント４３０によってアクセスするために、格納することができる。サンクコンポーネント４４４は、フックコンポーネント４４２によって検索された情報を利用して、ドライバのインポートアドレステーブルを、最初に指定されたサービスまたはプロシージャではなくシムのロケーションを指すかまたは参照するように変更する。さらに、サンクコンポーネント４４４はシムコンポーネント４３０に、シムコンポーネント４３０をコールするドライバに関係するコンテキスト情報へのアクセスを提供する。コンテキスト情報をシムコンポーネント４３０に提供することができ、これは、このような情報または情報のロケーションをプロシージャパラメータとして渡すか、あるいはこのデータを、シムコンポーネント４３０によって知られている特定のロケーションに格納することによって行う。次いで、シムコンポーネント４３０はこの情報を利用して、コール側ドライバの最初に参照したカーネルプロシージャを検索することができる。続いて、シムコンポーネント４３０は、追加機能（例えば、ドライバフィックス（ｄｒｉｖｅｒ  ｆｉｘ））を提供した後、最初の参照プロシージャまたはサービスに向けてチェーン（ｃｈａｉｎ）することができる。
【００２４】
図７を参照すると、本発明の一態様による例示的システム７００のブロック図が例示される。システム７００は、２つの異なるドライバコンポーネントの間のコンテキストコンポーネントの使用を示す。ドライバＸ７１０およびドライバＹ７２０はそれぞれドライバコード７１２および７２２、ならびに、インポートアドレステーブル７１４および７２４を含む。さらに、各ドライバはコンテキストコンポーネント７３０および７４０に関連付けられる。共通シムコンポーネント７５０が利用されて、追加機能が、これらのドライバとカーネルコンポーネントプロシージャＦｏｏ７６２およびＶｅｒｉｆｉｅｒＦｏｏ７６４の間に提供される。ドライバＸ７１０は、Ｆｏｏプロシージャ７６２をそのコードセクション７１２内で利用する。したがって、ドライバＸのインポートアドレステーブル７１４内に、カーネルプロシージャ７６２を含むメモリロケーションを指すポインタがある。しかし、ここでは、シムコンポーネント７５０が、例えばドライバＸ７１０の問題を補償する追加機能を提供するために使用されている。本発明の一態様によれば、コンテキストコンポーネント７３０もまた、ドライバ固有コンテキスト情報をシムコンポーネント７５０に提供するために使用される。コンテキストコンポーネント７３０は、フックコンポーネント７３２およびサンクコンポーネント７３４を含んでいる。フックコンポーネント７３２は、インポートアドレステーブル７１４内で最初にＦｏｏを参照するポインタを、ドライバＸによるＦｏｏプロシージャの、コンテキストコンポーネント７３０へのインポートを指すかまたはリンクするように変更する。加えて、コンテキストコンポーネント７３０はシムコンポーネント７５０のメモリアドレスを受信し、特に、シムコンポーネント７５０へのポインタ、および、最初に参照されたカーネルプロシージャＦｏｏ７６２へのポインタを、データ構造、ここではフックストラクト（Ｈｏｏｋ  ｓｔｒｕｃｔ）内に格納する。このように、フックストラクトはドライバコンテキスト情報を含む。サンクコンポーネント７３４はこの情報を利用してシムコンポーネント７５０にジャンプし、シムコンポーネント７５０にコンテキストデータを提供する。ジャンプが完了した後、シムコンポーネント７５０はその機能を実行し、次いでコンテキストデータを利用して元のプロシージャコールＦｏｏ７６２にリンクし、最終的にこれを実行する。
【００２５】
ドライバＹ７２０は、共通シムコンポーネント７５０を有する類似のプロセスを通過する。しかし、この場合、ドライバＹ７２０はそれ自体のコンテキストコンポーネント７４０および異なるプロシージャコールを利用する。ドライバＹ７２０は最終的にＦｏｏプロシージャ７６２をコールすることを求めるが、図のようにここでは、ＶｅｒｉｆｉｅｒＦｏｏプロシージャ７６４をコールした後である。ドライバコンテキストコンポーネント７４０のフックコンポーネント７４２は、シムコンポーネント７５０によってコールされたプロシージャに関係する情報を決定し保存する。サンクコンポーネント７４４は、ドライバＹのインポートアドレステーブル７２４内の参照アドレスを変更することによって、ドライバをシムコンポーネント７５０にリンクする。その後、ドライバＹ７２０がＦｏｏプロシージャをそのコードセクション７２２内でコールするとき、コントロールはコンテキストコンポーネント７４０に移される。次いで、コンテキストコンポーネントは、コンテキスト情報へのポインタをレジスタに格納し、あるいは代替手段により、コンテキスト情報のロケーションまたはコンテキスト情報自体をシムコンポーネント７５０に転送する。次いで、シムコンポーネント７５０はその機能を実行し、次いでコンテキスト情報を使用して、ベリファイヤプロシージャ７６４にジャンプし、ベリファイヤプロシージャ７６４が実行して、Ｆｏｏプロシージャ７６２にジャンプする。各ドライバのためのコンテキストデータを検索および維持することによって、本発明は、以前にシムされたドライバのためのコンテキストデータが、別のドライバによるシムの利用またはコールの際に失われないことを保証することに留意されたい。従来のシミング実行は、ドライバＹ７２０の実行の際にドライバＸ７１０のコンテキストに関する情報を失っていたであろう。この場合、ドライバＸ７１０がドライバＹ７２０の後に再度コールされた場合、従来のシムは、どのプロシージャをドライバＸ７１０が最初に参照したか分からない。これは、コンテキストデータが保持されなかったからであり、また、ドライバインポートアドレステーブル内の参照が、シムコンポーネント７５０を参照するように変更されたからである。本発明はこの問題を、各ドライバコンポーネントについての固有コンテキスト情報を格納することによって解消する。
【００２６】
図８は、本発明の一態様による、シムを利用するためのシステム８００を示す。システム８００は、ドライバローダコンポーネント８１０、シムエンジンコンポーネント８２０、シムデータベース８３０、診断コンポーネント８４０、およびインターフェイスコンポーネント８５０を備える。ドライバローダコンポーネント８１０は、信号をエンティティ（例えば、人、アプリケーション、デバイス、プラグアンドプレイコンポーネントなど）から受信して、ドライバをロードする。ドライバローダコンポーネント８１０はドライバ初期リンケージを確立し、ターゲットドライバをメモリに、実行のためにロードする。ローダコンポーネント８１０は、ドライバが外部ＡＰＩまたはプロセスのために有することができる任意の未解決の動的参照をも解決することができ、すべての参照が解決されるとき、通知信号を生成することができる。通知信号はとりわけ、シムエンジンコンポーネント８２０にロードされているドライバの識別を提供する。このような通知のシグナリングにより、他のサービスが、ドライバロードプロシージャ中に、ドライバがコールされる直前にコントロールを受信することができる。シムエンジンコンポーネントは通知信号を受信し、その中に含まれた情報を利用してシムデータベース８３０に問い合わせて、ターゲットドライバがシムされるべきであるかどうかを判断する。シムデータベース８３０は、どのドライバがシムされる必要があるか、および、どのシムコンポーネントが特定のドライバに適用されるべきであるかに関するデータのための、中央リポジトリとしての機能を果たす。シムエンジンコンポーネント８２０が、少なくともシムデータベース８３０を利用して、ドライバがシムされるべきであると判断する場合、シムエンジンコンポーネントは、適用されるべきシムのセットまたはシムパッケージを識別し、これらをロードし（すでにロードされていない場合）、シムが固有のコンテキストを初期化できるようにする。続いて、シムエンジンコンポーネント８２０はターゲットドライバＡＰＩインポートを、１つまたは複数のシムコンポーネントにリダイレクトすることができる。
【００２７】
システム８００はまた診断コンポーネント８４０も含むことができ、診断コンポーネント８４０はコンピュータシステムを解析し、是正処置を開始する。本発明の一態様によれば、診断コンポーネント８４０は、システムクラッシュの原因分析において支援する。したがって、診断コンポーネントは、システムダンプ情報および／またはプログラムトレースを解析する様々な方法（例えば、エキスパートシステム、ニューラルネットワークなどを利用）を使用して、クラッシュの原因を決定することができる。しかし、診断コンポーネント８４０は、システムクラッシュを待つ必要はない。診断コンポーネント８４０はまたプロアクティブになり、システムの不安定性および／または非効率性を検出するためのシステム解析に従事することもできる。クラッシュの原因を決定、あるいは、システムの不安定性および／または非効率性を検出した際に、是正処置を診断コンポーネント８４０によって開始することができる。このような是正処置には、インターフェイス８５０を介してユーザーまたはオペレータに通知を提供することを含めることができる。是正処置はまた、シムデータベース８３０をサーチして、適用された場合に、検出された問題、不安定性または非効率性をフィックスすることができるシムコンポーネントがすでに存在するかどうかを判断することも備えることができる。このような判断は、ベイズネットワーク（Ｂａｙｅｓｉａｎ  ｎｅｔｗｏｒｋｓ）、ニューラルネットワーク、判定ツリー、サポートベクトルマシン、線形および非線形回帰、および／または他の学習モデルを使用して、インテリジェントに行うことができる。本発明の一態様によれば、診断コンポーネントは、不正確な診断を行うこと、および／または、是正の利点に不利になる誤ったシムを選択することのコストに基づいた、確率論的解析に従事することができる。信頼水準をデベロッパーまたはユーザーによって使用および指定して、診断コンポーネントの処置をコントロールすることができる。
【００２８】
インターフェイスコンポーネント８５０は、ユーザーがシムデータベース８３０と対話できるようにする。本発明の一態様によれば、インターフェイスコンポーネント８５０はグラフィカルユーザーインターフェイス（ＧＵＩ）であり、ドライバのためのシムコンポーネントまたはシムパッケージの作成、および、シムコンポーネントまたはシムパッケージをシムデータベース８３０に格納することを容易にする。例えば、インターフェイスコンポーネント８５０を、検出された問題、不安定性または非効率性を改善するためのシムコンポーネントの生成に役立つ一連のステップをユーザーにグラフィカルウィンドウ内で提示する、ウィザードにすることができる。インターフェイスコンポーネント８５０はまたデベロッパーまたはユーザーに、問題の際に決定または収束（ｃｏｎｖｅｒｇｅ）するためのオペレーションシーケンスの理解を支援することができる診断シムコンポーネントを開発し配置するための手段を提供することもできる。
【００２９】
上述の例示的システムに鑑みて、本発明により実施することができる方法は、図９〜１１の流れ図を参照してよりよく理解されるであろう。説明を簡単にするために、この方法を一連のブロックとして示し説明するが、本発明はブロックの順序によって限定されず、これは、いくつかのブロックは本発明によれば、本明細書に示し説明するものとは異なる順序で、かつ／または、他のブロックと同時に発生することができるからであることを理解されたい。また、例示されたブロックのすべてが、本発明によるこの方法を実施するために必要であるとは限らない場合がある。
【００３０】
加えて、以下および本明細書の全体に渡って開示された方法は、このような方法をコンピュータに移送および転送することを容易にするために製造品上に格納することができることを、さらに理解されたい。製造品という用語は、使用されるとき、任意のコンピュータ読み取り可能な装置、搬送波または媒体からもアクセス可能なコンピュータプログラムを包含することを意図している。
【００３１】
図９を見ると、本発明の一態様によるカーネルモードドライバをシムするための方法９００が示される。９１０で、いくつかのドライバに共通のシムコンポーネントが生成される。共通シムコンポーネントは、機能を１つまたは複数のドライバに追加して、例えば、１つまたは複数のドライバに関連付けられた障害を補償するようにするための、有効なメカニズムを提供する。シムコンポーネントを、プログラムエディタおよび／またはグラフィカルユーザーインターフェイスを使用して生成することができる。別法として、無数のウィンドウ、および、ボタン、スクロールバー、テキストボックスなどのグラフィカルインターフェイスコンポーネントを利用してシムコンポーネントを生成することに関連付けられた一連のステップ中で、ユーザーまたはデベロッパーをガイドするウィザードを使用して、シムコンポーネントを生成することができる。９２０で、ドライバ固有コンテキストデータが、シムされる各ドライバについて生成される。続いて９３０で、ドライバ固有コンテキストが共通シムに提供される。固有コンテキストデータにより、共通シムコンポーネントは、そのシムコンポーネントを利用中であるドライバを識別できるようになる。これにより、シムコンポーネントが追加機能を追加し、次いで、ドライバによって利用されたカーネルモードサービスまたはプロシージャに向けてチェーンすることができ、したがって、ドライバの実行のチェーンをそのままにする。
【００３２】
図１０は、本発明の一態様によるカーネルモードドライバをシムするための方法１０００を例示する流れ図である。１０１０で、複数のドライバに共通のシムコンポーネントが生成される。上述のように、シムコンポーネントは、機能をドライバに追加して、例えば、ある障害（例えば、制限されたメモリを参照するなど）を補償するための、有効なメカニズムを提供する。しかし、シムコンポーネントを、システム問題を決定し、その位置を正確に示すためのツールとして利用することができることにも留意されたい。シムコンポーネントを、いくつかのメソッド、コンポーネントおよびデバイスのうち１つを使用して、例えば、ＧＵＩまたはウィザードを使用して生成することができる。１０２０で、ドライバのインポートされたＡＰＩまたはカーネルモードサービスが、ドライバインポートアドレステーブルから検索される。続いて１０３０で、そのインポートアドレステーブル内のドライバＡＰＩサービス参照が、シムコンポーネントへのポインタで置き換えられる。１０４０で、置き換えられたＡＰＩまたはカーネルモードサービスが次いでシムに提供される。このコンテキスト情報をシムコンポーネントに、シムをコールする機能またはプロシージャにおけるパラメータとしてこのコンテキスト情報を使用することによって、また、このコンテキスト情報を特定のメモリロケーションにロードすることなどによって、提供することができる。したがって、共通シムコンポーネントに関連付けられたドライバはシムコンポーネントにリンクされるようになり、シムコンポーネントは次いで、その追加の追加機能を実行した後、ＡＰＩまたはカーネルモードサービスに向けてチェーンすることができる。
【００３３】
図１１は、本発明の一態様によるカーネルモードドライバを修正する方法１１００を示す。１１１０で、ドライバがロードされたことを指示する信号が受信される。本発明の一態様によれば、この信号をドライバローダコンポーネントによって、このドライバが外部ＡＰＩのために有することができる任意の未解決の動的参照をも解決した後、生成することができる。このような通知により、他のサービスは、ドライバのドライバエントリがコールされる直前にコントロールを受信することができる。１１２０で、問い合わせがシムデータベース上で実行されて、ドライバがシムされるべきものであるかどうかが判断される。次いで１１３０で、このドライバがシムされるべきであるかどうかについての判断が、ドライバに関連付けられたシムコンポーネントの存在または非存在に基づいて行われる。このドライバに関連付けられたシムがない場合、プロシージャは終了される。しかし、このドライバに関連付けられた１つまたは複数のシムがある場合、プロセスは１１４０に進み、固有のドライバコンテキストが初期化およびロードされる。続いて１１５０で、ドライバが、カーネルモードサービスまたはプロシージャなどのドライバインポートエントリではなく、シムコンポーネントにリダイレクトされる。このようなリダイレクトは、ドライバのインポートアドレステーブル内のエントリを、シムコンポーネントへのポインタで置き換えることによって、実施することができる。その後、シムコンポーネントは固有のドライバコンテキストを利用して、置き換えられたドライバインポートエントリに向けてチェーンすることができるが、そうする必要はない。
【００３４】
本発明の様々な態様のための状況を提供するために、図１２ならびに以下の考察は、本発明の様々な態様を実施することができる適切なコンピューティング環境の簡単な全体的説明を提供することを意図している。本発明を一般に、１台のコンピュータおよび／または複数のコンピュータ上で実行するコンピュータプログラムのコンピュータ実行可能命令との関連で上述したが、本発明を他のプログラムモジュールとの組み合わせで実施することもできることは、当業者には理解されよう。一般に、プログラムモジュールには、ルーチン、プログラム、コンポーネント、データ構造などが含まれ、これらは特定のタスクを実行するか、かつ／または、特定の抽象データ型を実装する。また、本発明の方法を他のコンピュータシステム構成により実施することができ、これらの構成には、シングルプロセッサまたはマルチプロセッサコンピュータシステム、ミニコンピュータデバイス、メインフレームコンピュータ、ならびに、パーソナルコンピュータ、ハンドヘルドコンピューティングデバイス、マイクロプロセッサベースまたはプログラマブルコンシューマエレクトロニクスなどが含まれることは、当業者には理解されよう。本発明の例示した態様をまた分散コンピューティング環境で実施することもでき、この環境ではタスクが、通信ネットワークを通じてリンクされるリモート処理装置によって実行される。しかし、本発明の、すべてではない場合はいくつかの態様を、スタンドアロンコンピュータ上で実施することができる。分散コンピューティング環境では、プログラムモジュールはローカルおよびリモートのメモリストレージデバイス内に位置することができる。
【００３５】
図１２を参照すると、本発明の様々な態様を実施するための例示的環境１２１０には、コンピュータ１２１２が含まれる。コンピュータ１２１２には、処理装置１２１４、システムメモリ１２１６、およびシステムバス１２１８が含まれる。システムバス１２１８は、それだけに限定されないが、システムメモリ１２１６を含むシステムコンポーネントを処理装置１２１４に結合する。処理装置１２１４を様々な使用可能なプロセッサのいずれにすることもできる。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャも、処理装置１２１４として使用することができる。
【００３６】
システムバス１２１８を、いくつかのタイプのバス構造のいずれにすることもでき、これらのバス構造には、様々な使用可能なバスアーキテクチャのいずれかを使用するメモリバスまたはメモリコントローラ、周辺バスまたは外部バス、および／またはローカルバスが含まれ、このようなバスアーキテクチャには、それだけに限定されないが、１１ビットバス、業界標準アーキテクチャ（ＩＳＡ）、マイクロチャネルアーキテクチャ（ＭＣＡ）、拡張ＩＳＡ（ＥＩＳＡ）、Ｉｎｔｅｌｌｉｇｅｎｔ  Ｄｒｉｖｅ  Ｅｌｅｃｔｒｏｎｉｃｓ（ＩＤＥ）、ＶＥＳＡローカルバス（ＶＬＢ）、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）、ユニバーサルシリアルバス（ＵＳＢ）、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔ（ＡＧＰ）、Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ  Ｍｅｍｏｒｙ  Ｃａｒｄ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ａｓｓｏｃｉａｔｉｏｎバス（ＰＣＭＣＩＡ）およびＳｍａｌｌ  Ｃｏｍｐｕｔｅｒ  Ｓｙｓｔｅｍｓ  Ｉｎｔｅｒｆａｃｅ（ＳＣＳＩ）が含まれる。
【００３７】
システムメモリ１２１６には、揮発性メモリ１２２０および不揮発性メモリ１２２２が含まれる。基本入出力システム（ＢＩＯＳ）は、起動中など、コンピュータ１２１２内の複数の要素の間で情報を転送するための基本ルーチンを含み、不揮発性メモリ１２２２に格納される。例示のため、限定ではなく、不揮発性メモリ１２２２には、読み出し専用メモリ（ＲＯＭ）、プログラマブルＲＯＭ（ＰＲＯＭ）、電気的プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能ＲＯＭ（ＥＥＰＲＯＭ）、またはフラッシュメモリを含めることができる。揮発性メモリ１２２０にはランダムアクセスメモリ（ＲＡＭ）が含まれ、これは外部キャッシュメモリとしての機能を果たす。例として、限定ではなく、ＲＡＭは多数の形態において使用可能であり、これらの形態は、シンクロナスＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、シンクロナスＤＲＡＭ（ＳＤＲＡＭ）、ダブルデータレートＳＤＲＡＭ（ＤＤＲ  ＳＤＲＡＭ）、拡張ＳＤＲＡＭ（ＥＳＤＲＡＭ）、シンクリンクＤＲＡＭ（ＳＬＤＲＡＭ）、およびダイレクトＲａｍｂｕｓ（登録商標）  ＲＡＭ（ＤＲＲＡＭ）などである。
【００３８】
コンピュータ１２１２はまた、リムーバブル／非リムーバブル、揮発性／不揮発性のコンピュータストレージメディアも含む。図１２は、例えば、ディスクストレージ１２２４を例示する。ディスクストレージ１２２４には、それだけに限定されないが、磁気ディスクドライブ、フロッピー（登録商標）ディスクドライブ、テープドライブ、Ｊａｚドライブ、Ｚｉｐドライブ、ＬＳ−１００ドライブ、フラッシュメモリカードまたはメモリスティックが含まれる。加えて、ディスクストレージ１２２４はストレージメディアを別々に、あるいは、他のストレージメディアと組み合わせて含むことができ、これらのメディアには、それだけに限定されないが、コンパクトディスクＲＯＭデバイス（ＣＤ−ＲＯＭ）、ＣＤレコーダブルドライブ（ＣＤ−Ｒドライブ）、ＣＤ書き換え可能ドライブ（ＣＤ−ＲＷドライブ）またはデジタル多用途ディスクＲＯＭドライブ（ＤＶＤ−ＲＯＭ）など、光ディスクドライブが含まれる。ディスクストレージデバイス１２２４をシステムバス１２１８に接続することを容易にするために、インターフェイス１２２６など、リムーバブルまたは非リムーバブルインターフェイスが通常は使用される。
【００３９】
図１２は、ユーザーと、適切なオペレーティング環境１２１０で説明した基本コンピュータリソースの間の、媒介物の機能を果たすソフトウェアを説明することを理解されたい。このようなソフトウェアにはオペレーティングシステム１２２８が含まれる。オペレーティングシステム１２２８をディスクストレージ１２２４上に格納することができ、オペレーティングシステム１２２８は、コンピュータシステム１２１２のリソースをコントロールし、割り振るように動作する。システムアプリケーション１２３０は、システムメモリ１２１６内またはディスクストレージ１２２４上に格納されたプログラムモジュール１２３２およびプログラムデータ１２３４を通じて、オペレーティングシステム１２２８によるリソースの管理を利用する。本発明を様々なオペレーティングシステムまたはオペレーティングシステムの組み合わせにより実施することができることを理解されたい。
【００４０】
ユーザーはコマンドまたは情報をコンピュータ１２１２へ、入力デバイス１２３６を通じて入力する。入力デバイス１２３６には、それだけに限定されないが、マウスなどのポインティングデバイス、トラックボール、スタイラス、タッチパッド、キーボード、マイクロフォン、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナ、ＴＶチューナカード、デジタルカメラ、デジタルビデオカメラ、ウェブカメラなどが含まれる。これらおよび他の入力デバイスは処理装置１２１４へ、システムバス１２１８を通じて、インターフェイスポート１２３８を介して接続する。インターフェイスポート１２３８には、例えば、シリアルポート、パラレルポート、ゲームポートおよびユニバーサルシリアルバス（ＵＳＢ）が含まれる。出力デバイス１２４０は、入力デバイス１２３６と同じタイプのポートのいくつかを使用する。したがって、例えば、ＵＳＢポートを使用して入力をコンピュータ１２１２に提供し、情報をコンピュータ１２１２から出力デバイス１２４０に出力することができる。出力アダプタ１２４２が提供されて、他の出力デバイス１２４０の中でも特殊なアダプタを必要とするモニタ、スピーカおよびプリンタのようないくつかの出力デバイス１２４０があることが例示される。出力アダプタ１２４２には、例として、限定ではなく、ビデオおよびサウンドカードが含まれ、これらは出力デバイス１２４０とシステムバス１２１８の間の接続の手段を提供する。リモートコンピュータ１２４４など、他のデバイスおよび／またはデバイスのシステムが入力および出力機能を提供することに留意されたい。
【００４１】
コンピュータ１２１２はネットワーク環境において、リモートコンピュータ１２４４など、１つまたは複数のリモートコンピュータへの論理接続を使用して動作することができる。リモートコンピュータ１２４４は、パーソナルコンピュータ、サーバー、ルーター、ネットワークＰＣ、ワークステーション、マイクロプロセッサベースのアプライアンス、ピアデバイスまたは他の共通ネットワークノードなどにすることができ、通常は、コンピュータ１２１２に関連して上述した要素の多数またはすべてが含まれる。簡潔にするため、メモリストレージデバイス１２４６のみをリモートコンピュータ１２４４と共に例示する。リモートコンピュータ１２４４はコンピュータ１２１２に、ネットワークインターフェイス１２４８を通じて論理的に接続され、次いで通信接続１２５０を介して物理的に接続される。ネットワークインターフェイス１２４８は、ローカルエリアネットワーク（ＬＡＮ）およびワイドエリアネットワーク（ＷＡＮ）など、通信ネットワークを包含する。ＬＡＮ技術には、ファイバー分散データインターフェイス（ＦＤＤＩ）、Ｃｏｐｐｅｒ  Ｄｉｓｔｒｉｂｕｔｅｄ  Ｄａｔａ  Ｉｎｔｅｒｆａｃｅ（ＣＤＤＩ）、イーサネット（登録商標）／ＩＥＥＥ  １１０２．３、トークンリング／ＩＥＥＥ  １１０２．５などが含まれる。ＷＡＮ技術には、それだけに限定されないが、ポイントツーポイントリンク、統合デジタルサービス通信網（ＩＳＤＮ）およびその変形形態のような回線交換網、パケット交換網およびデジタル加入者線（ＤＳＬ）が含まれる。
【００４２】
通信接続１２５０は、ネットワークインターフェイス１２４８をバス１２１８に接続するために使用されるハードウェア／ソフトウェアを指す。通信接続１２５０を、例示的に明瞭にするためにコンピュータ１２１２内に示すが、通信接続１２５０をコンピュータ１２１２の外部にすることもできる。ネットワークインターフェイス１２４８への接続のために必要なハードウェア／ソフトウェアには、例示のためにのみ、内部および外部技術が含まれ、これは、通常の電話グレードのモデム、ケーブルモデムおよびＤＳＬモデムを含むモデム、ＩＳＤＮアダプタおよびイーサネット（登録商標）カードなどである。
【００４３】
上述したものには本発明の実施例が含まれる。言うまでもなく、本発明を説明するためのコンポーネントまたは方法のあらゆる考えられる組み合わせを説明することは可能ではないが、本発明の多数のさらなる組み合わせおよび置換が可能であることは、当業者には理解されよう。したがって、本発明は、添付の特許請求の範囲の精神および範囲内に入るこのようなすべての変更、修正および変形形態を包含することを意図している。さらに、「含む」という用語が詳細な説明または特許請求の範囲において使用される範囲で、このような用語は、「備える」という用語が、特許請求の範囲内の前後を接続させる語として使用されるときに解釈されるときの「備える」と同様に、包含的であるように意図される。
【図面の簡単な説明】
【００４４】
【図１】アプリケーションをアプリケーションサービスプロバイダにリンクするためのシステムのブロック図である。
【図２】従来のシミングシステムを例示するブロック図である。
【図３】システムカーネルと対話するためのシステムを示すブロック図である。
【図４】本発明の一態様によるカーネルモードドライバシミングシステムを例示するブロック図である。
【図５】本発明の一態様によるドライバコンポーネントのブロック図である。
【図６】本発明の一態様によるコンテキストコンポーネントのブロック図である。
【図７】本発明の一態様によるコンテキストコンポーネントの例示的利用を例示するブロック図である。
【図８】本発明の一態様によるカーネルモードドライバシミングのためのシステムを示すブロック図である。
【図９】本発明の一態様によるカーネルモードドライバをシムする方法を例示する流れ図である。
【図１０】本発明の一態様によるカーネルモードドライバをシムする方法を示す流れ図である。
【図１１】本発明の一態様によるカーネルモードドライバをシムするための方法を例示する流れ図である。
【図１２】本発明の一態様による適切なオペレーティング環境を例示する概略ブロック図である。
【符号の説明】
【００４５】
１１０  Ａｐｐｌｉｃａｔｉｏｎ．ｅｘｅコード
１１４  インポートアドレステーブル（ＩＡＴ）
３１０  ドライバＸ
３１２  ＤｒｉｖｅｒＸ．ｓｙｓコード
３１４  インポートアドレステーブル（ＩＡＴ）
３２０  ドライバＹ
３２２  ＤｒｉｖｅｒＹ．ｓｙｓコード
３２４  インポートアドレステーブル（ＩＡＴ）
３３０  ＯＳカーネル
４１０  ドライバコンポーネント
４１２  ドライバコード
４１４  インポートアドレステーブル
４２０  カーネル
４２２  プロシージャ１、プロシージャ２、プロシージャＮ
４３０  シムコンポーネント
４４０  コンテキストコンポーネント
４４２  フックコンポーネント
４４４  サンクコンポーネント
７１０  ドライバＸ
７１２  ＤｒｉｖｅｒＸ．ｓｙｓコード
７１４  インポートアドレステーブル（ＩＡＴ）
７２０  ドライバＹ
７２２  ＤｒｉｖｅｒＹ．ｓｙｓコード
７２４  インポートアドレステーブル（ＩＡＴ）
７３０  ドライバＸのコンテキストコンポーネント
７４０  ドライバＹのコンテキストコンポーネント
７６０  ｏｓｋｒｎｌ．ｅｘｅコード
８１０  ドライバローダコンポーネント
８２０  シムエンジンコンポーネント
８３０  シムデータベース
８４０  診断コンポーネント
８５０  インターフェイスコンポーネント
１２１４  処理装置
１２１６  システムメモリ
１２１８  バス
１２２０  揮発性メモリ
１２２２  不揮発性メモリ
１２２４  ディスクストレージ
１２２６  インターフェイス
１２２８  オペレーティングシステム
１２３０  アプリケーション
１２３２  モジュール
１２３４  データ
１２３６  入力装置
１２３８  インターフェイスポート
１２４０  出力装置
１２４２  出力アダプタ
１２４４  リモートコンピュータ
１２４６  メモリストレージ
１２４８  ネットワークインターフェイス
１２５０  通信接続
【図１】
0004615971.tif 000002
【図２】
0004615971.tif 000003
【図３】
0004615971.tif 000004
【図４】
0004615971.tif 000005
【図５】
0004615971.tif 000006
【図６】
0004615971.tif 000007
【図７】
0004615971.tif 000008
【図８】
0004615971.tif 000009
【図９】
0004615971.tif 000010
【図１０】
0004615971.tif 000011
【図１１】
0004615971.tif 000012
【図１２】
0004615971.tif 000013