Grafik Low-Level Clientunterstützung
[Diese Funktionen können bei jeder Betriebssystemrevision geändert werden. Verwenden Sie stattdessen microsoft DirectDraw und Microsoft Direct3DAPIs; Diese APIs isolieren Anwendungen von solchen Betriebssystemänderungen und verbergen viele andere Schwierigkeiten bei der direkten Interaktion mit Anzeigetreibern. Weitere Informationen finden Sie unter 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 von Benutzermoduskomponenten zu sein. Es gibt jedoch einige Unterschiede zwischen Kernel- und Anzeigetreibern. 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, auf die mit Handles verwiesen wird, die vom Kernelmodus zurückgegeben werden. Folglich sind die Unterschiede meist in den Argumenten, die an die Routinen übergeben werden: Kernel akzeptiert Handles, während Treiber in der Regel Zeiger akzeptieren.
- Evolution der Einstiegspunkte für den Kernelmodus
- Aufrufen des Kernel-
- Schreiben portabler Anwendungen
- Geräteerstellung
- Kernelobjekte
- Funktionen
- Verwandte Themen
Evolution der Einstiegspunkte für den Kernelmodus
DirectDraw macht alle Verbindungen zum Kernelmodus über die Gdi32.dll unter Verwendung mehrerer Einstiegspunkte. Diese Einstiegspunkte sind in der Regel nur Marshallparameter. 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 Umbruch von Gdi32.dllund ruft direkt die Einstiegspunkte im Kernelmodus auf.
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 Driver Development Kit (DDK)-Materialien für DirectDraw und Direct3D eine wesentliche Voraussetzung für die Verwendung dieser Funktionen.
Das Aufrufen dieser Funktionen unterscheidet sich zwischen Betriebssystemen. Unter Windows 2000 wird der W2KUMODE. LIB-Bibliothek enthält Routinen, mit denen der aufrufende Thread den Übergang zum Kernelmodus ermöglicht. Diese Routinen führen kein Parameter-Marshalling durch und sind der ideale Aufrufmechanismus unter Windows 2000. Der Mechanismus, der den Übergang zum Kernelmodus ermöglicht, basiert auf der Reihenfolge einer Tabelle. Diese Sortierung ändert sich über Betriebssystemrevisionen hinweg. Daher ist es nicht ratsam, eine Anwendung zu erstellen, die auf W2KUMODE basiert. LIB für Windows 2000 und erwartet, dass sie unter Windows XP nicht geändert wird. Ein Mechanismus zum Erstellen der Betriebssystemübertragbarkeit wird im folgenden Abschnitt beschrieben.
Unter Windows XP exportiert D3D8THK.DLL alle Kernelmodusfunktionen, aber mit einem leicht verzierten Namen. Das folgende Beispiel zeigt, wie Anwendungen die Clientfunktionen auf niedriger Ebene mithilfe des Präprozessors aliasen können. Bevor Sie dies tun, verknüpfen Sie dynamisch mit D3D8THK.DLL.
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
Schreiben portabler Anwendungen
Es stehen verschiedene Techniken zur Verfügung, um eine Anwendung auf allen Betriebssystemen portierbar zu machen. Am robuststen ist die Installation des redistributable-Pakets von Microsoft DirectX 8.x unter Windows 2000 im Rahmen des Installationsprozesses Ihrer eigenen Anwendung. Dadurch wird sichergestellt, dass D3D8THK.DLL auf Windows 2000-Systemen verfügbar ist und einen einzelnen Codepfad in der Anwendung zulässt, da Sie dieselbe Technik wie oben für Windows XP verwenden können.
Anwendungen können auch eine eigene isolierende DLL erstellen und zwei Versionen dieser DLL implementieren, eine für Windows 2000 mit der oben gezeigten Technik und eine für Windows XP, die D3D8THK.DLL verwendet.
Geräteerstellung
DirectDraw und Direct3D müssen zuerst eine Instanz der Abstraktion des Treiberobjekts des Kernels erstellen. In Gdi32.dll und Ddraw.dllwird dies durch Aufrufen DdCreateDirectDrawObject, DdQueryDirectDrawObject und DdReenableDirectDrawObjecterreicht. In Direct3D 8.xwird dies durch Aufrufen NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject und NtGdiDdReenableDirectDrawObjecterreicht. Beachten Sie, dass die GdiEntry*-Einstiegspunkte lediglich Marshaller für die Kernelmodus-Einstiegspunkte sind.
Nach dem Aufrufen dieser Funktionen wird ein Handle zurückgegeben, das 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 NtGdiDdCreateSurfaceObject in Direct3D 8.x) ist ein gutes Beispiel. Dieser Einstiegspunkt erstellt ein Kernelmodusobjekt, das einen Teil des Systemspeichers darstellt. Der Einstiegspunkt gibt ein Handle zurück, und dieser Handle kann in nachfolgenden Zeichnungsaufrufen verwendet werden. Der Kernel leitet einen Zeiger von diesen Handles auf seine eigene Struktur ab und übergibt diesen Zeiger an den Anzeigetreiber, der dann den Vorgang ausführt.
Funktionen
In dieser Tabelle sind Funktionen aufgeführt, die Einstiegspunkte im Kernelmodus darstellen, und die Benutzermodushilfsroutinen in Gdi32.dll, die diese Einstiegspunkte umschließen.
Thema | Inhalt |
---|---|
DdAttachSurface | Die DdAttachSurface Funktion fügt zwei Kernelmodus-Oberflächendarstellungen an. |
DdCreateDIBSection | Erstellt eine DIBSECTION- Struktur, die die Farbtabelle mit dem Gerät gemeinsam verwendet. GdiEntry9 wird als Alias für diese Funktion #defined. |
DdCreateDirectDrawObject- | Wrapper für die NtGdiDdCreateDirectDrawObject--Funktion 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-Oberflächenobjekt. 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 mit DdCreateDirectDrawObjecterstellt wurde. GdiEntry3- wird als Alias für diese Funktion definiert. |
DdDeleteSurfaceObject | Wrapper für die NtGdiDdDeleteSurfaceObject Funktion und löscht ein kernelmodus-Oberflächenobjekt, das zuvor von NtGdiDdCreateSurfaceObjecterstellt wurde. GdiEntry5- wird als Alias für diese Funktion definiert. |
DdGetDC- | Wrapper für die NtGdiDdGetDC--Funktion und gibt einen GDI-Gerätekontext (Windows Graphics Device Interface) zurück, der die angegebene DirectDraw-Oberfläche darstellt. GdiEntry7 wird als Alias für diese Funktion definiert. |
DdGetDxHandle- | Die DdGetDxHandle- gibt das 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 abfragen eine zuvor erstellte Kernelmodusdarstellung für Funktionen. GdiEntry2- wird als Alias für diese Funktion definiert. |
DdQueryDisplaySettingsUniqueness | Gibt den aktuellen Wert einer ganzen Zahl zurück, die bei jedem Wechsel des Modus erhöht wird, z. B. wenn ein Desktopschalter, eine schnelle Benutzerumschaltung oder ein Microsoft MS-DOS-Feld im Vollbildmodus vorhanden ist. Die Anwendung kann diese Funktion wiederholt aufrufen und die alten und neuen Werte des Rückgabewerts vergleichen, um festzustellen, ob sich die Anzeigeeinstellungen geändert haben. GdiEntry13- wird als Alias für diese Funktion definiert. |
DdReenableDirectDrawObject | Wrapper für die NtGdiDdReenableDirectDrawObject--Funktion. Sie aktiviert eine DirectDraw-Treiberinstanz nach einem Moduswechselereignis wie einem Modusschalter, dem Erscheinungsbild eines Vollbild-MS-DOS-Felds oder einer Änderung des Anzeigetreibers. GdiEntry10 wird als Alias für diese Funktion definiert. |
DdReleaseDC- | Wrapper für die NtGdiDdReleaseDC--Funktion und gibt eine dc, die zuvor über DdGetDC oder GdiEntry7abgerufen wurde. GdiEntry8- wird als Alias für diese Funktion definiert. |
DdResetVisrgn | Wrapper für die NtGdiDdResetVisrgn--Funktion und ermöglicht zeitnahe Benutzermodusinformationen im Beschneidungsbereich für Fenster auf dem Desktop. GdiEntry6- wird als Alias für diese Funktion definiert. |
DdSetGammaRamp- | Die DdSetGammaRamp--Funktion legt die Gammahierarchie für das Gerät fest. |
DdSwapTextureHandles | Entwickelt für Gerätetreiberschnittstellen (Device Driver Interfaces, DDIs) vor Microsoft DirectDraw 7.0 und führt nichts auf Microsoft Windows NT-Systemen durch. Alle Parameter werden ignoriert. GdiEntry16- wird als Alias für diese Funktion definiert. |
DdUnattachSurface | Die DdUnattachSurface Funktion entfernt eine Anlage, die mit DdAttachSurfaceerstellt wurde, zwischen zwei Kernelmodus-Oberflächenobjekten. |
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 von den DirectDraw- und Direct3D-Laufzeiten verwendet, um Informationen vom Treiber zum aktuellen Zustand abzurufen. |
NtGdiD3DValidateTextureStageState | Gibt die Anzahl der Durchläufe 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- | Beginnt mit der Decodierung eines neuen Frames. |
NtGdiDdBlt | Führt eine Bitblockübertragung durch. |
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 Leuchtdichte- und Helligkeitssteuerelemente einer Überlagerungsoberfläche. |
NtGdiDdCreateD3DBuffer | Wird verwendet, um einen Befehls- oder Vertexpuffer auf Treiberebene der angegebenen Beschreibung zu erstellen. |
NtGdiDdCreateDirectDrawObject | Erstellt eine kernelseitige Darstellung des DirectDraw -Objekts. |
NtGdiDdCreateMoComp | Benachrichtigt den Treiber, dass ein Softwaredecoder mit der Bewegungskorrektur 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 ihr einen angeforderten Handlewert zu. |
NtGdiDdCreateSurfaceObject | Erstellt ein Kernelmodus-Oberflächenobjekt, das das Benutzermodus-Oberflächenobjekt darstellt, auf das durch puSurfaceLocalverwiesen wird. |
NtGdiDdDeleteDirectDrawObject | Zerstört ein zuvor erstelltes Kernelmodus-DirectDraw-Geräteobjekt. |
NtGdiDdDeleteSurfaceObject |
NtGdiDdDeleteSurfaceObject ein zuvor erstelltes Kernelmodus-Oberflächenobjekt löscht. |
NtGdiDdDestroyD3DBuffer | Zerstört ein zuvor zugewiesenes Kernelmodus-DirectDraw-Oberflächenobjekt, das mit dem dwCaps Member der DDSCAPS- Struktur erstellt wurde, die auf DDSCAPS_EXECUTEBUFFER festgelegt wurde. |
NtGdiDdDestroyMoComp | Benachrichtigt den Treiber, dass dieses Bewegungskorrekturobjekt nicht mehr verwendet wird. Der Treiber muss jetzt alle erforderlichen Bereinigungen durchführen. |
NtGdiDdDestroySurface | Zerstört ein zuvor zugewiesenes Kernelmodus-DirectDraw-Oberflächenobjekt. |
NtGdiDdEndMoCompFrame | Schließt einen decodierten Rahmen ab. |
NtGdiDdFlip | Bewirkt, dass der dem Ziel und den aktuellen Oberflächen zugeordnete Oberflächen ausgetauscht werden. |
NtGdiDdFlipToGDISurface | Benachrichtigt den Treiber, wenn DirectDraw in oder von einer GDI-Oberfläche gedreht wird. |
NtGdiDdGetAvailDriverMemory | Fragt die Menge des freien Arbeitsspeichers in allen Videospeicher-Heaps ab. |
NtGdiDdGetBltStatus | Fragt den Blit-Status der angegebenen Oberfläche ab. |
NtGdiDdGetDC- | Erstellt einen 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 das Kernelmodus-DirectX-API-Handle zurück, das in nachfolgenden Aufrufen der 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 Anzeigespeicher zuweist, um Bewegungskorrekturen durchzuführen. |
NtGdiDdGetMoCompBuffInfo | Ermöglicht dem Treiber anzugeben, wie viele Zwischenflächen erforderlich sind, um die angegebene GUID zu unterstützen, sowie 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 Nummer der aktuellen physischen Scanlinie 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-Kernelmodus-Geräteobjekt nach einem Moduswechsel erneut. |
NtGdiDdReleaseDC- | Gibt den zuvor erstellten DC für das angegebene Kernelmodus-DirectDraw-Oberflächenobjekt frei. |
NtGdiDdRenderMoComp | Gibt dem Treiber an, welche Makroblocks gerendert werden sollen, indem die Oberflächen angegeben werden, die die Makroblocks enthalten, die Offsets auf 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 zu oder vom exklusiven Modus wechselt. |
NtGdiDdSetGammaRamp | Legt die Gammahierarchie für das Gerät fest. |
NtGdiDdSetOverlayPosition | Legt die Position für eine Überlagerung fest. |
NtGdiDdUnattachSurface | Entfernt eine Anlage, die mit NtGdiDdAttachSurfaceerstellt wurde, zwischen zwei Kernelmodus-Oberflächenobjekten. |
NtGdiDdUnlock | Loslässt die Sperre, die auf der angegebenen Oberfläche gehalten wird. |
NtGdiDdUnlockD3D- | Wird verwendet, um eine Sperre freizugeben, die in einem bestimmten Bereich des Pufferspeichers gespeichert ist. |
NtGdiDdUpdateOverlay | Positioniert oder ändert die visuellen Attribute einer Überlagerungsoberfläche. |
NtGdiDdWaitForVerticalBlank | Gibt den vertikalen leeren Status des Geräts zurück. |
Verwandte Themen