私は簡潔にしようとしますが、完全に説明します:
これは Windows 固有です。Windows Driver Development Kit (DDK) の使用。
カーネル モードの経験がなく、初めてカーネル モード ドライバー (KMD) を作成しています。私は現在、DDK に付属している「スキャナー」ミニフィルター サンプルをいじっており、練習のためにそれを拡張しています。「スキャナー」ミニフィルターは、要求された操作を承認/拒否する前に「悪い言葉」をスキャンするために、ファイルの作成/閉じ、関連ファイルの操作をフックする、一般的な「ウイルス対策」タイプのスキャン ドライバーの基本的な概要です。
最終的な目標は、ファイルを開こうとしているプロセスまたはユーザーの速度を著しく低下させることなく、ミニフィルターが操作の完了を許可するかどうかを決定して、ユーザー モード アプリケーションでファイルを開いたときにスキャンすることです。ファイル。また、保存を試みたときにファイル全体を再度スキャンして、保存を正常に完了させるか、保存を拒否するかを決定したいと考えています。ミニフィルターのサンプルは、これらの呼び出しをフックする方法の基礎を示していますが、実際の「スキャン」部分が少し弱いです。
サンプルを拡張して、最初の 1k (サンプルの制限) だけでなく、ハッシュを生成するなど、開かれたファイル全体をスキャンすることを検討しています。ファイル全体を読み取り、元のサンプルと同じメカニズムを使用して送信するようにサンプルを変更しました。このメソッドはFltReadFile、KMD 内のファイルを読み取り、FltSendMessageバッファーをユーザー モード コンポーネントに送信するために使用します。ユーザー モード アプリケーションはGetQueuedCompletionStatus、KMD からの通知を取得し、バッファーを処理するために使用しています。
ただし、標準ライブラリ (fstream) を使用した C++ での通常のオープン/読み取りに比べて、このプロセスはかなり遅いように見えることに気付きました。この方法は、単純な C++ ユーザー アプリで単純にファイルを開いて読み取るよりも、約 4 ~ 8 倍の時間がかかります。バッファー サイズを調整して、顕著な改善が得られるかどうかを確認しました。多少の改善は見られますが、大きな効果は見られませんでした。
私は「リアルタイム」でファイルをスキャンしようとしているので、この転送速度は非常に残念で法外なものです。ファイルの内容をカーネル モード ドライバーからユーザー モード アプリケーションに転送するより高速な方法はありますか?