функция обратного вызова 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) |