функция обратного вызова DXGKDDI_QUERYCURRENTFENCE (d3dkmddi.h)
Функция DxgkDdiQueryCurrentFence запросы о последнем завершенном идентификаторе ограждения отправки в блоке выполнения команд оборудования.
Синтаксис
DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;
NTSTATUS DxgkddiQuerycurrentfence(
[in] IN_CONST_HANDLE hAdapter,
[in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}
Параметры
[in] hAdapter
Дескриптор к блоку контекста, связанному с адаптером отображения. Драйвер минипорта отображения ранее предоставил этот дескриптор подсистеме ядра графики Microsoft DirectX в MiniportDeviceContext выходном параметре функции DxgkDdiAddDevice.
[in/out] pCurrentFence
Указатель на DXGKARG_QUERYCURRENTFENCE структуру, содержащую сведения о текущих данных о ограждении.
Возвращаемое значение
DxgkDdiQueryCurrentFence возвращает STATUS_SUCCESS или соответствующий результат ошибки, если данные оборе не получены успешно.
Замечания
ограждение — это инструкция, содержащая 64 бита данных и адрес. Драйвер мини-порта дисплея может вставить забор в поток прямого доступа к памяти (DMA), который отправляется в модуль обработки графики (GPU). Когда GPU считывает забор, GPU записывает данные о заборе по указанному адресу ограждения. Тем не менее, прежде чем GPU может записывать данные забора в память, он должен обеспечить, чтобы все пиксели от примитивов, предшествующих инструкции по ограждению, были сняты и правильно записаны в память.
- обычные ограждения являются заборами, которые можно вставить в буфер DMA, созданный в пользовательском режиме. Так как содержимое буфера DMA из пользовательского режима не является доверенным, заборы в таком буфере DMA должны ссылаться на виртуальный адрес в адресном пространстве gpu, а не на физический адрес. Доступ к такому виртуальному адресу привязан тем же механизмом проверки памяти, что и любой другой виртуальный адрес, к которому обращается GPU.
-
привилегированные ограждения — это заборы, которые можно вставить только в созданный буфер DMA (и доступен только в режиме ядра). Ограждения в таком буфере DMA относятся к физическому адресу в памяти.
Обратите внимание, что если целевой адрес забора был доступен в пользовательском режиме, вредоносное программное обеспечение может выполнить графику по расположению памяти для забора и, следовательно, переопределить содержимое того, что ядро должно получить.
Если драйвер минипорта отображения пропустил последний забор буфера DMA, функция dxgkDdiQueryCurrentFence может быть вызвана для сообщения о пропущенном заборе. Например, если оборудование создает ограждение для памяти, функция dxgkDdiInterruptRoutine активируется для чтения памяти. Однако, если данные о заборе недоступны, когда водитель пытается считывать данные (например, если есть дефектный набор микросхем), забор обычно сообщается при следующем прерывании, если прерывания не были остановлены. Если прерывания были остановлены, и подсистема ядра графики DirectX ожидает слишком долго забора, подсистема вызывает драйвера dxgkDdiQueryCurrentFence функцию, чтобы проверить текущий забор и определить любой ожидающий забор, который он мог пропустить.
Прежде чем драйвер минипорта отображения возвращается из вызова DxgkDdiQueryCurrentFence, если последний идентификатор забора забора, завершенного оборудованием, еще не сообщался, драйвер должен вызвать функцию DxgkCbNotifyInterrupt, чтобы сообщить о заборе. Чтобы реализовать эту функцию, драйвер:
- Отслеживает, какие ограждения в последний раз сообщались операционной системе.
- Вызывает irQL для прерывания устройства. Чтобы вызвать irQL до уровня прерывания, драйвер может вызвать функцию DxgkCbSynchronizeExecution для синхронизации с ее функцией DxgkDdiInterruptRoutine.
- При прерывании IRQL устройства сравнивает последний сообщаемый забор с последним аппаратным забором.
- При прерывании IRQL устройства вызовы DxgkCbNotifyInterrupt только в том случае, если последнее оборудование завершено ограждение является более новым, чем последнее сообщаемое ограждение.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows Vista |
целевая платформа | Настольный |
заголовка | d3dkmddi.h (include D3dkmddi.h) |
IRQL | PASSIVE_LEVEL |