Grafik-Low-Level Clientunterstützung

[Diese Funktionen können mit jeder Betriebssystemrevision geändert werden. Verwenden Sie stattdessen die Microsoft DirectDraw- und Microsoft Direct3DAPIs; Diese APIs isolieren Anwendungen von solchen Betriebssystemänderungen und blenden viele andere Schwierigkeiten aus, die bei der direkten Interaktion mit Anzeigetreibern auftreten. Weitere Informationen finden Sie in der Einführung in die Anzeige.]

DirectDraw und Direct3D verwenden einige Kernelmodusroutinen, um mit dem Betriebssystem und dem Anzeigetreiber zu kommunizieren.

Der Betriebssystem-Kernel scheint ein DirectDraw/Direct3D-Anzeigetreiber aus sicht der Benutzermoduskomponenten zu sein. Einige Unterschiede zwischen Kernel- und Anzeigetreibern sind jedoch vorhanden. Die Kernelmoduskomponenten behalten eine Kopie von Strukturen bei, die DirectDraw/Direct3D-Objekte darstellen, z. B. Geräte und Oberflächen. Die Benutzermoduskomponente von DirectDraw/Direct3D fordert die Erstellung dieser Strukturen an, die mit vom Kernelmodus zurückgegebenen Handlen bezeichnet werden. Folglich sind die Unterschiede hauptsächlich in den Argumenten, die an die Routinen übergeben werden: Kernel akzeptiert Handle, während Treiber in der Regel Zeiger akzeptieren.

Evolution der Einstiegspunkte für den Kernelmodus

DirectDraw macht alle Verbindungen mit dem Kernelmodus über die Gdi32.dll mit mehreren Einstiegspunkten. Diese Einstiegspunkte sind in der Regel nur Marshalparameter. Im Rahmen der Geräteerstellung gibt die Gdi32.dll Zeiger auf Routinen innerhalb selbst zurück, die dann von DirectDraw und Direct3D 7.0 verwendet werden.

Direct3D 8. x macht einen sauberen Bruch von Gdi32.dll, und ruft direkt in die Kernelmodus-Einstiegspunkte ein.

Aufrufen des Kernels

Diese Einstiegspunkte sind ähnlich und sind in vielen Fällen identisch mit Einstiegspunkten im Anzeigetreiber selbst, daher ist ein Verständnis der Treiberentwicklungskit -Materialien (Driver Development Kit) für DirectDraw und Direct3D eine wesentliche Voraussetzung für die Verwendung dieser Funktionen.

Das Aufrufen dieser Funktionen unterscheidet sich zwischen Betriebssystemen. Auf Windows 2000, dem W2KUMODE. DIE LIB-Bibliothek enthält Routinen, mit denen der aufrufende Thread den Übergang zum Kernelmodus ermöglicht. Diese Routinen führen keine Parameter-Marshalling aus und sind der ideale Aufrufmechanismus für Windows 2000. Der Mechanismus, der den Übergang zum Kernelmodus macht, basiert auf der Reihenfolge einer Tabelle. Diese Reihenfolge ändert sich in allen Betriebssystemrevisionen. Daher ist es nicht ratsam, eine Anwendung zu erstellen, die auf W2KUMODE basiert. LIB für Windows 2000 und erwartet, dass sie auf Windows XP nicht geändert wird. Ein Mechanismus zum Erstellen der Betriebssystemübertragbarkeit wird im folgenden Abschnitt beschrieben.

Auf Windows XP exportiert D3D8THK.DLL alle Kernelmodusfunktionen, aber mit einem leicht verzierten Namen. Im folgenden Beispiel wird gezeigt, wie Anwendungen die Clientfunktionen auf niedriger Ebene mithilfe des Präprozessors aliasen können. Bevor Sie dies tun, verknüpfen Sie dynamisch D3D8THK.DLL.


#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h"      // Brings in the definition of "NtGdiDdUnlock", 
.                       //   which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);

Schreiben tragbarer Anwendungen

