次の方法で共有


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

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

構文

DXGKCB_GETHANDLEDATA DxgkcbGethandledata;

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

パラメーター

unnamedParam1

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

戻り値

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

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

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

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

備考

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

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

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)
ターゲット プラットフォーム デスクトップ
ヘッダー d3dkmddi.h (D3dkmddi.h を含む)
IRQL < DISPATCH_LEVEL

関連項目

DXGKARGCB_GETHANDLEDATA

DxgkDdiCreateAllocationする

DxgkDdiOpenAllocationする

DXGKRNL_INTERFACE