Использование VideoPortGetProcAddress

Драйвер видео минипорта, разработанный в одной версии операционной системы на основе NT, можно загрузить и запустить в более ранней версии операционной системы, если драйвер мини-порта не пытается использовать функции, характерные для более новой версии операционной системы.

При загрузке драйвера видеопорта член VideoPortGetProcAddress структуры VIDEO_PORT_CONFIG_INFO содержит адрес подпрограммы обратного вызова, экспортируемой драйвером видеопорта, VideoPortGetProcAddress. Драйвер мини-порта может использовать эту процедуру обратного вызова для поиска адреса функции видеопорта, экспортируемой из videoprt.sys. После того как драйвер мини-порта получает адрес функции, он может использовать этот адрес для вызова функции. Это показано в следующем примере кода.

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

После выполнения вызова через подпрограмму обратного вызова VideoPortGetProcAddresspVPFunction имеет значение NULL или содержит адрес функции VideoPortCreateSecondaryDisplay . Если pVPFunction имеет значение NULL, драйвер видеопорта не экспортирует функцию, и драйвер мини-порта не должен пытаться использовать ее. Если pVPFunction не равно NULL, этот указатель можно использовать для вызова VideoPortCreateSecondaryDisplay , как показано в предыдущем примере.