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
- Aufrufen des Kernels
- Schreiben tragbarer Anwendungen
- Geräteerstellung
- Kernelobjekte
- Funktionen
- Zugehörige Themen
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. |
Zugehörige Themen