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 成员中提供的句柄解析为专用数据,原因如下:

  • 由于恶意攻击或其他一些 bug,从用户模式显示驱动程序收到无效句柄。
  • 分配有生存期问题。

如果返回 NULL 指针,则显示微型端口驱动程序应会因STATUS_INVALID_HANDLE而使当前运行的 DDI 函数失败。

注解

当 DirectX 图形内核子系统调用显示微型端口驱动程序的 DxgkDdiCreateAllocation 函数来创建分配句柄时,显示微型端口驱动程序可以为每个分配句柄创建专用数据。 显示微型端口驱动程序随后可以调用 DXGKCB_GETHANDLEDATA 函数来检索每个图形子系统特定的句柄的私有数据。 因此,不需要显示微型端口驱动程序来维护专用分配句柄表。

如果在 pData 指向的 DXGKARGCB_GETHANDLEDATA 结构的 Flags 成员中设置了 DeviceSpecific 位字段标志,DXGKCB_GETHANDLEDATA返回与驱动程序从对其 DxgkDdiOpenAllocation 函数的调用返回的设备特定句柄关联的特定于设备的数据。 请注意,仅当显示微型端口驱动程序还将 DXGKARGCB_GETHANDLEDATAType 成员设置为 DXGKARGCB_GETHANDLEDATA 的 hObject 成员中的句柄的 DXGK_HANDLE_ALLOCATION 枚举值时DeviceSpecific 位字段标志才有效。

DXGKCB_XXX 函数由 Dxgkrnl 实现。 若要使用此回调函数,请设置 DXGKARGCB_GETHANDLEDATA 的成员,然后通过 DXGKRNL_INTERFACE调用 DxgkCbGetHandleData

示例

下面的代码示例演示 了 DxgkDdiOpenAllocation 的实现,其中调用 了 DXGKCB_GETHANDLEDATA

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