オブジェクトベース
Microsoft Windows NT ベースのオペレーティング システムはオブジェクトベースです。 エグゼクティブのさまざまなコンポーネントは、オブジェクトの種類を 1 つ以上定義します。 各コンポーネントは、その種類のオブジェクトのインスタンスを操作するカーネル モード サポート ルーチンをエクスポートします。 コンポーネントが別のコンポーネントのオブジェクトに直接アクセスすることはできません。 コンポーネントが別のコンポーネントのオブジェクトを使用するには、エクスポートされたサポート ルーチンを呼び出す必要があります。
この設計により、オペレーティング システムは移植性と柔軟性の両方を実現できます。 たとえば、今後のオペレーティング システムのリリースで、同じオブジェクト型を定義するように再コーディングしたカーネル コンポーネントを、まったく異なる内部構造で提供することが考えられます。 このような想定で再コーディングしたカーネルから、名前とパラメーターが既存のサポート ルーチンと同じサポート ルーチンをエクスポートすれば、その内部的な変更が、既存のシステムにある他のエグゼクティブ コンポーネントの移植性に影響することはありません。
同様に、ドライバーの移植性と構成可能性を維持するには、WDK に記述されているサポート ルーチンなどのインターフェイスのみを使用して、そのドライバーとオペレーティング システムが相互に通信する必要があります。
オペレーティング システムと同様に、ドライバーもオブジェクトベースです。 次に例を示します。
ファイル オブジェクト は、ユーザー モード アプリケーションからデバイスへの接続を表します。
デバイス オブジェクト は、各ドライバーの論理デバイス、仮想デバイス、または物理デバイスを表します。
ドライバー オブジェクト は、各ドライバーのロード イメージを表します。
I/O マネージャーは、ファイル オブジェクト、デバイス オブジェクト、ドライバー オブジェクトの構造とインターフェイスを定義します。
他のエグゼクティブ コンポーネントと同様に、ドライバーは、I/O マネージャーなどのシステム コンポーネントからエクスポートされたカーネル モード サポート ルーチンを呼び出すことによってオブジェクトを使用します。 一般的に、カーネル モード サポート ルーチンには、そのルーチンが操作するオブジェクトを特定する名前およびそのオブジェクトに対してそのルーチンが実行する操作が記述されています。 このようなサポート ルーチン名の形式は次のとおりです。
PrefixOperationObject
where
Prefix は、サポート ルーチンをエクスポートするカーネル モード コンポーネントおよび通常はオブジェクトの種類を定義したコンポーネントを特定します。 ほとんどの Prefix は 2 文字で構成されます。
Operation は、オブジェクトに対して実行する処理を記述します。
Object はオブジェクトの種類を特定します。
たとえば、I/O マネージャーの IoCreateDevice ルーチンは、I/O 要求の対象とする物理デバイス、論理デバイス、または仮想デバイスを表すデバイス オブジェクトを作成します。
あるシステム コンポーネントから、別のコンポーネントのサポート ルーチンを呼び出すルーチンをエクスポートできます。 これにより、ドライバーから実行する呼び出しの数を削減できます。 特に、I/O マネージャーからは、ドライバーの開発を容易にする特定のルーチンがエクスポートされます。 たとえば、ISR を登録するために最下位のドライバーから呼び出される IoConnectInterruptEx は、割り込みオブジェクトのカーネル サポート ルーチンを呼び出します。
オブジェクトの不透明度
システム定義オブジェクトの中には不透明なものがあります。そのオブジェクトを定義したシステム コンポーネントのみが、そのオブジェクトの内部構造を認識し、そのオブジェクトが持つすべてのデータに直接アクセスできます。 不透明なオブジェクトを定義したシステム コンポーネントは、ドライバーなどのカーネル モード コンポーネントがそのオブジェクトを操作するために呼び出すことができるサポート ルーチンをエクスポートします。 不透明なオブジェクトの構造にドライバーが直接アクセスすることはありません。
注: ドライバーがその移植性を維持するには、システムが提供するサポート ルーチンを使用してシステム定義オブジェクトを操作する必要があります。 オブジェクトを定義したシステム コンポーネントは、そのオブジェクトの内部構造をいつでも変更できます。