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 图形内核子系统无法解析 hObjectDXGKARGCB_GETHANDLEDATA 结构成员中提供的句柄,原因如下:

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

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

言论

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

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

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

下面的代码示例演示调用 DXGKCB_GETHANDLEDATADxgkDdiOpenAllocation 的实现。

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