다음을 통해 공유


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 함수를 호출하여 각 그래픽 하위 시스템별 핸들에 대한 개인 데이터를 검색할 수 있습니다. 따라서 디스플레이 미니포트 드라이버는 프라이빗 할당 핸들 테이블을 유지 관리할 필요가 없습니다.

pData 가리키는 DXGKARGCB_GETHANDLEDATA 구조체의 Flags 멤버에 DeviceSpecific 비트 필드 플래그가 설정된 경우 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