Es stehen mehrere Techniken zur Verfügung, um eine Anwendung über Betriebssysteme hinweg portierbar zu machen. Das robusteste ist die Installation des microsoft DirectX 8.x redistributable-Pakets auf Windows 2000 als Teil des Installationsvorgangs Ihrer eigenen Anwendung. Dadurch wird sichergestellt, dass D3D8THK.DLL auf Windows 2000-Systemen verfügbar sein und einen einzigen Codepfad in der Anwendung ermöglichen, da Sie dieselbe Technik wie für Windows XP oben beschrieben verwenden können.

Anwendungen können auch eigene isolierende DLL-Dateien erstellen und zwei Versionen dieser DLL implementieren, eine für Windows 2000 mit der oben gezeigten Technik und einer für Windows XP, die D3D8THK.DLL verwendet.

Geräteerstellung

DirectDraw und Direct3D müssen zuerst eine Instanz der Abstraktion des Kernels des Treiberobjekts erstellen. In Gdi32.dll und Ddraw.dll wird dies durch Aufrufen von DdCreateDirectDrawObject, DdQueryDirectDrawObject und DdReenableDirectDrawObject erreicht. In Direct3D 8. x, dies wird durch Aufrufen von NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject und NtGdiDdReenableDirectDrawObject erreicht. Beachten Sie, dass die GdiEntry*-Einstiegspunkte lediglich Marshaller für die Kernelmodus-Einstiegspunkte sind.

Nach dem Aufrufen dieser Funktionen wird ein Handle zurückgegeben, der die Abstraktion des Kernelobjekts eines DirectDraw-Geräts darstellt. Dieses Kernelobjekt stellt eine Treiberinstanz dar, die dem Anzeigetreiber gehört. Dieses Handle kann in nachfolgenden Aufrufen wie DdCreateSurfaceObject (oder NtGdiDdCreateSurfaceObject in Direct3D 8) verwendet werden. x) um weitere Objekte zu erstellen.

Kernelobjekte

Einige Einstiegspunkte werden verwendet, um die Kernelmodusdarstellungen bestimmter Objekte zu verwalten. DdCreateSurfaceObject (oder NtGdiDCreateSurfaceObject in Direct3D 8). x) ist ein gutes Beispiel. Dieser Einstiegspunkt erstellt ein Kernelmodusobjekt, das einen Teil des Systemspeichers darstellt. Der Einstiegspunkt gibt einen Handle zurück, und dieser Handle kann in nachfolgenden Zeichnungsaufrufen verwendet werden. Der Kernel leitet einen Zeiger auf seine eigene Struktur von diesen Handlen ab und übergibt diesen Zeiger an den Anzeigetreiber, der dann den Vorgang ausführt.

Funktionen

Diese Tabelle listet Funktionen auf, die Kernelmodus-Einstiegspunkte darstellen, und die Hilfsroutinen des Benutzermodus in Gdi32.dll, die diese Einstiegspunkte umschließen.

