[これらの機能は、オペレーティング システムのリビジョンごとに変更される可能性があります。 代わりに、Microsoft DirectDraw と Microsoft Direct3DAPIs を使用します。これらの 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。Windows XP では変更されていない状態で実行されます。 オペレーティング システムの移植性を作成するためのメカニズムについては、次のセクションで説明します。
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 システムで使用できるようになり、上記の Windows XP で説明したのと同じ手法を使用できるため、アプリケーションで 1 つのコード パスを使用できるようになります。
アプリケーションでは、独自の絶縁 DLL を構築し、その DLL の 2 つのバージョンを実装することもできます。1 つは、上記の手法を使用した Windows 2000 用と、D3D8THK.DLLを使用する Windows XP 用です。
デバイスの作成
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 関数のラッパーで、カーネル モードのサーフェス オブジェクトを作成します。 GdiEntry4 は、この関数のエイリアスとして定義されます。 |
DdDeleteDirectDrawObjectの |
NtGdiDdDeleteDirectDrawObject 関数のラッパー。以前に ddCreateDirectDrawObjectを使用して作成されたカーネル モードの DirectDraw オブジェクト削除します。 GdiEntry3 は、この関数のエイリアスとして定義されます。 |
DdDeleteSurfaceObjectの |
NtGdiDdDeleteSurfaceObject 関数のラッパーで、以前に ntGdiDdCreateSurfaceObjectによって作成されたカーネル モードサーフェス オブジェクト削除します。 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 関数は、DdAttachSurfaceで作成された添付ファイルを、2 つのカーネル モードサーフェス オブジェクト間で削除します。 |
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 | デバイスの垂直空の状態を返します。 |
関連トピック
-
表示 の概要