Supporto client di basso livello grafico
[Queste funzioni sono soggette a modifiche con ogni revisione del sistema operativo. Usare invece Microsoft DirectDraw e Microsoft Direct3DAPIs; queste API isolano le applicazioni da tali modifiche al sistema operativo e nascondono molte altre difficoltà nell'interazione diretta con i driver di visualizzazione. Per altre informazioni, vedere Introduzione a Display.]
DirectDraw e Direct3D usano alcune routine in modalità kernel per comunicare con il sistema operativo e il driver di visualizzazione.
Il kernel del sistema operativo sembra essere un driver di visualizzazione DirectDraw/Direct3D dal punto di vista dei componenti in modalità utente. Esistono tuttavia alcune differenze tra kernel e driver di visualizzazione. I componenti in modalità kernel mantengono una copia di strutture che rappresentano oggetti DirectDraw/Direct3D, ad esempio dispositivi e superfici. Il componente della modalità utente di DirectDraw/Direct3D richiede la creazione di tali strutture, a cui fanno riferimento handle restituiti dalla modalità kernel. Di conseguenza, le differenze sono principalmente negli argomenti passati alle routine: il kernel accetta handle, mentre i driver in genere accettano puntatori.
- Evoluzione dei punti di ingresso in modalità kernel
- Chiamata del kernel
- Scrittura di applicazioni portabili
- Creazione del dispositivo
- Oggetti kernel
- Funzioni
- Argomenti correlati
Evoluzione dei punti di ingresso in modalità kernel
DirectDraw esegue tutte le connessioni alla modalità kernel tramite il Gdi32.dll usando diversi punti di ingresso. Questi punti di ingresso in genere sono solo parametri di marshalling. Nell'ambito della creazione del dispositivo, il Gdi32.dll restituisce puntatori alle routine all'interno di sé che vengono quindi usate da DirectDraw e Direct3D 7.0.
Direct3D 8.x crea un'interruzione pulita da Gdi32.dll e chiama direttamente i punti di ingresso in modalità kernel.
Chiamata del kernel
Questi punti di ingresso sono simili e, in molti casi, identici ai punti di ingresso nel driver di visualizzazione stesso, quindi una conoscenza dei materiali Driver Development Kit (DDK) per DirectDraw e Direct3D è un prerequisito essenziale per l'uso di queste funzioni.
La chiamata di queste funzioni è diversa tra i sistemi operativi. In Windows 2000 il W2KUMODE. La libreria LIB contiene routine che consentono al thread chiamante di eseguire la transizione alla modalità kernel. Queste routine non eseguono il marshalling dei parametri e sono il meccanismo di chiamata ideale in Windows 2000. Il meccanismo che effettua la transizione alla modalità kernel si basa sull'ordinamento di una tabella. Questo ordinamento cambierà tra le revisioni del sistema operativo. Pertanto, non è consigliabile compilare un'applicazione che si basa su W2KUMODE. LIB per Windows 2000 e si prevede che venga eseguito senza modifiche in Windows XP. Un meccanismo per la creazione della portabilità del sistema operativo è descritto nella sezione seguente.
In Windows XP, D3D8THK.DLL esporta tutte le funzioni in modalità kernel, ma con un nome leggermente decorato. L'esempio seguente illustra come le applicazioni possono eseguire l'alias delle funzioni client di basso livello usando il preprocessore. Prima di eseguire questa operazione, collegare dinamicamente a D3D8THK.DLL.
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
Scrittura di applicazioni portabili
Sono disponibili diverse tecniche per rendere un'applicazione portabile tra sistemi operativi. Il più affidabile consiste nell'installare il pacchetto ridistribuibile Di Microsoft DirectX 8.x in Windows 2000 come parte del processo di installazione dell'applicazione. Ciò garantisce che D3D8THK.DLL sarà disponibile nei sistemi Windows 2000 e consente un singolo percorso di codice nell'applicazione, perché è possibile usare la stessa tecnica descritta in precedenza per Windows XP.
Le applicazioni possono anche creare una DLL isolata e implementare due versioni di tale DLL, una per Windows 2000 usando la tecnica illustrata in precedenza e una per Windows XP che usa D3D8THK.DLL.
Creazione del dispositivo
DirectDraw e Direct3D devono prima creare un'istanza dell'astrazione del kernel dell'oggetto driver. In Gdi32.dll e Ddraw.dll questo risultato viene ottenuto chiamando DdCreateDirectDrawObject, DdQueryDirectDrawObject e DdReenableDirectDrawObject. In Direct3D 8.x, questo risultato viene ottenuto chiamando NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject e NtGdiDdReenableDirectDrawObject. Si noti che i punti di ingresso GdiEntry* sono semplicemente marshaller per i punti di ingresso in modalità kernel.
Dopo aver chiamato queste funzioni, viene restituito un handle che rappresenta l'astrazione dell'oggetto kernel di un dispositivo DirectDraw. Questo oggetto kernel rappresenta un'istanza del driver di proprietà del driver di visualizzazione. Questo handle può essere usato nelle chiamate successive, ad esempio DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject in Direct3D 8).x) per creare altri oggetti.
Oggetti kernel
Alcuni punti di ingresso vengono usati per gestire le rappresentazioni in modalità kernel di determinati oggetti. DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject in Direct3D 8.x) è un buon esempio. Questo punto di ingresso crea un oggetto in modalità kernel che rappresenta una parte della memoria di sistema. Il punto di ingresso restituisce un handle e questo handle può essere utilizzato nelle chiamate di disegno successive. Il kernel deriva un puntatore alla propria struttura da questi handle e passa tale puntatore al driver di visualizzazione, che quindi esegue l'operazione.
Funzioni
Questa tabella elenca le funzioni che rappresentano i punti di ingresso in modalità kernel e le routine helper in modalità utente in Gdi32.dll che esere il wrapping di questi punti di ingresso.
Argomento | Contenuto |
---|---|
DdAttachSurface | La funzione DdAttachSurface collega due rappresentazioni di superficie in modalità kernel. |
DdCreateDIBSection | Crea una struttura DIB edizione Standard CTION che condivide la tabella colori con il dispositivo. GdiEntry9 è #defined come alias per questa funzione. |
DdCreateDirectDrawObject | Wrapper per la funzione NtGdiDdCreateDirectDrawObject e crea una rappresentazione lato kernel dell'oggetto DirectDraw. Un handle per questa rappresentazione verrà archiviato in pDirectDrawGlobal-hDD>. GdiEntry1 è definito come alias per questa funzione. |
DdCreateSurfaceObject | Wrapper per la funzione NtGdiDdCreateSurfaceObject e crea un oggetto superficie in modalità kernel. GdiEntry4 è definito come alias per questa funzione. |
DdDeleteDirectDrawObject | Wrapper per la funzione NtGdiDdDeleteDirectDrawObject ed elimina un oggetto DirectDraw in modalità kernel creato in precedenza usando DdCreateDirectDrawObject. GdiEntry3 è definito come alias per questa funzione. |
DdDeleteSurfaceObject | Wrapper per la funzione NtGdiDdDeleteSurfaceObject ed elimina un oggetto superficie in modalità kernel creato in precedenza da NtGdiDdCreateSurfaceObject. GdiEntry5 è definito come alias per questa funzione. |
DdGetDC | Wrapper per la funzione NtGdiDdGetDC e restituisce un contesto di dispositivo GDI (Graphics Device Interface) di Windows che rappresenta la superficie DirectDraw indicata. GdiEntry7 è definito come alias per questa funzione. |
DdGetDxHandle | DdGetDxHandle restituisce l'handle dell'API DirectX microsoft in modalità kernel da usare nelle chiamate successive ai punti di ingresso in modalità kernel che controllano il meccanismo api DirectX. |
DdQueryDirectDrawObject | Wrapper per la funzione NtGdiDdQueryDirectDrawObject ed esegue una query su una rappresentazione in modalità kernel creata in precedenza per le funzionalità. GdiEntry2 è definito come alias per questa funzione. |
DdQueryDisplay Impostazioni Uniqueness | Restituisce il valore corrente di un numero intero incrementato ogni volta che si verifica un cambio di modalità, ad esempio quando è presente un commutatore desktop, un commutatore utente veloce o una casella Microsoft MS-DOS a schermo intero. L'applicazione può chiamare ripetutamente questa funzione e confrontare i valori precedenti e nuovi del valore restituito per determinare se le impostazioni di visualizzazione sono state modificate. GdiEntry13 è definito come alias per questa funzione. |
DdReenableDirectDrawObject | Wrapper per la funzione NtGdiDdReenableDirectDrawObject. Abilita nuovamente un'istanza del driver DirectDraw dopo un evento di tipo switch-style in modalità, ad esempio un commutatore in modalità true, l'aspetto di una casella MS-DOS a schermo intero o la modifica del driver di visualizzazione. GdiEntry10 è definito come alias per questa funzione. |
DdReleaseDC | Wrapper per la funzione NtGdiDdReleaseDC e rilascia un controller di dominio ottenuto in precedenza tramite DdGetDC o GdiEntry7. GdiEntry8 è definito come alias per questa funzione. |
DdResetVisrgn | Wrapper per la funzione NtGdiDdResetVisrgn e abilita informazioni tempestive sulla modalità utente nell'area di ritaglio per le finestre sul desktop. GdiEntry6 è definito come alias per questa funzione. |
DdSetGammaRamp | La funzione DdSetGammaRamp imposta la gamma rampa per il dispositivo. |
DdSwapTextureHandles | Sviluppato per le interfacce dei driver di dispositivo (DDI) prima di Microsoft DirectDraw 7.0 e non esegue alcuna operazione nei sistemi Microsoft Windows NT. Tutti i parametri vengono ignorati. GdiEntry16 è definito come alias per questa funzione. |
DdUnattachSurface | La funzione DdUnattachSurface rimuove un allegato, creato con DdAttachSurface, tra due oggetti superficie in modalità kernel. |
NtGdiD3DContextCreate | Crea un contesto. |
NtGdiD3DContextDestroy | Elimina il contesto specificato. |
NtGdiD3DContextDestroyAll | Esegue una query sulla quantità di memoria libera nell'heap di memoria gestita dal driver. |
NtGdiD3DDrawPrimitives2 | Esegue il rendering delle primitive e restituisce lo stato di rendering aggiornato. |
NtGdiD3DGetDriverState | Usato sia dai runtime DirectDraw che da Direct3D per ottenere informazioni dal driver sullo stato corrente. |
NtGdiD3DValidateTextureStageState | Restituisce il numero di passaggi in cui l'hardware può eseguire le operazioni di fusione specificate nello stato corrente. |
NtGdiDdAddAlphaBlt | Non implementata. |
NtGdiDdAddAttachedSurface | Collega una superficie a un'altra superficie. |
NtGdiDdAttachSurface | Collega due rappresentazioni di superficie in modalità kernel. |
NtGdiDdBeginMoCompFrame | Avvia la decodifica di un nuovo frame. |
NtGdiDdBlt | Esegue un trasferimento a blocchi di bit. |
NtGdiDdCanCreateD3DBuffer | Determina se il driver può creare un comando a livello di driver o un vertex buffer della descrizione specificata. |
NtGdiDdCanCreateSurface | Indica se il driver può creare una superficie della descrizione della superficie specificata. |
NtGdiDdColorControl | Controlla la luminanza e i controlli luminosità di una superficie di sovrapposizione. |
NtGdiDdCreateD3DBuffer | Usato per creare un comando a livello di driver o un vertex buffer della descrizione specificata. |
NtGdiDdCreateDirectDrawObject | Crea una rappresentazione lato kernel dell'oggetto DirectDraw. |
NtGdiDdCreateMoComp | Notifica al driver che un decodificatore software inizierà a usare la compensazione del movimento con il GUID specificato. |
NtGdiDdCreateSurface | Collega una superficie a un'altra superficie. |
NtGdiDdCreateSurfaceEx | Crea una superficie Direct3D da una superficie DirectDraw e associa un valore di handle richiesto. |
NtGdiDdCreateSurfaceObject | Crea un oggetto superficie in modalità kernel che rappresenta l'oggetto superficie in modalità utente a cui fa riferimento puSurfaceLocal. |
NtGdiDdDeleteDirectDrawObject | Elimina definitivamente un oggetto dispositivo DirectDraw in modalità kernel creato in precedenza. |
NtGdiDdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject elimina un oggetto superficie in modalità kernel creato in precedenza. |
NtGdiDdDestroyD3DBuffer | Elimina definitivamente un oggetto surface DirectDraw in modalità kernel allocato in precedenza creato con il membro dwCaps della struttura DDSC piattaforma di strumenti analitici impostata su DDSC piattaforma di strumenti analitici_EXECUTEBUFFER. |
NtGdiDdDestroyMoComp | Notifica al driver che questo oggetto compensazione movimento non verrà più utilizzato. Il driver deve ora eseguire tutte le operazioni di pulizia necessarie. |
NtGdiDdDestroySurface | Elimina definitivamente un oggetto surface DirectDraw in modalità kernel precedentemente allocato. |
NtGdiDdEndMoCompFrame | Completa una cornice decodificata. |
NtGdiDdFlip | Determina l'interscambio della memoria della superficie associata alla destinazione e alle superfici correnti. |
NtGdiDdFlipToGDISurface | Notifica al driver quando DirectDraw viene capovolto da o verso una superficie GDI. |
NtGdiDdGetAvailDriverMemory | Esegue una query sulla quantità di memoria libera in tutti gli heap della memoria video. |
NtGdiDdGetBltStatus | Esegue una query sullo stato blit della superficie specificata. |
NtGdiDdGetDC | Crea un controller di dominio per la superficie specificata. |
NtGdiDdGetDriverInfo | Esegue una query sul driver per ottenere funzionalità aggiuntive di DirectDraw e Direct3D supportate dal driver. |
NtGdiDdGetDxHandle | Restituisce l'handle dell'API DirectX in modalità kernel da usare nelle chiamate successive ai punti di ingresso in modalità kernel che controllano il meccanismo api DirectX. |
NtGdiDdGetFlipStatus | Determina se si è verificato l'capovolgimento richiesto più di recente su una superficie. |
NtGdiDdGetInternalMoCompInfo | Consente al driver di segnalare che alloca internamente la memoria di visualizzazione per eseguire la compensazione del movimento. |
NtGdiDdGetMoCompBuffInfo | Consente al driver di specificare il numero di superfici provvisorie necessarie per supportare il GUID specificato e le dimensioni, la posizione e il formato di ognuna di queste superfici. |
NtGdiDdGetMoCompFormats | Indica i formati non compressi in cui l'hardware può decodificare i dati. |
NtGdiDdGetMoCompGuids | Recupera il numero di GUID supportati dal driver. |
NtGdiDdGetScanLine | Restituisce il numero della riga di analisi fisica corrente. |
NtGdiDdLock | Blocca un'area specificata di memoria della superficie e fornisce un puntatore valido a un blocco di memoria associato a una superficie. |
NtGdiDdLockD3D | Consente di bloccare un'area specificata di memoria del buffer e di fornire un puntatore valido a un blocco di memoria associato al buffer. |
NtGdiDdQueryDirectDrawObject | Esegue una query su una rappresentazione in modalità kernel creata in precedenza di un oggetto DirectDraw per le relative funzionalità. |
NtGdiDdQueryMoCompStatus | Esegue una query sullo stato dell'operazione di rendering più recente nella superficie specificata. |
NtGdiDdReenableDirectDrawObject | Riattiva un oggetto dispositivo in modalità kernel DirectDraw dopo un'opzione di modalità. |
NtGdiDdReleaseDC | Rilascia il controller di dominio creato in precedenza per l'oggetto superficie DirectDraw in modalità kernel indicato. |
NtGdiDdRenderMoComp | Indica al driver quali macroblock eseguire il rendering specificando le superfici contenenti i macroblock, gli offset in ogni superficie in cui sono presenti i macroblock e le dimensioni dei dati del blocco macro di cui eseguire il rendering. |
NtGdiDdResetVisrgn | Usato per abilitare la modalità utente per ottenere una conoscenza valida dell'area di ritaglio per le finestre sul desktop. Questo ritaglio può cambiare in modo asincrono dal punto di vista dei thread in modalità utente. |
NtGdiDdSetColorKey | Imposta il valore della chiave di colore per la superficie specificata. |
NtGdiDdSetExclusiveMode | Notifica al driver quando un'applicazione DirectDraw passa alla modalità esclusiva o viceversa. |
NtGdiDdSetGammaRamp | Imposta la rampa gamma per il dispositivo. |
NtGdiDdSetOverlayPosition | Imposta la posizione per una sovrimpressione. |
NtGdiDdUnattachSurface | Rimuove un allegato, creato con NtGdiDdAttachSurface, tra due oggetti superficie in modalità kernel. |
NtGdiDdUnlock | Rilascia il blocco mantenuto sulla superficie specificata. |
NtGdiDdUnlockD3D | Usato per rilasciare un blocco mantenuto su un'area specificata di memoria del buffer. |
NtGdiDdUpdateOverlay | Riposiziona o modifica gli attributi visivi di una superficie di sovrapposizione. |
NtGdiDdWaitForVerticalBlank | Restituisce lo stato vuoto verticale del dispositivo. |
Argomenti correlati