Compartir a través de


Uso de VideoPortGetProcAddress

Un controlador de miniporte de vídeo desarrollado en una versión del sistema operativo basado en NT se puede cargar y ejecutar en una versión anterior del sistema operativo, siempre y cuando el controlador de miniporte no intente usar la funcionalidad específica de la versión más reciente del sistema operativo.

Cuando se carga el controlador de minipuerto de vídeo, el miembro VideoPortGetProcAddress de la estructura VIDEO_PORT_CONFIG_INFO contiene la dirección de una rutina de devolución de llamada que exporta el controlador de puerto de vídeo, VideoPortGetProcAddress. Un controlador de minipuerto puede usar esta rutina de devolución de llamada para buscar la dirección de una función de puerto de vídeo exportada desde videoprt.sys. Una vez que el controlador de miniporte tiene la dirección de la función, puede usar esta dirección para llamar a la función. Esto se muestra en el código de ejemplo siguiente.

  // 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);
} 

Una vez ejecutada la llamada a través de la rutina de devolución de llamada VideoPortGetProcAddress , pVPFunction es NULL o contiene la dirección de la función VideoPortCreateSecondaryDisplay . Si pVPFunction es NULL, el controlador de puerto de vídeo no exporta la función que está intentando encontrar y el controlador de miniporte no debe intentar usarlo. Si pVPFunction no es NULL, puede usar este puntero para llamar a VideoPortCreateSecondaryDisplay como se muestra en el ejemplo anterior.