グラフィックス Low-Level クライアントのサポート
[これらの機能は、オペレーティング システムのリビジョンごとに変更される可能性があります。 代わりに、Microsoft DirectDraw と Microsoft Direct3DAPI を使用します。これらの API は、このようなオペレーティング システムの変更からアプリケーションを保護し、ディスプレイ ドライバーとの直接対話に関連する他の多くの困難を隠します。 詳細については、「 表示の概要」を参照してください。
DirectDraw と Direct3D では、一部のカーネル モード ルーチンを使用して、オペレーティング システムとディスプレイ ドライバーと通信します。
オペレーティング システム カーネルは、ユーザー モード コンポーネントの観点から DirectDraw/Direct3D ディスプレイ ドライバーのように見えます。 ただし、カーネル ドライバーとディスプレイ ドライバーの違いがいくつかあります。 カーネル モード コンポーネントは、デバイスやサーフェスなどの DirectDraw/Direct3D オブジェクトを表す構造体のコピーを保持します。 DirectDraw/Direct3D のユーザー モード コンポーネントは、カーネル モードによって返されるハンドルで参照される構造体の作成を要求します。 その結果、違いは主にルーチンに渡される引数にあります。カーネルはハンドルを受け入れますが、ドライバーは通常ポインターを受け入れます。
カーネル モードエントリポイントの進化
DirectDraw は、複数のエントリ ポイントを使用して、Gdi32.dllを介してカーネル モードへのすべての接続を行います。 通常、これらのエントリ ポイントはパラメーターをマーシャリングするだけです。 デバイスの作成の一環として、Gdi32.dllは、DirectDraw と Direct3D 7.0 で使用されるルーチン自体へのポインターを返します。
Direct3D 8。x はGdi32.dllからクリーンブレークを行い、カーネル モードのエントリ ポイントを直接呼び出します。
カーネルの呼び出し
これらのエントリ ポイントは似ていますが、多くの場合、ディスプレイ ドライバー自体のエントリ ポイントと同じであるため、DirectDraw と Direct3D のドライバー開発キット (DDK) の資料を理解することは、これらの関数を使用するための不可欠な前提条件です。
これらの関数の呼び出しは、オペレーティング システムによって異なります。 Windows 2000 では、W2KUMODE。LIB ライブラリには、呼び出し元のスレッドがカーネル モードに移行できるようにするルーチンが含まれています。 これらのルーチンはパラメーター マーシャリングを行いません。これは、Windows 2000 の理想的な呼び出しメカニズムです。 カーネル モードへの移行を行うメカニズムは、テーブルの順序に依存します。 この順序は、オペレーティング システムのリビジョン間で変更されます。 したがって、W2KUMODE に依存するアプリケーションをビルドすることはお勧めしません。lib for Windows 2000,000 Windows,000,000,000,000,000,000,000,000,000,000,000,000,00 オペレーティング システムの移植性を作成するためのメカニズムについては、次のセクションで説明します。
Windows XP では、D3D8THK.DLLはすべてのカーネル モード関数をエクスポートしますが、少し修飾された名前が付けられます。 次の例は、プリプロセッサを使用してアプリケーションが低レベルのクライアント関数にエイリアスを設定する方法を示しています。 これを行う前に、D3D8THK.DLLに動的にリンクします。
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
移植可能なアプリケーションの記述
複数の方法を使用して、オペレーティング システム間でアプリケーションを移植できます。 最も堅牢なのは、独自のアプリケーションのインストール プロセスの一環として、Windows 2000 に Microsoft DirectX 8.x 再頒布可能パッケージをインストールすることです。 これにより、D3D8THK.DLLは Windows 2000 システムで使用できるようになり、アプリケーションで 1 つのコード パスが許可されます。これは、上記の Windows XP で説明したのと同じ手法を使用できるためです。
アプリケーションでは、独自の絶縁 DLL を構築し、上記の手法を使用して 2000 Windows 2000 用と D3D8THK.DLL を使用する Windows XP 用の 2 つのバージョンを実装することもできます。
デバイスの作成
DirectDraw と Direct3D は、まず、ドライバー オブジェクトのカーネルの抽象化のインスタンスを作成する必要があります。 Gdi32.dllとDdraw.dllでは、 これは DdCreateDirectDrawObject、 DdQueryDirectDrawObject 、 DdReenableDirectDrawObject を呼び出すことによって実現されます。 Direct3D 8。x、これは NtGdiDdCreateDirectDrawObject、 NtGdiDdQueryDirectDrawObject 、 および NtGdiDdReenableDirectDrawObject を呼び出すことによって実現されます。 GdiEntry* エントリ ポイントは、カーネル モード エントリ ポイントのマーシャラーにすぎません。
これらの関数を呼び出すと、DirectDraw デバイスのカーネル オブジェクトの抽象化を表すハンドルが返されます。 このカーネル オブジェクトは、ディスプレイ ドライバーが所有するドライバー インスタンスを表します。 このハンドルは、 DdCreateSurfaceObject (または Direct3D 8 の NtGdiDdCreateSurfaceObject ) などの後続の呼び出しで使用できます。x) を使用して、さらにオブジェクトをビルドします。
カーネル オブジェクト
いくつかのエントリ ポイントは、特定のオブジェクトのカーネル モード表現を管理するために使用されます。 DdCreateSurfaceObject (または Direct3D 8 の NtGdiDdCreateSurfaceObject 。x) が適切な例です。 このエントリ ポイントは、システム メモリの一部を表すカーネル モード オブジェクトを作成します。 エントリ ポイントはハンドルを返し、このハンドルは後続の描画呼び出しで使用できます。 カーネルは、これらのハンドルから独自の構造体へのポインターを派生させ、そのポインターをディスプレイ ドライバーに渡し、操作を実行します。
関数
次の表は、カーネル モードのエントリ ポイントを表す関数と、これらのエントリ ポイントをラップするGdi32.dllのユーザー モード ヘルパー ルーチンの一覧です。
トピック | 内容 |
---|---|
DdAttachSurface | DdAttachSurface 関数は、2 つのカーネル モードサーフェス表現をアタッチします。 |
DdCreateDIBSection | デバイスとカラー テーブルを共有する DIBSECTION 構造体を作成します。 GdiEntry9 は、この関数のエイリアスとして#definedされます。 |
DdCreateDirectDrawObject | NtGdiDdCreateDirectDrawObject 関数のラッパーで、DirectDraw オブジェクトのカーネル側表現を作成します。 この表現のハンドルは pDirectDrawGlobal-hDD> に格納されます。 GdiEntry1 は、この関数のエイリアスとして定義されます。 |
DdCreateSurfaceObject | NtGdiDdCreateSurfaceObject 関数のラッパーで、カーネル モードの Surface オブジェクトを作成します。 GdiEntry4 は、この関数のエイリアスとして定義されます。 |
DdDeleteDirectDrawObject | NtGdiDdDeleteDirectDrawObject 関数のラッパーと、DdCreateDirectDrawObject を使用して以前に作成されたカーネル モードの DirectDraw オブジェクトを削除します。 GdiEntry3 は、この関数のエイリアスとして定義されます。 |
DdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject 関数のラッパーで、以前に NtGdiDdCreateSurfaceObject によって作成されたカーネル モード の Surface オブジェクトを削除します。 GdiEntry5 は、この関数のエイリアスとして定義されます。 |
DdGetDC | NtGdiDdGetDC 関数のラッパーで、示されている DirectDraw サーフェイスを表すWindowsグラフィックス デバイス インターフェイス (GDI) デバイス コンテキスト (DC) を返します。 GdiEntry7 は、この関数の別名として定義されます。 |
DdGetDxHandle | DdGetDxHandle は、DirectX API メカニズムを制御するカーネル モード エントリ ポイントへの後続の呼び出しで使用するカーネル モードの Microsoft DirectX API ハンドルを返します。 |
DdQueryDirectDrawObject | NtGdiDdQueryDirectDrawObject 関数のラッパーで、以前に作成したカーネル モード表現に対して機能のクエリを実行します。 GdiEntry2 は、この関数のエイリアスとして定義されます。 |
DdQueryDisplaySettingsUniqueness | デスクトップ スイッチ、高速ユーザー スイッチ、全画面表示の Microsoft MS-DOS ボックスなど、モード スイッチが発生するたびにインクリメントされる整数の現在の値を返します。 アプリケーションはこの関数を繰り返し呼び出し、戻り値の古い値と新しい値を比較して、表示設定が変更されているかどうかを判断できます。 GdiEntry13 は、この関数のエイリアスとして定義されます。 |
DdReenableDirectDrawObject | NtGdiDdReenableDirectDrawObject 関数のラッパー。 True モード スイッチ、全画面表示 MS-DOS ボックスの外観、ディスプレイ ドライバーの変更など、モード 切り替えスタイルのイベントの後に DirectDraw ドライバー インスタンスを再び有効にします。 GdiEntry10 は、この関数のエイリアスとして定義されます。 |
DdReleaseDC | NtGdiDdReleaseDC 関数のラッパーで、DdGetDC または GdiEntry7 で以前に取得した DC を解放します。 GdiEntry8 は、この関数のエイリアスとして定義されます。 |
DdResetVisrgn | NtGdiDdResetVisrgn 関数のラッパーであり、デスクトップ上のウィンドウのクリッピング領域に関するタイムリーなユーザー モード情報を有効にします。 GdiEntry6 は、この関数のエイリアスとして定義されます。 |
DdSetGammaRamp | DdSetGammaRamp 関数は、デバイスのガンマ ランプを設定します。 |
DdSwapTextureHandles | Microsoft DirectDraw 7.0 より前のデバイス ドライバー インターフェイス (DDI) 用に開発されており、Microsoft Windows NT システムでは何も行いません。 すべてのパラメーターは無視されます。 GdiEntry16 は、この関数のエイリアスとして定義されます。 |
DdUnattachSurface | DdUnattachSurface 関数は、2 つのカーネル モード サーフェス オブジェクトの間に DdAttachSurface で作成された添付ファイルを削除します。 |
NtGdiD3DContextCreate | コンテキストを作成します。 |
NtGdiD3DContextDestroy | 指定したコンテキストを削除します。 |
NtGdiD3DContextDestroyAll | ドライバーマネージド メモリ ヒープ内の空きメモリの量を照会します。 |
NtGdiD3DDrawPrimitives2 | プリミティブをレンダリングし、更新されたレンダリング状態を返します。 |
NtGdiD3DGetDriverState | DirectDraw ランタイムと Direct3D ランタイムの両方で、ドライバーから現在の状態に関する情報を取得するために使用されます。 |
NtGdiD3DValidateTextureStageState | ハードウェアが現在の状態で指定されたブレンド操作を実行できるパスの数を返します。 |
NtGdiDdAddAlphaBlt | 実装されていません。 |
NtGdiDdAddAttachedSurface | サーフェスを別のサーフェスにアタッチします。 |
NtGdiDdAttachSurface | 2 つのカーネル モードサーフェス表現をアタッチします。 |
NtGdiDdBeginMoCompFrame | 新しいフレームのデコードを開始します。 |
NtGdiDdBlt | ビット ブロック転送を実行します。 |
NtGdiDdCanCreateD3DBuffer | ドライバーが、指定した説明のドライバー レベルのコマンドまたは頂点バッファーを作成できるかどうかを決定します。 |
NtGdiDdCanCreateSurface | ドライバーが指定したサーフェスの説明のサーフェスを作成できるかどうかを示します。 |
NtGdiDdColorControl | オーバーレイ サーフェスの輝度と明るさのコントロールを制御します。 |
NtGdiDdCreateD3DBuffer | 指定した説明のドライバー レベルのコマンドまたは頂点バッファーを作成するために使用します。 |
NtGdiDdCreateDirectDrawObject | DirectDraw オブジェクトのカーネル側表現を作成します。 |
NtGdiDdCreateMoComp | ソフトウェア デコーダーが指定された GUID でモーション補正の使用を開始することをドライバーに通知します。 |
NtGdiDdCreateSurface | サーフェスを別のサーフェスにアタッチします。 |
NtGdiDdCreateSurfaceEx | DirectDraw サーフェスから Direct3D サーフェスを作成し、要求されたハンドル値をそれに関連付けます。 |
NtGdiDdCreateSurfaceObject | puSurfaceLocal によって参照されるユーザー モードサーフェスオブジェクトを表すカーネルモードサーフェスオブジェクトを作成します。 |
NtGdiDdDeleteDirectDrawObject | 以前に作成したカーネル モード DirectDraw デバイス オブジェクトを破棄します。 |
NtGdiDdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject は、以前に作成したカーネル モードサーフェイス オブジェクトを削除します。 |
NtGdiDdDestroyD3DBuffer | DDSCAPS_EXECUTEBUFFERに設定された DDSCAPS 構造体の dwCaps メンバーで作成された、以前に割り当てられたカーネル モード DirectDraw サーフェス オブジェクトを破棄します。 |
NtGdiDdDestroyMoComp | このモーション補正オブジェクトが使用されなくなることをドライバーに通知します。 ドライバーは必要なクリーンアップを実行する必要があります。 |
NtGdiDdDestroySurface | 以前に割り当てられたカーネル モード DirectDraw サーフェス オブジェクトを破棄します。 |
NtGdiDdEndMoCompFrame | デコードされたフレームを完了します。 |
NtGdiDdFlip | ターゲット サーフェスと現在のサーフェスに関連付けられているサーフェス メモリを交換します。 |
NtGdiDdFlipToGDISurface | DirectDraw が GDI サーフェスに対して、または GDI サーフェスから反転しているときにドライバーに通知します。 |
NtGdiDdGetAvailDriverMemory | すべてのビデオ メモリ ヒープ内の空きメモリの量を照会します。 |
NtGdiDdGetBltStatus | 指定したサーフェスの blit 状態を照会します。 |
NtGdiDdGetDC | 指定したサーフェスの DC を作成します。 |
NtGdiDdGetDriverInfo | ドライバーがサポートする追加の DirectDraw および Direct3D 機能をドライバーに照会します。 |
NtGdiDdGetDxHandle | DirectX API メカニズムを制御するカーネル モード エントリ ポイントの後続の呼び出しで使用するカーネル モード DirectX API ハンドルを返します。 |
NtGdiDdGetFlipStatus | サーフェスで最後に要求されたフリップが発生したかどうかを判断します。 |
NtGdiDdGetInternalMoCompInfo | ドライバーが、モーション補正を実行するためにディスプレイ メモリを内部的に割り当てることを報告できるようにします。 |
NtGdiDdGetMoCompBuffInfo | ドライバーは、指定した GUID をサポートするために必要な中間サーフェスの数と、これらの各サーフェスのサイズ、場所、および形式を指定できます。 |
NtGdiDdGetMoCompFormats | ハードウェアがデータをデコードできる非圧縮形式を示します。 |
NtGdiDdGetMoCompGuids | ドライバーがサポートする GUID の数を取得します。 |
NtGdiDdGetScanLine | 現在の物理スキャン行の数を返します。 |
NtGdiDdLock | 指定されたサーフェス メモリ領域をロックし、サーフェスに関連付けられているメモリ ブロックへの有効なポインターを提供します。 |
NtGdiDdLockD3D | バッファー メモリの指定された領域をロックし、バッファーに関連付けられているメモリ ブロックへの有効なポインターを提供するために使用されます。 |
NtGdiDdQueryDirectDrawObject | 以前に作成した DirectDraw オブジェクトのカーネル モード表現の機能を照会します。 |
NtGdiDdQueryMoCompStatus | 指定したサーフェスに対して、最新のレンダリング操作の状態を照会します。 |
NtGdiDdReenableDirectDrawObject | モード スイッチ後に DirectDraw カーネル モード デバイス オブジェクトを再度有効にします。 |
NtGdiDdReleaseDC | 指定されたカーネル モード DirectDraw サーフェス オブジェクトに対して以前に作成した DC を解放します。 |
NtGdiDdRenderMoComp | マクロブロックを含むサーフェス、マクロブロックが存在する各サーフェスのオフセット、およびレンダリングするマクロブロック データのサイズを指定して、レンダリングするマクロブロックをドライバーに指示します。 |
NtGdiDdResetVisrgn | ユーザー モードを有効にして、デスクトップ上のウィンドウのクリッピング領域の有効な理解を得るために使用します。 このクリッピングは、ユーザー モード スレッドの観点から非同期的に変更される可能性があります。 |
NtGdiDdSetColorKey | 指定したサーフェスのカラー キー値を設定します。 |
NtGdiDdSetExclusiveMode | DirectDraw アプリケーションが排他モードに切り替わるときにドライバーに通知します。 |
NtGdiDdSetGammaRamp | デバイスのガンマ ランプを設定します。 |
NtGdiDdSetOverlayPosition | オーバーレイの位置を設定します。 |
NtGdiDdUnattachSurface | NtGdiDdAttachSurface を使用して作成された添付ファイルを、2 つのカーネル モードサーフェイス オブジェクトの間で削除します。 |
NtGdiDdUnlock | 指定したサーフェスに保持されているロックを解放します。 |
NtGdiDdUnlockD3D | バッファー メモリの指定された領域に保持されているロックを解放するために使用されます。 |
NtGdiDdUpdateOverlay | オーバーレイ サーフェスの視覚的属性を再配置または変更します。 |
NtGdiDdWaitForVerticalBlank | デバイスの垂直空の状態を返します。 |
関連トピック