マルウェアについてコンピュータシステムをスキャンする方法であって、前記コンピュータシステム上で実行されているアプリケーションがファイルを開こうとしているときを判断するステップと、前記アプリケーションによって前記開いているファイルに書き込まれるデータをマルウェアスキャナキューに追加するステップと、前記キューイングされたファイルデータが潜在的なマルウェアに関係するかどうかを判断するために前記キューイングされたファイルデータをスキャンする前に、前記ファイルが閉じられていることが、前記アプリケーションに通知されていることを保証するステップとを含む、方法。前記コンピュータシステム上で実行されているアプリケーションがファイルを開こうとしているときを判断する前記ステップが、新規ファイルを生成するように、または既存ファイルを開くように要求するメッセージをインターセプトするステップを含む、請求項1に記載の方法。前記ファイルに割り当てられたハンドルを取得するために、任意の検出されたファイルオープン要求メッセージに対する応答をインターセプトするステップをさらに含む、請求項2に記載の方法。前記ファイルオープン要求メッセージが、IRP_MJ_CREATE関数コードを含んでいるI/O要求パケットIRPである、請求項2または3に記載の方法。前記アプリケーションによって前記開いているファイルに書き込まれるデータをマルウェアスキャナキューに追加する前記ステップが、前記アプリケーションによって前記開いているファイルに前記データが書き込まれるときに、前記データをコピーするステップと、前記コピーされたファイルデータを前記マルウェアスキャナキューに追加するステップとを含む、請求項1~4のいずれかに記載の方法。前記アプリケーションによって前記開いているファイルに前記データが書き込まれるときに、前記データをコピーする前記ステップが、前記ファイルにデータを書き込むように要求するメッセージをインターセプトし、前記要求中で特定された前記データをコピーするステップを含む、請求項5に記載の方法。前記データ書込み要求メッセージが、IRP_MJ_CREATE関数コードを含んでいるI/O要求パケットIRPである、請求項6に記載の方法。前記アプリケーションが、前記コピーされたファイルデータを前記マルウェアスキャナキューに追加する前に、前記ファイルを閉じ始めたかどうかを判断するステップをさらに含む、請求項5~7のいずれかに記載の方法。前記アプリケーションが前記ファイルを閉じ始めたかどうかを判断する前記ステップが、前記ファイルを閉じるように要求するメッセージをインターセプトするステップを含む、請求項8に記載の方法。前記ファイルクローズ要求メッセージが、IRP_MJ_CLEANUP関数コードまたはIRP_MJ_CLOSE関数コードを含んでいるI/O要求パケットIRPである、請求項9に記載の方法。前記アプリケーションによって前記開いているファイルに書き込まれるデータをマルウェアスキャナキューに追加する前記ステップが、前記ファイルのロケーションを記録するステップと、前記記録されたファイルロケーションを前記マルウェアスキャナキューに追加するステップとを含む、請求項1~10のいずれかに記載の方法。前記ファイルのロケーションを記録する前記ステップが、前記ファイルにデータが書き込むように要求するメッセージをインターセプトし、前記要求中で特定された前記ファイルロケーションを記録するステップを含む、請求項11に記載の方法。前記データ書込み要求メッセージが、IRP_MJ_CREATE関数コードを含んでいるI/O要求パケットIRPである、請求項12に記載の方法。前記アプリケーションが、前記ファイルロケーションを前記マルウェアスキャナキューに追加する前に、前記ファイルを閉じ始めたかどうかを判断するステップをさらに含む、請求項11~13のいずれかに記載の方法。前記アプリケーションが前記ファイルを閉じ始めたかどうかを判断する前記ステップが、前記ファイルを閉じるように要求するメッセージをインターセプトするステップを含む、請求項14に記載の方法。前記ファイルクローズ要求メッセージが、IRP_MJ_CLEANUP関数コードまたはIRP_MJ_CLOSE関数コードを含んでいるI/O要求パケットIRPである、請求項15に記載の方法。前記アプリケーションが前記ファイルを閉じ始めた後に、前記キュー中のデータ量がしきい値を超えたときには、前記キューイングされたファイルデータのみがスキャンされる、請求項1~16のいずれかに記載の方法。前記ファイルデータが前記ファイルに書き込まれた時間を記録するステップをさらに含む、請求項1~17のいずれかに記載の方法。前記アプリケーションが前記ファイルを閉じ始めた後に、前記ファイルデータの年齢がしきい値を超えたときには、前記キューイングされたファイルデータのみがスキャンされる、請求項18に記載の方法。コンピュータプログラムコード手段を備えるコンピュータプログラムであって、前記コンピュータプログラムコード手段が、前記コンピュータシステム上で実行されているアプリケーションがファイルを開こうとしているときを判断するステップと、前記アプリケーションによって前記開いているファイルに書き込まれたデータをマルウェアスキャナキューに追加するステップと、前記キューイングされたファイルデータが潜在的なマルウェアに関係するかどうかを判断するために前記キューイングされたファイルデータをスキャンする前に、前記ファイルが閉じられていることが、前記アプリケーションに通知されていることを保証するステップとを実行するように適合された、コンピュータプログラム。コンピュータ可読媒体上で実施される、請求項20に記載のコンピュータプログラム。マルウェアについてファイルをスキャンするように構成されたコンピュータシステムであって、前記コンピュータシステムが、前記コンピュータシステム上で実行されているアプリケーションがファイルを開こうとしているときを判断し、前記アプリケーションによって前記開いているファイルに書き込まれるデータをマルウェアスキャナキューに追加し、前記キューイングされたファイルデータが潜在的なマルウェアに関係するかどうかを判断するために前記キューイングされたファイルデータをスキャンする前に、前記ファイルが閉じられていることが、前記アプリケーションに通知されていることを保証するためのフィルタユニットを備える、コンピュータシステム。上述した問題を少なくとも部分的に克服するために、本明細書では、動作が実行されている間にアプリケーションの実行がブロックされない非同期オンアクセスマルウェアスキャニングを実行することによって、コンピュータシステムの性能を向上させることを提案する。この非同期スキャニングは、アプリケーションによってファイルに書き込まれている任意のデータのコピーを作成し、そのファイルデータのコピーをメモリキャッシュに格納することによって達成される。その場合、マルウェアスキャンが実行された後まで待つ必要なく、このデータをファイルに書き込み続けることができる。次いで、適切なときにマルウェアについてキャッシュ中のデータをスキャンすることができる。マルウェアスキャニング動作が実行されている間、アプリケーションの実行がブロックされないと規定することによって、アンチウィルスプログラムは、オンアクセスマルウェアスキャニングによってもたらされる遅延を最小限に抑え、それにより、コンピュータシステムの性能が最適化される。図2に、本発明の一実施形態によるコンピュータシステム1を概略的に示す。コンピュータシステム1は、コンピュータハードウェアとソフトウェアとの組合せとして実装することができる。コンピュータシステム1は、メモリ2と、キャッシュ3と、プロセッサ4と、トランシーバ5とを備える。メモリ2は、コンピュータシステム1によって必要とされるファイルのすべてを格納している。メモリ2に格納されたファイルは、プロセッサ3によって実装される様々なプログラム/実行可能ファイル、ならびに任意のデータファイル6を含む。メモリ2に格納され、プロセッサ4によって実装されるプログラム/実行可能ファイルは、各々がアンチウィルスユニット9のサブユニットであり得るフィルタユニット7およびマルウェアスキャナユニット8、ならびにファイルシステム10および任意の他のプログラム/アプリケーション11を含む。メモリ2に格納されたデータファイル6は、アプリケーションデータファイル、マルウェア定義データファイル、ヒューリスティック解析ルールを含んでいるファイル、ホワイトリスト、ブラックリストなどを含むことができる。キャッシュ3は、マルウェアスキャナユニット8によってスキャンされるべきデータを格納するための一時的なストレージユニットを提供する。トランシーバ5は、インターネットまたはLANなどのネットワーク13を介して、中央アンチウィルスサーバ12と通信するために使用される。中央アンチウィルスサーバ12は一般に、コンピュータ1上で動作するアンチウィルスユニット8のプロバイダによって動作される。代替的には、中央アンチウィルスサーバ12は、ネットワーク管理者またはスーパバイザのサーバとすることができ、コンピュータ1は、スーパバイザが受け持つネットワークの一部である。中央アンチウィルスサーバ12は、コンピュータハードウェアとソフトウェアとの組合せとして実装することができる。中央アンチウィルスサーバ12は、メモリ14と、プロセッサ15と、トランシーバ16と、データベース17とを備える。メモリ14は、プロセッサ15によって実装される様々なプログラム/実行可能ファイルを格納する。トランシーバ16は、ネットワーク13を介してコンピュータシステム1と通信するために使用される。データベース17は、最新のマルウェア定義データ、ヒューリスティック解析ルール、ホワイトリスト、ブラックリストなどを格納する。図3は、本発明の一実施形態によるオンアクセスマルウェアスキャニングを実行するプロセスをさらに示す流れ図である。実行されるステップは、以下の通りである。B1.アプリケーションは、その実行の一部として、新規ファイルまたは既存ファイルにデータが書き込まれることを必要とする。新規ファイルを作成する、または既存ファイルを開くために、アプリケーションはCreateFile関数を呼び出す。B2.次に、CreateFile関数は、ユーザモードアプリケーションに代わって、IRP_MJ_CREATE関数コードを有するIRPを生成するI/Oマネージャを呼び出す。B3.アンチウィルスプログラムに関連付けられたフィルタユニットは、ファイルシステムに対して作成されたIRP_MJ_CREATE要求をインターセプトし、それにより、新規ファイルが作成された、または既存ファイルが開かれたことを判断する。次いで、フィルタユニットは、IRP_MJ_CREATE要求をコンピュータのファイルシステムに送る。B4.ファイルシステムは、動作が成功し、IRPが完了したことを示すステータスとともにそのファイルのファイルハンドルを含むIRPを返信する。B5.フィルタユニットは、アプリケーションに応答を送る前にファイルシステムによって返信されたファイルハンドルを知るために、応答して返信されたIRPをインターセプトする。B6.次いで、I/Oマネージャは、CreateFile関数が成功したことをアプリケーションに通知する。B7.ファイルが作成されると、および/またはファイルが開かれると、アプリケーションは次いで、そのファイルにデータを書き込み始め、ファイルハンドルを使用してWriteFile関数を呼び出す。B8.次に、WriteFile関数は、ユーザモードアプリケーションに代わって、IRP_MJ_WRITE関数コードを有し、書き込まれるべきデータを特定する/指摘するIRPを生成するI/Oマネージャを呼び出す。B9.フィルタユニットは、ファイルハンドルを使用して作成されたIRP_MJ_WRITE要求をインターセプトし、ファイルに書き込まれるべきデータをキャッシュにコピーする。次いで、フィルタユニットは、指定されたファイルにデータを書き込むことができるように、インターセプトされた要求をファイルシステムに転送する。B10.ファイルシステムは、特定されたデータをそのファイルに書き込み、動作が成功し、IRPが完了したことを示すステータスとともにIRPを返信する。B11.次いで、I/Oマネージャは、WriteFile関数が成功したことをアプリケーションに通知する。B12.アプリケーションは、WriteFile関数が成功したという通知を受信すると、次いで、ファイルのための開いているファイルハンドルを閉じるためにCloseHandle関数を呼び出す。B13.次に、CloseHandle関数は、ユーザモードアプリケーションに代わって、IRP_MJ_CLEANUP関数コードか、またはIRP_MJ_CLOSE関数コードのいずれかを有するIRPを生成するI/Oマネージャを呼び出す。B14.フィルタユニットは、ファイルハンドルを使用して作成されたIRP_MJ_CLEANUP要求またはIRP_MJ_CLOSE要求をインターセプトし、マルウェアについてスキャンされる予定のデータのキューに、キャッシュされたファイルデータを追加する。マルウェアスキャナキューは、キャッシュされ、スキャンの準備ができているファイルデータを含む。ファイルデータをキューに追加するために、フィルタドライバは、非同期処理のためのファイルハンドルを登録する。次いで、フィルタユニットは、インターセプトされたIRP_MJ_CLEANUP要求またはIRP_MJ_CLOSE要求をファイルシステムに転送する。B15.ファイルシステムはファイルを閉じ、動作が成功し、IRPが完了したことを示すステータスとともにIRPを返信する。B16.次いで、I/Oマネージャは、CloseHandle関数が成功したことをアプリケーションに通知する。B17.アプリケーションは、CloseHandle関数が成功したという通知を受信すると、次いで、別のファイルにデータを書き込むことまたは他のアクションを実行することによって、その実行を再開することができる。別のファイルまたは同じファイルにデータを書き込むことによってアプリケーションが継続する場合、ステップB1~B16が繰り返される。B18.キュー中のデータ量があらかじめ定義された最大しきい値に達すると、あるいは、キュー中のデータの最も古い項目があらかじめ定義された最大年齢を達すると、フィルタユニットは、現在マルウェアスキャナキューに存在するキャッシュに格納されたファイルデータのスキャンをマルウェアスキャナが実行することを要求する。B19.次いで、マルウェアスキャナは、キャッシュに格納されているキューイングされたファイルデータをスキャンする。B20.キュー中のデータ量があらかじめ定義された最大しきい値に達していない場合にも、キュー中のデータの最も古い項目があらかじめ定義された最大年齢に達していない場合にも、フィルタは、アプリケーションによってファイルに書き込まれたデータを格納し続け、このファイルデータをマルウェアスキャナキューに追加する。代替的に、ファイルにデータを書き込むプロセスに着目し、ファイルデータをキャッシュにコピーするのではなく、フィルタユニットは、ファイルが開いている間にアプリケーションから/に送られる様々な要求および応答をインターセプトすることによって、ファイルハンドルおよびファイルへのパスなど、ファイルに関する情報を単にキャプチャするように構成することができる。次いで、ファイルが閉じられ、ファイルハンドルが解放され、IRP_MJ_CLEANUP要求またはIRP_MJ_CLOSE要求が完了すると、次いで、ファイルパスは、フィルタユニットによるマルウェアスキャナキューにマルウェアスキャナを追加することができ、それにより、格納されたロケーションから実際のファイルデータをスキャンすることができる。さらなる代替例として、フィルタユニットがIRP_MJ_CLEANUP要求を受信したときには、フィルタユニットは、IRPをファイルシステムにパスしないが、STATUS_PENDINGとしてIRPをマークし、IRPへのポインタを格納し、現在の処理を完了するように構成することができる。次いで、アプリケーションには、CloseHandle関数が完了し、したがって、その実行を継続できることが通知される。ただし、ファイルシステムが、IRP_MJ_CLEANUPファイルを受信していないときには、ファイルハンドルに関連付けられたファイルオブジェクトは、ファイルシステムは、ファイルからデータを読み取ることができるように有効なままである。その後、マルウェアスキャナは、非同期スキャンを実行するためにファイルデータが必要なときには、そのデータの要求をフィルタユニットに送信する。次いで、フィルタユニットは、IRP_MJ_CLEANUPからのパラメータを使用してIRP_MJ_READ要求を生成する。マルウェアスキャンが完了すると、完了されるべきファイルシステムに元のIRP_MJ_CLEANUPが送られ、ファイルハンドルが閉じられる。フィルタユニットは、ファイルにファイルデータが書き込まれた時間の表示を記録しなければならない。次いで、フィルタユニットはその時間情報を使用して、マルウェアスキャナキュー内の最も古いファイルデータの年齢があらかじめ定義された時間限度を超えているかどうか、したがって、キューイングされたファイルデータをマルウェアスキャナによってスキャンしなければならないときを判断することができる。たとえば、この時間限度は、1秒~10秒の間で変動し得る。さらに、ファイルのパスは、スキャニングプロシージャ中にマルウェアスキャナによって使用され得るのでたとえば、ファイルのロケーションは、ファイルがマルウェアであるかどうか、マルウェアではないかどうかに関する表示であり得るので、フィルタユニットはファイルのパスを記録し得る。さらにまた、もしファイルが潜在的なマルウェアに関係するとマルウェアスキャナによって特定されたときには、アンチウィルスプログラムは、任意の駆除動作および/または検疫動作を実行するために、ファイルロケーション情報を利用することができる。任意選択で、アンチウィルスプログラムは、フィルタドライバによってキューに格納することができる最大データ量を制限するように構成することができる。キュー内のデータ量がこの最大限度に達すると、フィルタユニットは、キューイングされたファイルデータをスキャンするように要求する要求をマルウェアスキャナに送るように構成される。さらに、単一のファイルに書き込まれたデータ量がキャッシュおよび/またはキューの最大サイズを超えている場合、次いで、フィルタユニットは、マルウェアスキャナが新しいデータの同期スキャンを実行することを要求とするように構成することができる。次いで、スキャンが完了するまでアプリケーションの実行が進まないようにしている間に新しいデータがファイルに書き込まれるので、マルウェアスキャナは、そのデータをスキャンすることができる。また、フィルタユニットは、アプリケーションがマルウェアスキャナキューに追加された、特定のファイルに現在書き込まれているデータを変更、上書きまたは削除しようとしているかどうかを判断するように構成される。次いで、フィルタユニットは、適切であると見なされる任意のアクションをとるように構成される。たとえば、既存ファイルに現在書き込まれているデータがマルウェアスキャナによってスキャンされるのを待ちながら、アプリケーションが既存ファイルに新しいデータを書き込もうとしているとフィルタユニットが判断した場合、フィルタユニットは、キューから必要な場合には、キャッシュから現在のファイルデータを除去し、マルウェアスキャナが新しいデータの同期スキャンを実行することを要求するように構成することができる。次いで、マルウェアスキャナは、スキャンが完了するまでアプリケーションの実行が進まないようにしている間に、新しいデータがファイルに書き込まれるので新しいデータをスキャンすることになる。さらに、ファイルに現在書き込まれているデータがスキャンされるのを待っている間に、アプリケーションがそのファイルを削除しようとしているとフィルタユニットが判断した場合、フィルタユニットは、キューから必要な場合には、キャッシュからそのファイルのデータを削除するように構成することができる。代替的には、フィルタユニットがキャッシュへのファイルデータのコピーを行い、アプリケーションがそのデータを修正、上書きまたは削除しようとしているとフィルタユニットが判断した場合、フィルタユニットは、以下のいずれかを行うように構成することができる。キャッシュとキューの両方からの現在のファイルデータを保持し、新たに書き込まれたファイルデータをキャッシュおよびキューに適宜追加する。マルウェアスキャナは次いで、直近のファイルデータおよび先行データをスキャンする。キャッシュとキューの両方からの現在のファイルデータを除去し、新たに書き込まれたファイルデータをキャッシュおよびキューに適宜追加する。次いで、マルウェアスキャナは、直近のファイルデータのみをスキャンする。アプリケーションがデータファイルを書き込み続け、それにより、マルウェアスキャナが先行するマルウェアスキャニングキュー中のデータのスキャニングを完了する前に、マルウェアスキャニングキュー中のデータ量がしきい値最大サイズを達した場合、フィルタユニットは、以下のいずれかを行うように構成することができる。マルウェアスキャナが先行するマルウェアスキャニングキュー中のデータのスキャニングを完了するまで、アプリケーションの任意のさらなる実行をブロックし、それにより、マルウェアスキャナキューをスキャンし、より多くのファイルデータを受け入れるためにマルウェアスキャナキューを解放するように、現在マルウェアスキャニングキュー中にあるファイルデータをマルウェアスキャナにパスすることができる。より多くのファイルデータを受け入れるためにマルウェアスキャナキュー内に十分な空間ができるまで、任意の連続するファイルデータの同期マルウェアスキャニングを要求する。上述した方法は、マルウェアスキャンが完了するまで、ファイルにアクセスしているアプリケーションが進行しないようにブロックする必要なく、アンチウィルスプログラムがファイルのオンアクセススキャニングを実行できることを規定する。したがって、この方法により、ファイルのオンアクセスマルウェアスキャニングを実行するように構成されたコンピュータシステムの性能が最適化される。さらに、キャッシュ内にファイルデータを格納するとき、上述した方法は、コンピュータハードディスクなどのコンピュータ永続メモリからアクセスするよりも速くファイルデータにアクセスできることを規定する。さらに、上記で説明される非同期マルウェアスキャニングを実行する方法は、同期マルウェアスキャニングも非同期マルウェアスキャニングも、フィルタユニットによりファイルにデータが書き込まれないようになり、その後ファイルハンドルが閉じられないようにするので、従来の同期マルウェアスキャニング方法と比較して、コンピュータシステムのセキュリティにいかなる追加のリスクをもたらさない。さらに、ファイルにデータを書き込むアプリケーションの動作と並行してファイルデータのスキャニングを行うことを可能にすることによって、オンアクセスマルウェアスキャニングを実装するときに、さらにコンピュータシステムの性能を改善するために、上述された方法は、現代のコンピュータシステムのマルチプロセッサ機能、マルチタスク機能、マルチスレッディング機能、およびハイパースレッディング機能を活用することができるIntel登録商標ハイパースレッディングテクノロジー、テクニカルユーザーガイド2003年1月参照。当業者には、本発明の範囲から逸脱することなく、上述した実施形態に様々な変更を加え得ることが理解されよう。