64 ビット ドライバーでの 32 ビット I/O のサポート

Windows on Windows (WOW64) を使用すると、Microsoft Win32 ユーザー モード アプリケーションを 64 ビット Windows で実行できます。 これを行うには、Win32 関数呼び出しをインターセプトし、64 ビット カーネルに移行する前に、必要に応じて 32 ビット ポインター型から 64 ビット ポインター型にパラメーターを変換します。 サンキングと呼ばれるこの変換は、すべての Win32 関数に対して自動的に実行されます。主な例外の 1 つは DeviceIoControl に渡されるデータ バッファーです。 InputBuffer パラメーターと OutputBuffer パラメーターが指すこれらのバッファーの内容は、ドライバー固有の構造であるため、サンクされません。

注: バッファーの内容はサンクされませんが、バッファー ポインターは 64 ビット ポインターに変換されます。

ユーザー モード アプリケーションは、指定されたカーネル モード ドライバーに直接 I/O 要求を送信する DeviceIoControl を呼び出します。 この要求には、入出力制御コード (IOCTL) またはファイル・システム制御コード (FSCTL) と、入出力データ・バッファーへのポインターが含まれます。 これらのデータ バッファーの形式は、IOCTL または FSCTL に固有であり、カーネル モード ドライバーによって定義されます。 バッファー形式は任意であり、WOW64 ではなくドライバーに知られているため、データをサンクするタスクはドライバーに任されます。

次のすべてが当てはまる場合、64 ビット ドライバーは 32 ビット I/O をサポートする必要があります。

  • ドライバーは、ユーザー モード アプリケーションに IOCTL (または FSCTL) を公開します。

  • IOCTL で使用される I/O バッファーの少なくとも 1 つに、ポインター精度データ型が含まれています。

  • IOCTL コードを簡単に書き直して、ポインター精度バッファーのデータ型を使用できないようにすることはできません。