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 멤버에 제공된 핸들을 프라이빗 데이터에 resolve 수 없습니다.

  • 악의적인 공격이나 다른 버그로 인해 사용자 모드 디스플레이 드라이버에서 잘못된 핸들을 수신했습니다.
  • 할당에는 수명 문제가 있었습니다.

NULL 포인터가 반환되면 디스플레이 미니포트 드라이버가 STATUS_INVALID_HANDLE 현재 실행 중인 DDI 함수에 실패해야 합니다.

설명

DirectX 그래픽 커널 하위 시스템이 디스플레이 미니포트 드라이버의 DxgkDdiCreateAllocation 함수를 호출하여 할당에 대한 핸들을 만들 때 디스플레이 미니포트 드라이버는 각 할당 핸들에 대한 프라이빗 데이터를 만들 수 있습니다. 디스플레이 미니포트 드라이버는 이후에 DXGKCB_GETHANDLEDATA 함수를 호출하여 각 그래픽 하위 시스템별 핸들에 대한 프라이빗 데이터를 검색할 수 있습니다. 따라서 프라이빗 할당 핸들 테이블을 유지 관리하기 위해 디스플레이 미니포트 드라이버가 필요하지 않습니다.

deviceSpecific 비트 필드 플래그가 pData가 가리키는 DXGKARGCB_GETHANDLEDATA 구조의 Flags 멤버에 설정된 경우 DXGKCB_GETHANDLEDATA 드라이버가 DxgkDdiOpenAllocation 함수에 대한 호출에서 반환한 디바이스별 핸들과 연결된 디바이스별 데이터를 반환합니다. DeviceSpecific 비트 필드 플래그는 디스플레이 미니포트 드라이버가 DXGKARGCB_GETHANDLEDATA Type 멤버를 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