Поддержка клиентов низкого уровня графики
[Эти функции могут изменяться при каждой редакции операционной системы. Вместо этого используйте Microsoft DirectDraw и Microsoft Direct3DAPIs; эти API изолируют приложения от таких изменений операционной системы и скрывают множество других трудностей, связанных с взаимодействием непосредственно с драйверами отображения. Дополнительные сведения см. в разделе "Общие сведения о отображении".]
DirectDraw и Direct3D используют некоторые подпрограммы режима ядра для взаимодействия с операционной системой и драйвером отображения.
Ядро операционной системы, как представляется, является драйвером отображения DirectDraw/Direct3D с точки зрения компонентов пользовательского режима. Однако существуют некоторые различия между ядрами и драйверами отображения. Компоненты режима ядра сохраняют копию структур, представляющих объекты DirectDraw/Direct3D, такие как устройства и поверхности. Компонент пользовательского режима DirectDraw/Direct3D запрашивает создание этих структур, которые называются дескрипторами, возвращаемыми режимом ядра. Следовательно, различия в основном находятся в аргументах, передаваемых подпрограммам: ядро принимает дескрипторы, в то время как драйверы обычно принимают указатели.
- Эволюция точек входа в режим ядра
- Вызов ядра
- Написание переносимых приложений
- Создание устройства
- Объекты ядра
- Функции
- Связанные статьи
Эволюция точек входа в режим ядра
DirectDraw делает все его подключения к режиму ядра через Gdi32.dll с помощью нескольких точек входа. Обычно эти точки входа просто маршалы параметров. В рамках создания устройства Gdi32.dll возвращает указатели на подпрограммы внутри себя, которые затем используются DirectDraw и Direct3D 7.0.
Direct3D 8.x делает чистый разрыв от Gdi32.dll и вызывается непосредственно в точках входа в режим ядра.
Вызов ядра
Эти точки входа похожи и, во многих случаях, идентичны точкам входа в самом драйвере отображения, поэтому понимание материалов комплекта средств разработки драйверов (DDK) для DirectDraw и Direct3D является необходимым условием для использования этих функций.
Вызов этих функций отличается от операционных систем. В Windows 2000 W2KUMODE. Библиотека LIB содержит подпрограммы, позволяющие вызывающей потоку перейти в режим ядра. Эти подпрограммы не маршалируют параметры и являются идеальным механизмом вызова в Windows 2000. Механизм, который делает переход в режим ядра, зависит от порядка таблицы. Это упорядочение изменится в разных версиях операционной системы. Поэтому не рекомендуется создавать приложение, использующее W2KUMODE. LIB для Windows 2000 и ожидает, что он будет работать без изменений в Windows XP. Механизм создания переносимости операционной системы описан в следующем разделе.
В Windows XP D3D8THK.DLL экспортирует все функции режима ядра, но с небольшим украшенным именем. В следующем примере показано, как приложения могут псевдонимом низкоуровневых клиентских функций с помощью препроцессора. Перед этим динамическое связывание с D3D8THK.DLL.
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
Написание переносимых приложений
Для переносимого приложения в операционных системах доступны несколько методов. Наиболее надежным является установка распространяемого пакета Microsoft DirectX 8.x в Windows 2000 в рамках процесса установки собственного приложения. Это гарантирует, что D3D8THK.DLL будут доступны в системах Windows 2000 и позволяют использовать один путь к коду в приложении, так как можно использовать тот же метод, что и для Windows XP выше.
Приложения также могут создавать собственные библиотеки DLL и реализовывать две версии этой библиотеки DLL, одну для Windows 2000, используя описанный выше метод и один для Windows XP, использующий D3D8THK.DLL.
Создание устройства
DirectDraw и Direct3D сначала должны создать экземпляр абстракции ядра объекта драйвера. В Gdi32.dll и Ddraw.dll это достигается путем вызова DdCreateDirectDrawObject, DdQueryDirectDrawObject и DdReenableDirectDrawObject. В Direct3D 8.x, это достигается путем вызова NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject и NtGdiDdReenableDirectDrawObject. Обратите внимание, что точки входа GdiEntry* — это просто маршалеры для точек входа в режиме ядра.
После вызова этих функций возвращается дескриптор, представляющий абстракцию объекта ядра устройства DirectDraw. Этот объект ядра представляет экземпляр драйвера, принадлежащий драйверу отображения. Этот дескриптор можно использовать в последующих вызовах, таких как DdCreateSurfaceObject (или NtGdiDdCreateSurfaceObject в Direct3D 8.x) для создания дополнительных объектов.
Объекты ядра
Для управления представлениями определенных объектов в режиме ядра используются несколько точек входа. DdCreateSurfaceObject (или NtGdiDdCreateSurfaceObject в Direct3D 8.x) является хорошим примером. Эта точка входа создает объект режима ядра, представляющий часть системной памяти. Точка входа возвращает дескриптор, и этот дескриптор можно использовать в последующих вызовах рисования. Ядро наследует указатель на собственную структуру от этих дескрипторов и передает этот указатель на драйвер отображения, который затем выполняет операцию.
Функции
В этой таблице перечислены функции, представляющие точки входа в режим ядра, и вспомогательные подпрограммы пользовательского режима в Gdi32.dll, которые обтекают эти точки входа.
Раздел | Содержимое |
---|---|
DdAttachSurface | Функция DdAttachSurface присоединяет два представления поверхности режима ядра. |
DdCreateDIBSection | Создает структуру DIBSECTION, которая использует свою цветовую таблицу с устройством. GdiEntry9 #defined в качестве псевдонима для этой функции. |
DdCreateDirectDrawObject | Оболочка для функции NtGdiDdCreateDirectDrawObject и создает представление объекта DirectDraw на стороне ядра. Дескриптор этого представления будет храниться в pDirectDrawGlobal-hDD>. GdiEntry1 определяется как псевдоним для этой функции. |
DdCreateSurfaceObject | Оболочка для функции NtGdiDdCreateSurfaceObject и создает объект поверхности режима ядра. GdiEntry4 определяется как псевдоним для этой функции. |
DdDeleteDirectDrawObject | Оболочка для функции NtGdiDdDeleteDirectDrawObject и удаляет объект DirectDraw режима ядра, созданный ранее с помощью DdCreateDirectDrawObject. GdiEntry3 определяется как псевдоним для этой функции. |
DdDeleteSurfaceObject | Оболочка для функции NtGdiDdDeleteSurfaceObject и удаляет объект поверхности режима ядра, ранее созданный ntGdiDdCreateSurfaceObject. GdiEntry5 определяется как псевдоним для этой функции. |
DdGetDC | Оболочка для функции NtGdiDdGetDC и возвращает контекст устройства интерфейса графического устройства Windows (GDI), представляющий указанную поверхность DirectDraw. GdiEntry7 определяется как псевдоним для этой функции. |
DdGetDxHandle | DdGetDxHandle возвращает дескриптор API Microsoft DirectX в режиме ядра для использования в последующих вызовах точек входа в режиме ядра, которые управляют механизмом API DirectX. |
DdQueryDirectDrawObject | Оболочка для функции NtGdiDdQueryDirectDrawObject и запрашивает ранее созданное представление режима ядра для возможностей. GdiEntry2 определяется как псевдоним для этой функции. |
DdQueryDisplay Параметры Uniqueness | Возвращает текущее значение целого числа, которое увеличивается при каждом переключении режима, например при наличии классического коммутатора, быстрого пользовательского коммутатора или полноэкранного окна Microsoft MS-DOS. Приложение может многократно вызывать эту функцию и сравнивать старые и новые значения возвращаемого значения, чтобы определить, изменились ли параметры отображения. GdiEntry13 определяется как псевдоним для этой функции. |
DdReenableDirectDrawObject | Оболочка для функции NtGdiDdReenableDirectDrawObject. Он повторно включает экземпляр драйвера DirectDraw после события переключателя режима, такого как переключатель режима true, внешний вид полноэкранного окна MS-DOS или изменение драйвера дисплея. GdiEntry10 определяется как псевдоним для этой функции. |
DdReleaseDC | Оболочка для функции NtGdiDdReleaseDC и освобождает контроллер домена, полученный ранее через DdGetDC или GdiEntry7. GdiEntry8 определяется как псевдоним для этой функции. |
DdResetVisrgn | Оболочка для функции NtGdiDdResetVisrgn и обеспечивает своевременную информацию о регионе вырезки для окон на рабочем столе. GdiEntry6 определяется как псевдоним для этой функции. |
DdSetGammaRamp | Функция DdSetGammaRamp задает гамма-пандус для устройства. |
DdSwapTextureHandles | Разработано для интерфейсов драйверов устройств (DDIs) до Microsoft DirectDraw 7.0 и ничего не делает в системах Microsoft Windows NT. Все параметры игнорируются. GdiEntry16 определяется как псевдоним для этой функции. |
DdUnattachSurface | Функция DdUnattachSurface удаляет вложение, созданное с помощью DdAttachSurface, между двумя объектами поверхности в режиме ядра. |
NtGdiD3DContextCreate | Создает контекст. |
NtGdiD3DContextDetextDesk | Удаляет указанный контекст. |
NtGdiD3DContextDetextAll | Запрашивает объем свободной памяти в куче памяти, управляемой драйвером. |
NtGdiD3DDrawPrimitives2 | Отрисовывает примитивы и возвращает обновленное состояние отрисовки. |
NtGdiD3DGetDriverState | Используется средами выполнения DirectDraw и Direct3D для получения сведений от драйвера о текущем состоянии. |
NtGdiD3DValidateTextureStageState | Возвращает количество проходов, в которых оборудование может выполнять операции смешения, указанные в текущем состоянии. |
NtGdiDdAddAlphaBlt | Не реализовано. |
NtGdiDdAddAttachedSurface | Присоединяет поверхность к другой поверхности. |
NtGdiDdAttachSurface | Присоединяет два представления поверхности в режиме ядра. |
NtGdiDdBeginMoCompFrame | Начинает декодировать новый кадр. |
NtGdiDdBlt | Выполняет передачу битовых блоков. |
NtGdiDdCanCreateD3DBuffer | Определяет, может ли драйвер создать команду уровня драйвера или буфер вершин указанного описания. |
NtGdiDdCanCreateSurface | Указывает, может ли драйвер создать поверхность указанного описания поверхности. |
NtGdiDdColorControl | Управляет элементами управления светом и яркостью поверхности наложения. |
NtGdiDdCreateD3DBuffer | Используется для создания команды уровня драйвера или буфера вершин указанного описания. |
NtGdiDdCreateDirectDrawObject | Создает представление объекта DirectDraw на стороне ядра. |
NtGdiDdCreateMoComp | Уведомляет драйвер о том, что декодировщик программного обеспечения начнет использовать компенсацию движения с указанным GUID. |
NtGdiDdCreateSurface | Присоединяет поверхность к другой поверхности. |
NtGdiDdCreateSurfaceEx | Создает поверхность Direct3D из поверхности DirectDraw и связывает с ней запрошенное значение дескриптора. |
NtGdiDdCreateSurfaceObject | Создает объект поверхности в режиме ядра, представляющий объект поверхности в пользовательском режиме, на который ссылается puSurfaceLocal. |
NtGdiDdDeleteDirectDrawObject | Уничтожает ранее созданный объект устройства DirectDraw в режиме ядра. |
NtGdiDdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject удаляет ранее созданный объект поверхности режима ядра. |
NtGdiDdDeskdD3DBuffer | Уничтожает ранее выделенный объект surface DirectDraw в режиме ядра, созданный с членом dwCaps структуры DDSCAPS, равным DDSCAPS_EXECUTEBUFFER. |
NtGdiDdDeskMoComp | Уведомляет водителя о том, что этот объект компенсации движения больше не будет использоваться. Теперь драйверу необходимо выполнить любую необходимую очистку. |
NtGdiDdDeskSurface | Уничтожает ранее выделенный объект surface DirectDraw в режиме ядра. |
NtGdiDdEndMoCompFrame | Завершает декодированные кадры. |
NtGdiDdFlip | Приводит к обмену памяти поверхности, связанной с целевым и текущим поверхностями. |
NtGdiDdFlipToGDISurface | Уведомляет драйвер, когда DirectDraw перевернется на поверхность GDI или с нее. |
NtGdiDdGetAvailDriverMemory | Запрашивает объем свободной памяти во всех кучах памяти видео. |
NtGdiDdGetBltStatus | Запрашивает состояние blit указанной поверхности. |
NtGdiDdGetDC | Создает контроллер домена для указанной поверхности. |
NtGdiDdGetDriverInfo | Запрашивает драйвер для дополнительных функций DirectDraw и Direct3D, поддерживаемых драйвером. |
NtGdiDdGetDxHandle | Возвращает дескриптор API DirectX в режиме ядра для использования в последующих вызовах точек входа в режиме ядра, которые управляют механизмом API DirectX. |
NtGdiDdGetFlipStatus | Определяет, произошло ли последнее запрошенное переворачивание на поверхности. |
NtGdiDdGetInternalMoCompInfo | Позволяет драйверу сообщать о том, что он выделяет память отображения для выполнения компенсации движения. |
NtGdiDdGetMoCompBuffInfo | Позволяет драйверу указать, сколько промежуточных поверхностей требуется для поддержки указанного GUID, а также размера, расположения и формата каждой из этих поверхностей. |
NtGdiDdGetMoCompFormats | Указывает несжатые форматы, для которых оборудование может декодировать данные. |
NtGdiDdGetMoCompGuids | Извлекает количество идентификаторов GUID, поддерживаемых драйвером. |
NtGdiDdGetScanLine | Возвращает количество текущей физической строки сканирования. |
NtGdiDdLock | Блокирует указанную область памяти поверхности и предоставляет допустимый указатель на блок памяти, связанный с поверхностью. |
NtGdiDdLockDD3D | Используется для блокировки указанной области буферной памяти и предоставления допустимого указателя на блок памяти, связанный с буфером. |
NtGdiDdQueryDirectDrawObject | Запрашивает ранее созданное представление объекта DirectDraw в режиме ядра для его возможностей. |
NtGdiDdQueryMoCompStatus | Запрашивает состояние последней операции отрисовки в указанную поверхность. |
NtGdiDdReenableDirectDrawObject | Повторно включает объект устройства в режиме ядра DirectDraw после переключения режима. |
NtGdiDdReleaseDC | Освобождает созданный ранее контроллер домена для указанного объекта surface DirectDraw в режиме ядра. |
NtGdiDdRenderMoComp | Указывает драйверу, какой макроблок будет отображаться путем указания поверхностей, содержащих макроблоки, смещения в каждой поверхности, в которой существуют макроблоки, и размера данных макроблока для отрисовки. |
NtGdiDdResetVisrgn | Используется для включения пользовательского режима для получения допустимого понимания области вырезки для окон на рабочем столе. Это вырезка может измениться асинхронно с точки зрения потоков пользовательского режима. |
NtGdiDdSetColorKey | Задает значение ключа цвета для указанной поверхности. |
NtGdiDdSetExclusiveMode | Уведомляет драйвер, когда приложение DirectDraw переключается на монопольный режим или с него. |
NtGdiDdSetGammaRamp | Задает гамма-пандус для устройства. |
NtGdiDdSetOverlayPosition | Задает позицию для наложения. |
NtGdiDdUnattachSurface | Удаляет вложение, созданное с помощью NtGdiDdAttachSurface, между двумя объектами поверхностного режима ядра. |
NtGdiDdUnlock | Освобождает блокировку, удерживаемую на указанной поверхности. |
NtGdiDdUnlockDD3D | Используется для освобождения блокировки, удерживаемой на указанной области буферной памяти. |
NtGdiDdUpdateOverlay | Изменяет или изменяет визуальные атрибуты поверхности наложения. |
NtGdiDdWaitForVerticalBlank | Возвращает вертикальное пустое состояние устройства. |
См. также