2012-02-10 76 views

答えて

6

ユーザーモードの側:いくつかの方法があります。

1)最も一般的な/柔軟な方法は、メモリを通過することを含めて、ユーザーモードとカーネルモードの間で通信するためにDeviceIOControlを使用することです。

私は最後のカーネルドライバを書いて以来、長い時間がかかりました(6年?XPタイムフレーム)ので、正確なコードではないプロセスの概要です。しかし、あなたのユーザーモードプログラムは、CreateFileを使用し、その名前を指定することによって、例えばデバイスのハンドルやドライバのオープンインスタンスを得ることができるはずです。たとえば、\\.\YourNameHereです。それと通信するためにハンドルの使用(。DeviceIOControlの最初のパラメータ)

あなたが興味があるだろう四つのパラメータは次のとおりです。これらを使用して

__in_opt  LPVOID lpInBuffer, 
    __in   DWORD nInBufferSize, 
    __out_opt LPVOID lpOutBuffer, 
    __in   DWORD nOutBufferSize, 
    __out_opt LPDWORD lpBytesReturned, 

、あなたはlpInBufferを通じて(ドライバにデータを与えることができますポインタとnInBufferSizeの大きさを指定するパラメータ - このデータの意味や解釈方法はドライバによって異なります)、カーネルモードのレイヤーはlpOutBuffer(ユーザーモードのメモリへのポインタは既に割り当てられた - これはドライバが設定するポインタではありません!)、バイト単位のサイズはnOutBufferSizeです。このバッファを見つけてください)、ドライバはそのバッファのどれくらいが実際にlpBytesReturnedで満たされているかを教えてくれます。

このウィキペディアの記事では、general concept of ioctl functionsについて説明しています。そのうちのDeviceIOControlが例です。

注:あなたが「私は窓にユーザ空間とカーネル空間の間でメモリを共有しようとしています」と述べました。これはではなく、正確に共有メモリではありません。たとえば、ユーザーモードとカーネルモードの両方が同時に読み書きされているメモリではありません。 DeviceIOControl関数呼び出しの間、カーネルモードは、あなたがポインタを渡すあなたのユーザモード割り当てメモリにアクセスするメモリです(ただし、メモリからは少し複雑ですが、それが効果です)。あなたがそのメソッドを呼び出している間は、 'shared'だけです。

2)単純なデータ転送のみが必要で、カーネルドライバがそれを受け入れる必要がある場合は、ReadFileWriteFileを使用することもできます。 DeviceIOControl(ドライバのデータを渡すとエラーコードで何かを返す)のように、双方向の通信を行うことはできませんが、シンプルで、おそらくそれらのAPIに精通しているでしょう。

カーネルモード側:カーネルドライバも作成していますか?その場合、this article has information about implementing the kernel-mode side of IOCTL。この記事では、ユーザーモードでReadFileWriteFileを使用して、その方法を選択した場合の通信方法についても説明します。

+0

[Rootkits:Subversion of the Windows Kernel](http://www.amazon.com/Rootkits-Subverting-Windows-Greg-Hoglund/dp/0321294319)は、IRPs /最初のいくつかの章のDeviceIOControl(少なくとも、これまでに私がこれまでにやったことはどれくらいですか?) –

関連する問題