Поделиться через


функция обратного вызова PDX_TRANSFER (dxmini.h)

Функция обратного вызова DxTransfer сообщает драйверу master данные из поверхности в буфер, указанный в списке дескрипторов памяти (MDL).

Синтаксис

PDX_TRANSFER PdxTransfer;

DWORD PdxTransfer(
  PVOID unnamedParam1,
  PDDTRANSFERININFO unnamedParam2,
  PDDTRANSFEROUTINFO unnamedParam3
)
{...}

Параметры

unnamedParam1

Указывает на расширение устройства драйвера мини-порта.

unnamedParam2

Указывает на структуру DDTRANSFERININFO , содержащую передаваемые данные для поверхности.

unnamedParam3

Указывает на структуру DDTRANSFEROUTINFO , содержащую полярность захватываемого поля.

Возвращаемое значение

DxTransfer возвращает DX_OK в случае успешного выполнения; В противном случае возвращается одно из следующих значений ошибки:

Комментарии

MDL определяется в документации по WDM .

Как показано в следующем примере кода, драйвер видео минипорта может использовать указатель на MDL в элементе lpDestMDL структуры DDTRANSFERININFO в параметре TransferInInfo, чтобы master данные на страницы физической памяти, составляющие разбросанный буфер:

DWORD 
DxTransfer(
    DEVICE_EXT *pDeviceExt, 
    PDDTRANSFERININFO pTransferInInfo, 
    PDDTRANSFEROUTINFO pTransferOutInfo
    )
{
    PMDL pMdl;
    UINT uiNbPages;
    PPFN_NUMBER pPages;
    PVOID MappedSystemVa;
    ULONG ByteCount;

    pMdl = pTransferInInfo->lpDestMDL;
    MappedSystemVa = MmGetMdlVirtualAddress(pMdl);
    ByteCount = MmGetMdlByteCount(pMdl);
    uiNbPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MappedSystemVa,
                                               ByteCount);
    pPages = MmGetMdlPfnArray(pMdl)
    for (i=0; i<uiNbPages; i++) {
        //
        // Transfer to page[i]
        //
        pPages[i];
    }
}

Дополнительные сведения см. в макросах ADDRESS_AND_SIZE_TO_SPAN_PAGES, MmGetMdlByteCount, MmGetMdlPfnArray и MmGetMdlVirtualAddress в режиме ядра.

DxTransfer вызывается во время прерывания оборудования. Это означает, что водитель не может ждать завершения предыдущего master шины и не может вызывать функции, которые не являются безопасными для вызова во время прерывания (т. е. большинство из них).

Кроме того, драйвер не должен завершать вызов только потому, что оборудование в настоящее время занято. Вместо этого драйвер должен поддерживать внутреннюю очередь.

Требования

   
Целевая платформа Персональный компьютер
Верхняя часть dxmini.h (включая Dxmini.h)

См. также раздел

ADDRESS_AND_SIZE_TO_SPAN_PAGES

DDTRANSFERININFO

DDTRANSFEROUTINFO

MmGetMdlByteCount

MmGetMdlPfnArray

MmGetMdlVirtualAddress