Condividi tramite


Uso di VideoPortGetProcAddress

Un driver miniport video sviluppato in una versione del sistema operativo basato su NT può essere caricato ed eseguito in una versione precedente del sistema operativo, purché il driver miniport non tenti di usare funzionalità specifiche per la versione più recente del sistema operativo.

Quando il driver miniport video viene caricato, il membro VideoPortGetProcAddress della struttura VIDEO_PORT_CONFIG_INFO contiene l'indirizzo di una routine di callback esportata dal driver della porta video , VideoPortGetProcAddress. Un driver miniport può usare questa routine di callback per trovare l'indirizzo di una funzione di porta video esportata da videoprt.sys. Dopo che il driver miniport ha l'indirizzo della funzione, può usare questo indirizzo per chiamare la funzione. Questa operazione è illustrata nel codice di esempio seguente.

  // Useful typedef for a function pointer type
  //   that points to a function with same argument types
  //   as VideoPortCreateSecondaryDisplay
typedef VP_STATUS ( *pFunc(PVOID, PVOID *, ULONG));

  // Declare a pointer to a function
pFunc pVPFunction;

  // Declare a pointer to a VIDEO_PORT_CONFIG_INFO struct
PVIDEO_PORT_CONFIG_INFO pConfigInfo;

  // Call through VideoPortGetProcAddress callback
  //   to get address of VideoPortCreateSecondaryDisplay
pVPFunction = (pFunc)
  ( *(pConfigInfo->VideoPortGetProcAddress)(
                        pDeviceExt, 
                       "VideoPortCreateSecondaryDisplay")
  );
if (NULL == pVPFunction) {
  // Video port does not export the function
  ...
}
else {
  Status = pVPFunction(DevExtension, 
                      &SecondDevExtension,
                       VIDEO_DUALVIEW_REMOVABLE);
} 

Dopo l'esecuzione della chiamata tramite la routine di callback VideoPortGetProcAddress , pVPFunction è NULL o contiene l'indirizzo della funzione VideoPortCreateSecondaryDisplay . Se pVPFunction è NULL, il driver della porta video non esporta la funzione che si sta tentando di trovare e il driver miniport non deve tentare di usarlo. Se pVPFunction non è NULL, è possibile usare questo puntatore per chiamare VideoPortCreateSecondaryDisplay , come illustrato nell'esempio precedente.