駆動開発(1)基礎知識


このブログはCSDNブロガーzuishikonghuanが作成したもので、著作権はzuishikonghuanが所有しています.転載は出典を明記してください.http://blog.csdn.net/zuishikonghuan/article/details/48545623
ドライバはオペレーティングシステムとハードウェアの通信の架け橋であり、同時に、ドライバは多くの特殊な機能を実現することができます.例えば、仮想オプティカル(光学式)ドライブ(仮想デバイス)、カーネル級hook、ファイルシステムの透明暗号化(フィルタ駆動)、Windowsカーネルの修正などです.
すべてのドライバがデバイスの設計者によって作成される必要はありません.デバイスがパブリッシュされたハードウェア基準に基づいて設計されている場合.この場合、ドライバはMicrosoftで作成でき、デバイス設計者はドライバを提供する必要はありません.
すべてのドライバがハードウェアに関連付けられているわけではありません.一部のドライバは、ハードウェアデバイスとはまったく関連付けられていません.たとえば、カーネルにアクセスしたり、仮想デバイスを実装したり、デバイスをフィルタしたりする必要がある場合は、ドライバの作成によって実装する必要があります.ユーザー・モードで実行され、ユーザー・インタフェースを提供するアプリケーションを提供します.また、カーネル・モードで実行され、コア・オペレーティング・システムのデータにアクセスできるドライバも必要です.このドライバは「ソフトウェアドライバ」と呼ぶことができます.ソフトウェアドライバはハードウェアデバイスに関連付けられていません.もう1つの例は、アプリケーション層からAPIスクリーンショットを呼び出すのではなく、ドライバによって直接スクリーンを読み取るスクリーン録画ソフトウェアがあり、ハードウェアの加速を実現する.
駆動開発を本格的に紹介する前に、基本的な概念を理解する必要があります.
1.ドライバの実行レベル
カーネルモードドライバを例にとると,ユーザモードドライバは後になってからである.
実はintel 80 x 86は4つの運行レベルを提供して、R 0、R 1、R 2とR 3、現代の主流のオペレーティングシステム、Windowsももちろん例外ではなくて、R 0とR 3の2つの運行レベルだけを使って、それぞれ“カーネルモード”と“ユーザーモード”です.アプリケーションはユーザーモードで実行され、ドライバはカーネルモードで実行されます.
つまり、ドライバが実行された瞬間、天道です!ドライバの中の命令は、天道の法則です!(例えば)だから、ドライバの実行時に理論的には何でもできるということで、RootKitウイルスやウイルス対策ソフトは利用しているドライバです.
2.Windowsドライバの種類
Windows 9 x時代はVxDドライバで、NTの第1世代から現在のWindows 10まで、Windowsには3つのドライバモデルが登場しています.
1.レガシードライバ:NTドライバ:これはベースのドライバモデルであり、本シリーズの博文で重点的に紹介したドライバモデルでもある.
2.WDMドライブ:USBデバイスなどのデバイスのホットスワップをサポートするために、マイクロソフトはWDMドライブを発売し、電源管理とプラグアンドプレイをサポートしています.
3.WDF駆動:WDMがWin 32であればWDFがMFCだと言われています.この比喩はやはり適当だ.WDFドライバは、マイクロソフトがより便利なカーネル関数をカプセル化し、ドライバ開発をより便利にしています.さらにWDFは、カーネルモードドライバとユーザモードドライバの2つのメカニズムを提供しています.
3.仮想メモリ(仮想アドレス空間)
ドライバは4 GBの仮想メモリ全体にアクセスでき、ユーザプログラムは低2 Gのみにアクセスできる.
仮想メモリのページング原理とWindowsのメモリ管理メカニズムについては、ここでは紹介しません.
4.APIの処理
Win 32サブシステムで呼び出されたAPIでは、ntdll内のNative APIがさらに呼び出され、Native APIがカーネルに入り、システムのサービスルーチンが呼び出され、I/OマネージャによってIRPが生成され、デバイススタックの最上位のデバイスオブジェクトが存在するドライバの派遣関数に送信され、さらに下位のドライバへの送信(例えばフィルタドライバ)が継続される可能性がある.ドライバがタスクを完了します.
5.同期と非同期
私は同期と非同期の理解に対して、あまり正確ではないかもしれません:同期:1つのインタフェースを呼び出した後、被呼び出し者が処理し終わるまで待って、更に非同期に戻ります:1つのインタフェースを呼び出した後、被呼び出し者が処理し終わるまで待たないで、直接帰って、他のものを処理します.
同期処理は駆動開発における重要なタスクである.Windowsは非同期操作をサポートするオペレーティングシステムであり、ドライバを作成する際に必要であれば同期処理を行う必要があります.
6. デバイスオブジェクトとデバイススタック
デバイスオブジェクトがDEVICE_OBJECT構造の一例.デバイススタックは一連のデバイスが形成したスタック構造と類似したものであり、簡単に言えば、ディスクデバイスの上にディスクフィルタデバイスがあり、上にボリュームデバイスがあり、上にファイルシステムフィルタデバイスがある可能性があるなど、IRPは常にzがデバイススタックの最上位層のデバイスに送信される.
7.シンボル接続
一般に、NTドライバでは、アプリケーションはデバイスに直接アクセスするのではなく、デバイスのシンボル接続にアクセスします.例えば、最初のディスクボリュームのデバイス名は
“\Device\HarddiskVolume1”

シンボル接続:カーネルモード
"\??\C:"

ユーザー・モード:

私たちのアプリケーションは、シンボルで接続されています.
WDM駆動では、シンボル接続ではなくデバイスインタフェースが一般的に使用される.