次の方法で共有


DXGKCB_GETHANDLEDATA コールバック関数 (d3dkmddi.h)

DXGKCB_GETHANDLEDATA は、割り当てに関連付けられているプライベート データを取得します。

構文

DXGKCB_GETHANDLEDATA DxgkcbGethandledata;

VOID * DxgkcbGethandledata(
  IN_CONST_PDXGKARGCB_GETHANDLEDATA unnamedParam1
)
{...}

パラメーター

unnamedParam1

[入力]取得する割り当てデータを記述する DXGKARGCB_GETHANDLEDATA 構造体へのポインター。

戻り値

DXGKCB_GETHANDLEDATA は、割り当てのプライベート データを含むバッファーを返します。

DXGKCB_GETHANDLEDATAが NULL ポインターを返す場合、DirectX グラフィックス カーネル サブシステムは、次のような理由で、DXGKARGCB_GETHANDLEDATA構造体の hObject メンバーで指定されたハンドルをプライベート データに解決できませんでした。

  • 悪意のある攻撃またはその他のバグが原因で、無効なハンドルがユーザー モード ディスプレイ ドライバーから受信されました。
  • 割り当てには有効期間の問題がありました。

NULL ポインターが返された場合、ディスプレイ ミニポート ドライバーは、STATUS_INVALID_HANDLEを使用して現在実行中の DDI 関数に失敗する必要があります。

注釈

DirectX グラフィックス カーネル サブシステムがディスプレイ ミニポート ドライバーの DxgkDdiCreateAllocation 関数を呼び出して割り当てのハンドルを作成すると、ディスプレイ ミニポート ドライバーは割り当てハンドルごとにプライベート データを作成できます。 ディスプレイ ミニポート ドライバーは、その後 、各 グラフィックス サブシステム固有のハンドルのプライベート データを取得するDXGKCB_GETHANDLEDATA関数を呼び出すことができます。 したがって、ディスプレイ ミニポート ドライバーは、プライベート割り当てハンドル テーブルを維持するために必要ありません。

pData が指すDXGKARGCB_GETHANDLEDATA構造体の Flags メンバーで DeviceSpecific ビット フィールド フラグが設定されている場合、DXGKCB_GETHANDLEDATAは、ドライバーが DxgkDdiOpenAllocation 関数の呼び出しから返したデバイス固有のハンドルに関連付けられているデバイス固有のデータを返します。 DeviceSpecific ビット フィールド フラグは、ディスプレイ ミニポート ドライバーが DXGKARGCB_GETHANDLEDATA の hObject メンバー内のハンドルのDXGK_HANDLE_ALLOCATION列挙値にDXGKARGCB_GETHANDLEDATAType メンバーも設定する場合にのみ有効であることに注意してください。

DXGKCB_XXX 関数は Dxgkrnl によって実装されます。 このコールバック関数を使用するには、DXGKARGCB_GETHANDLEDATAのメンバー設定し、DXGKRNL_INTERFACE経由で DxgkCbGetHandleData を呼び出します。

次のコード例は、DXGKCB_GETHANDLEDATAが呼び出される DxgkDdiOpenAllocation の実装を示しています。

NTSTATUS
DxgkDdiOpenAllocation(
    VOID    *InterfaceContext,
    CONST DXGKARG_OPENALLOCATION    *pDDIDAData)
{
    DWORD dwIdx;
    DXGKRNL_INTERFACE              *pCallback;
    PR2D3DDevice                    pR2D3DDev;
    PHW_DEVICE_EXTENSION            pAdapter;

    pR2D3DDev = (PR2D3DDevice)InterfaceContext;
    pAdapter  = (PHW_DEVICE_EXTENSION)pR2D3DDev->pAdapter;
    pCallback = &(pAdapter->ddiCallback);

    for (dwIdx=0; dwIdx < pDDIDAData->NumAllocations; dwIdx++) {
        DXGKARGCB_GETHANDLEDATA  getHandleData = {0};
        R2AllocationInfo*  pAllocInfo;

        getHandleData.hObject = pDDIDAData->pOpenAllocation[dwIdx].hAllocation;
        getHandleData.Type    = DXGK_HANDLE_ALLOCATION;
        pAllocInfo = (PR2AllocationInfo)pCallback->DxgkCbGetHandleData(&getHandleData);
        pDDIDAData->pOpenAllocation[dwIdx].hDeviceSpecificAllocation = (HANDLE)pAllocInfo;
        pAllocInfo->vidMemData.hAllocation = pDDIDAData->pOpenAllocation[dwIdx].hAllocation;
    }
    return STATUS_SUCCESS;
}

要件

要件
サポートされている最小のクライアント Windows Vista (WDDM 1.0)
対象プラットフォーム デスクトップ
Header d3dkmddi.h (D3dkmddi.h を含む)
IRQL < DISPATCH_LEVEL

こちらもご覧ください

DXGKARGCB_GETHANDLEDATA

DxgkDdiCreateAllocation

DxgkDdiOpenAllocation

DXGKRNL_INTERFACE