Thema Inhalte
DdAttachSurface Die DdAttachSurface-Funktion fügt zwei Kernelmodus-Oberflächendarstellungen an.
DdCreateDIBSection Erstellt eine DIBSECTION-Struktur , die die Farbtabelle mit dem Gerät teilt.
GdiEntry9 ist #defined als Alias für diese Funktion.
DdCreateDirectDrawObject Wrapper für die Funktion NtGdiDdCreateDirectDrawObject und erstellt eine kernelseitige Darstellung des DirectDraw-Objekts. Ein Handle zu dieser Darstellung wird in pDirectDrawGlobal-hDD> gespeichert.
GdiEntry1 wird als Alias für diese Funktion definiert.
DdCreateSurfaceObject Wrapper für die NtGdiDdCreateSurfaceObject-Funktion und erstellt ein Kernelmodus-Surface-Objekt.
GdiEntry4 wird als Alias für diese Funktion definiert.
DdDeleteDirectDrawObject Wrapper für die NtGdiDdDeleteDirectDrawObject-Funktion und löscht ein Kernelmodus-DirectDraw-Objekt, das zuvor mithilfe von DdCreateDirectDrawObject erstellt wurde.
GdiEntry3 wird als Alias für diese Funktion definiert.
DdDeleteSurfaceObject Wrapper für die NtGdiDdDeleteSurfaceObject-Funktion und löscht ein zuvor von NtGdiDdCreateSurfaceObject erstelltes Kernelmodus-Surface-Objekt.
GdiEntry5 wird als Alias für diese Funktion definiert.
DdGetDC Wrapper für die NtGdiDdGetDC-Funktion und gibt einen Windows GDI-Gerätekontext (Graphics Device Interface, GDI) zurück, der die angegebene DirectDraw-Oberfläche darstellt.
GdiEntry7 wird als Alias für diese Funktion definiert.
DdGetDxHandle Die DdGetDxHandle gibt den Kernelmodus microsoft DirectX-API-Handle zurück, das in nachfolgenden Aufrufen der Kernelmodus-Einstiegspunkte verwendet werden soll, die den DirectX-API-Mechanismus steuern.
DdQueryDirectDrawObject Wrapper für die NtGdiDdQueryDirectDrawObject-Funktion und fragt eine zuvor erstellte Kernelmodusdarstellung für Funktionen ab.
GdiEntry2 wird als Alias für diese Funktion definiert.
DdQueryDisplaySettingsUniqueness Gibt den aktuellen Wert einer ganzzahligen Zahl zurück, die immer erhöht wird, wenn ein Modusschalter auftritt, z. B. wenn ein Desktopschalter, eine schnelle Benutzeroption oder ein Vollbildfeld von Microsoft MS-DOS vorhanden ist. Die Anwendung kann diese Funktion wiederholt aufrufen und die alten und neuen Werte des Rückgabewerts vergleichen, um zu bestimmen, ob die Anzeigeeinstellungen geändert wurden.
GdiEntry13 wird als Alias für diese Funktion definiert.
DdReenableDirectDrawObject Wrapper für die Funktion NtGdiDdReenableDirectDrawObject . Es ermöglicht eine DirectDraw-Treiberinstanz nach einem Modus-Switch-Style-Ereignis wie einem True-Modus-Schalter, dem Aussehen eines Ms-DOS-Felds im Vollbildmodus oder einer Änderung des Anzeigetreibers.
GdiEntry10 wird als Alias für diese Funktion definiert.
DdReleaseDC Wrapper für die NtGdiDdReleaseDC-Funktion und gibt einen DC frei, der zuvor über DdGetDC oder GdiEntry7 abgerufen wurde.
GdiEntry8 wird als Alias für diese Funktion definiert.
DdResetVisrgn Wrapper für die Funktion NtGdiDdResetVisrgn und ermöglicht zeitnahe Benutzermodusinformationen im Clippingbereich für Windows auf dem Desktop.
GdiEntry6 wird als Alias für diese Funktion definiert.
DdSetGammaRamp Die DdSetGammaRamp-Funktion legt die Gamma-Rampe für das Gerät fest.
DdSwapTextureHandles Entwickelt für Gerätetreiberschnittstellen (DDIs) vor Microsoft DirectDraw 7.0 und führt nichts für Microsoft Windows NT-Systeme aus. Alle Parameter werden ignoriert.
GdiEntry16 wird als Alias für diese Funktion definiert.
DdUnattachSurface Die Funktion DdUnattachSurface entfernt eine Anlage, die mit DdAttachSurface erstellt wurde, zwischen zwei Kernelmodus-Surface-Objekten.
NtGdiD3DContextCreate Erstellt einen Kontext.
NtGdiD3DContextDestroy Löscht den angegebenen Kontext.
NtGdiD3DContextDestroyAll Fragt die Menge des freien Arbeitsspeichers im Heap des vom Treiber verwalteten Speichers ab.
NtGdiD3DDrawPrimitives2 Rendert Grundtypen und gibt den aktualisierten Renderzustand zurück.
NtGdiD3DGetDriverState Wird sowohl von DirectDraw als auch von Direct3D-Laufzeiten verwendet, um Informationen vom Treiber über den aktuellen Zustand abzurufen.
NtGdiD3DValidateTextureStageState Gibt die Anzahl der Übergänge zurück, bei denen die Hardware die im aktuellen Zustand angegebenen Mischvorgänge ausführen kann.
NtGdiDdAddAlphaBlt Nicht implementiert.
NtGdiDdAddAttachedSurface Fügt eine Oberfläche an eine andere Oberfläche an.
NtGdiDdAttachSurface Fügt zwei Kernelmodus-Oberflächendarstellungen an.
NtGdiDdBeginMoCompFrame Startet die Decodierung eines neuen Frames.
NtGdiDdBlt Führt eine Bitblockübertragung aus.
NtGdiDdCanCreateD3DBuffer Bestimmt, ob der Treiber einen Befehl auf Treiberebene oder einen Vertexpuffer der angegebenen Beschreibung erstellen kann.
NtGdiDdCanCreateSurface Gibt an, ob der Treiber eine Oberfläche der angegebenen Oberflächenbeschreibung erstellen kann.
NtGdiDdColorControl Steuert die Leuchtkraft- und Helligkeitssteuerelemente einer Überlagerungsoberfläche.
NtGdiDdCreateD3DBuffer Wird verwendet, um einen Befehl auf Treiberebene oder einen Vertexpuffer der angegebenen Beschreibung zu erstellen.
NtGdiDdCreateDirectDrawObject Erstellt eine kernelseitige Darstellung des DirectDraw-Objekts.
NtGdiDdCreateMoComp benachrichtigt den Treiber, dass ein Software-Decoder mit der Bewegungskompensation mit der angegebenen GUID beginnt.
NtGdiDdCreateSurface Fügt eine Oberfläche an eine andere Oberfläche an.
NtGdiDdCreateSurfaceEx Erstellt eine Direct3D-Oberfläche aus einer DirectDraw-Oberfläche und ordnet einen angeforderten Handlewert zu.
NtGdiDdCreateSurfaceObject Erstellt ein Kernelmodus-Surface-Objekt, das das surface-Objekt des Benutzermodus darstellt, auf das von puSurfaceLocal verwiesen wird.
NtGdiDdDeleteDirectDrawObject Zerstört ein zuvor erstelltes Kernelmodus-DirectDraw-Geräteobjekt.
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject löscht ein zuvor erstelltes Kernelmodus-Surface-Objekt.
NtGdiDdDestroyD3DBuffer Zerstört ein zuvor zugewiesenes Kernelmodus-DirectDraw-Oberflächenobjekt, das mit dem dwCaps-Element der DDSCAPS-Struktur erstellt wurde, die auf DDSCAPS_EXECUTEBUFFER festgelegt ist.
NtGdiDdDestroyMoComp Benachrichtigt den Treiber, dass dieses Bewegungsausgleichsobjekt nicht mehr verwendet wird. Der Treiber muss jetzt alle erforderlichen Bereinigungen ausführen.
NtGdiDdDestroySurface Zerstört ein zuvor zugewiesenes Kernelmodus-DirectDraw-Surface-Objekt.
NtGdiDdEndMoCompFrame Schließt einen decodierten Frame ab.
NtGdiDdFlip Bewirkt, dass der Oberflächenspeicher, der dem Ziel und den aktuellen Oberflächen zugeordnet ist, ausgetauscht wird.
NtGdiDdFlipToGDISurface Benachrichtigt den Treiber, wenn DirectDraw auf oder von einer GDI-Oberfläche kippt.
NtGdiDdGetAvailDriverMemory Fragt die Menge des freien Arbeitsspeichers in allen Videospeicher-Heaps ab.
NtGdiDdGetBltStatus Fragt den blit-Status der angegebenen Oberfläche ab.
NtGdiDdGetDC Erstellt eine DC für die angegebene Oberfläche.
NtGdiDdGetDriverInfo Fragt den Treiber nach zusätzlichen DirectDraw- und Direct3D-Funktionen ab, die der Treiber unterstützt.
NtGdiDdGetDxHandle Gibt den Kernelmodus-DirectX-API-Handle zurück, der in nachfolgenden Aufrufen des Kernelmodus-Einstiegspunkte verwendet werden soll, die den DirectX-API-Mechanismus steuern.
NtGdiDdGetFlipStatus Bestimmt, ob der zuletzt angeforderte Flip auf einer Oberfläche aufgetreten ist.
NtGdiDdGetInternalMoCompInfo Ermöglicht dem Treiber zu melden, dass er intern den Anzeigespeicher zuweist, um die Bewegungskompensation auszuführen.
NtGdiDdGetMoCompBuffInfo Ermöglicht dem Treiber anzugeben, wie viele Zwischenflächen erforderlich sind, um die angegebene GUID zu unterstützen, und die Größe, Position und das Format jeder dieser Oberflächen.
NtGdiDdGetMoCompFormats Gibt die nicht komprimierten Formate an, mit denen die Hardware die Daten decodieren kann.
NtGdiDdGetMoCompGuids Ruft die Anzahl der GUIDs ab, die der Treiber unterstützt.
NtGdiDdGetScanLine Gibt die Anzahl der aktuellen physischen Scanzeile zurück.
NtGdiDdLock Sperrt einen angegebenen Bereich des Oberflächenspeichers und stellt einen gültigen Zeiger auf einen Speicherblock bereit, der einer Oberfläche zugeordnet ist.
NtGdiDdLockD3D Wird verwendet, um einen angegebenen Bereich des Pufferspeichers zu sperren und einen gültigen Zeiger auf einen Speicherblock bereitzustellen, der dem Puffer zugeordnet ist.
NtGdiDdQueryDirectDrawObject Fragt eine zuvor erstellte Kernelmodusdarstellung eines DirectDraw-Objekts für seine Funktionen ab.
NtGdiDdQueryMoCompStatus Fragt den Status des letzten Renderingvorgangs auf die angegebene Oberfläche ab.
NtGdiDdReenableDirectDrawObject Aktiviert ein DirectDraw-Kernelmodusgerätobjekt nach einem Modusschalter erneut.
NtGdiDdReleaseDC Gibt den zuvor erstellten DC für das angegebene Kernelmodus-DirectDraw-Surface-Objekt frei.
NtGdiDdRenderMoComp Teilt dem Treiber mit, welche Makroblocks gerendert werden sollen, indem die Oberflächen angegeben werden, die die Makroblocks enthalten, die Offsets in jeder Oberfläche, auf der die Makroblocks vorhanden sind, und die Größe der zu rendernden Makroblockdaten.
NtGdiDdResetVisrgn Wird verwendet, um den Benutzermodus zu aktivieren, um ein gültiges Verständnis des Clippingbereichs für Fenster auf dem Desktop zu erhalten. Dieser Clipping kann sich asynchron aus Sicht von Benutzermodusthreads ändern.
NtGdiDdSetColorKey Legt den Farbschlüsselwert für die angegebene Oberfläche fest.
NtGdiDdSetExclusiveMode Benachrichtigt den Treiber, wenn eine DirectDraw-Anwendung auf oder vom exklusiven Modus wechselt.
NtGdiDdSetGammaRamp Legt die Gamma-Rampe für das Gerät fest.
NtGdiDdSetOverlayPosition Legt die Position für eine Überlagerung fest.
NtGdiDdUnattachSurface Entfernt eine Anlage, die mit NtGdiDdAttachSurface erstellt wurde, zwischen zwei Kernelmodus-Surface-Objekten.
NtGdiDdUnlock Gibt die Sperre frei, die auf der angegebenen Oberfläche gehalten wird.
NtGdiDdUnlockD3D Wird verwendet, um eine Sperre freizugeben, die auf einem angegebenen Bereich des Pufferspeichers gehalten wird.
NtGdiDdUpdateOverlay Positioniert oder ändert die visuellen Attribute einer Überlagerungsoberfläche.
NtGdiDdWaitForVerticalBlank Gibt den vertikalen leeren Status des Geräts zurück.

 

Befehls- und Vertexpufferzuordnung

Einführung in die Anzeige