I.背景の概要
1.1 Windows NTオペレーティングシステムの構成
1.1.1ユーザーモード(UserMode)とカーネルモード(KernelMode)
セキュリティのためにIntel80386以降。安定性を考慮すると、一連のCPUは、高位から低位のring0〜ring3の4つの異なる特権レベルを実行し、データに対して4つの保護レベルを提供できます。下位レベルで実行されているコードは、上位レベルのコードを任意に呼び出して上位レベルのデータにアクセスすることはできず、ring0層のコードだけが物理ハードウェアに直接アクセスできます。 Windows NTはマルチプラットフォームのオペレーティングシステムであるため、他のプラットフォームとの互換性を保つために、CPUの2つの動作レベルを利用するだけです。 1つはカーネルモードと呼ばれ、このモードで実行されているデバイスドライバを含む、オペレーティングシステムのコア部分である80 x 86 ring 3層に対応し、もう1つはユーザーモードと呼ばれます。すべてのユーザーアプリケーションはこのレベルで動作します。
1.1.2 Windows NTオペレーティングシステムの構造
図1はWindows NTのシステムコンポーネントを簡単に説明したものです。
図1
図からわかるように、物理ハードウェア(Hardware)とシステムカーネル(Kernel)の間にハードウェア抽象化レイヤ(HardwareAbstractionLayer)があります。これは、異なるプラットフォームハードウェア間の違いを保護します。オペレーティングシステムの上位層への統一インターフェースを提供します。図からわかるように、デバイスドライバ(DeviceDriver)は、I /Oマネージャ(I /OManager)に囲まれています。つまり、ドライバとオペレーティングシステムの上位層との間の通信は、I /Oマネージャを経由する必要があります。ユーザー要求の受信、ユーザープログラムとのデータ交換、メモリマッピング、割り込みのフック、同期などの多くのタスクはすべてI /Oマネージャによって処理されるため、これはドライバの作成に非常に便利です。 。
1.1.3 Windows NTデバイスドライバの分類
ハードウェアを直接操作するかどうかによって、ドライバは2つのカテゴリに分類されます。カーネルモードドライバと専用ドライバです。
カーネルモードドライバは、ハードウェア通信プロトコルに従って、ポートアクセス、割り込み応答、およびハードウェアへのDMA転送を直接実行します。それは含まれています:シリアル、パラレルポート、キーボード、ファイルシステム、SCSI、ネットワークおよび他のドライバを、専用ドライバはビデオ、印刷、マルチメディア、仮想DOSおよび他のドライバを含み、それらは実装が大きく異なります。私がインターンシップの間にした仕事とこの記事の下の議論はカーネルモードドライバーに限られていました。
p> 1.2Windows NTカーネルモードのデバイスドライバの構造と動作
一般に、デバイスドライバのタスクには2つの主なものがあります。まず、ユーザプログラムからの読み書き要求を受け付けることです。ユーザーのデータをデバイスに転送するか、デバイスから受信したデータをユーザーに転送します次に、デバイスをポーリングするかデバイスからの割り込み要求を処理してデータ転送を完了します。
1.2.1ドライバとユーザープログラムの通信
I /Oマネージャは各デバイスをファイルに抽象化するため、Win32ユーザープログラムでは次のものだけが使用されます。単純なファイル操作API関数は、ドライバ内のデバイスと通信できます(1つのドライバで複数のデバイスを駆動できます)。
関数名関数
CreateFileはデバイスを開き、データを転送する準備ができています。デバイスに関連付けられているハンドルを返します。
CloseHandleは、CreateFileによって開かれたデバイスを閉じます。
ReadFileはデバイスからデータを読み取ります。
WriteFileはデバイスにデータを書き込みます。
DeviceIoControlは、設定の変更など、デバイスに対していくつかのカスタム操作を実行します。
表1
1.2.2DriverEntryプロセス
これは各デバイスドライバのエントリポイントであり、プログラムが起動するたびにシステムによって自動的に呼び出されます。デバイスの初期化作業の大部分はこのプロセスで行われます。これには、さまざまなユーザー要求に応答するプロセスのエントリを設定することも含まれます。そのため、I /Oマネージャは、開く、閉じる、読み取り、書き込みのユーザー要求が来たときにどのプロシージャを呼び出すべきかを知ることができます。この手順では、「DriverEntry」というプロシージャの名前だけが固定されており、以下のすべてのプロシージャがシステムに登録されます。
ドライバがどの要求にも応答しない場合、DriverEntryプロセスは正常に機能するドライバを構成できます。
1.2.3アンロードおよびシャットダウンプロセス
アンロードプロセスは、ドライバが停止する前に必要な処理を行う責任があります。たとえば、リソースの解放、最終ステータスの記録などです。システムがシャットダウンしようとしているときにShutDownプロシージャが呼び出されます。前者との違いは、リソースが解放されないことです。
1.2.4DispatchOpenおよびDispatchCloseプロセス
これらの2つのプロシージャは、次回の読み取りおよび書き込み操作の準備、または読み取りおよび書き込み後に必要な処理を実行するために、ユーザーがCreateFileおよびCloseHandleを呼び出すときに呼び出されます。
1.2.5DispatchRead、DispatchWriteおよびStartIoプロシージャ
これらの最初の2つのプロシージャは、ユーザーがReadFileおよびWriteFileを呼び出すと呼び出されます。ユーザーの要求の正当性を検証してからStartIoというプロセスを開始して、ハードウェア間で実際のデータ転送を開始するための作業を行います。 I /Oマネージャは、IRPを介してユーザバッファへのポインタも提供しますユーザプログラムとのやり取り回数の詳細については、1.3.2を参照してください。要求
ユーザーがDeviceIoControlを呼び出すと、これら2つのプロシージャが呼び出されます。 IRPを介してユーザの要求番号と、ユーザプログラムと通信できるユーザバッファへのポインタを取得します。
1.2.7割り込み処理(ISR)
これらのプロシージャは、割り込みが発生したときにシステムによって呼び出されます。
1.2.8 DeferredProcedure
これらのプロシージャは、低い実行レベルで高い実行レベルのプロセス(割り込み処理など)のタスクを実行するために使用されます。詳細については、1.3.3を参照してください。
p> 1.3実装の詳細
1.3.1カーネルコード実行レベル
WindowsNTはそのカーネルですパターンのコードには異なるレベルが割り当てられています。同じCPU上で、低レベルのプロセスが高レベルのプロセスによって割り込まれることがあります。レベルは、低いものから順に次のようにリストされています。
このレベルでレベル名を実行するプロセス
PASSIVE_LEVELDriverEntry、Unload、ShutDown、DispatchXxx。
APC_LEVEL特殊なケースでは、大容量記憶装置用のドライバがこのレベルで動作します。
DISPATCH_LEVELStartIo、AdapterControl、ControllerControl、IoTimer、Dpc。
DIRQLはさまざまな割り込みハンドラを提供します。表2
1.3.2いくつかのオブジェクト
i)I /O要求パケット(IRP)
各I /Oマネージャはユーザーから要求を受け取ります。構造体を作成し、それをパラメータとしてドライバのDispatchXxx、StartIoプロセスに渡します。この構造体には、要求の種類、ユーザーバッファの先頭アドレス、ユーザーが要求したデータの長さなどの情報が格納されます。ドライバはリクエストを処理した後、処理結果に関する情報を構造体に追加し、IoCompleteRequestを呼び出してそれをI /Oマネージャに返し、そしてユーザープログラムのリクエストが返されます。
ii)DPC
このオブジェクトは、Dpcプロセスをドライバで使用するときに作成する必要があります。特定の効果については1.3.3を参照のこと。
iii)ドライバオブジェクト(DriverObject)
このオブジェクトは、ドライバの起動時にI /Oマネージャによって作成され、プログラムがさまざまな要求を処理するためのプロシージャエントリが保存されます。駆動されているすべてのデバイスオブジェクトなどのリンクリスト。
iv)デバイスオブジェクト(DeviceObject)