Usando VideoPortGetProcAddress

Um driver de miniporta de vídeo desenvolvido em uma versão do sistema operacional baseada em NT pode ser carregado e executado em uma versão anterior do sistema operacional, desde que o driver de miniporto não tente usar a funcionalidade específica para a versão mais recente do sistema operacional.

Quando o driver de miniporto de vídeo é carregado, o membro VideoPortGetProcAddress da estrutura VIDEO_PORT_CONFIG_INFO contém o endereço de uma rotina de retorno de chamada exportada pelo driver de porta de vídeo, VideoPortGetProcAddress. Um driver de miniporta pode usar essa rotina de retorno de chamada para localizar o endereço de uma função de porta de vídeo exportada de videoprt.sys. Depois que o driver de miniporto tiver o endereço da função, ele poderá usar esse endereço para chamar a função. Isso é mostrado no código de exemplo a seguir.

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

Depois que a chamada por meio da rotina de retorno de chamada VideoPortGetProcAddress for executada, pVPFunction será NULL ou conterá o endereço da função VideoPortCreateSecondaryDisplay . Se pVPFunction for NULL, o driver de porta de vídeo não exportará a função que você está tentando localizar e o driver de miniporto não deverá tentar usá-la. Se pVPFunction não for NULL, você poderá usar esse ponteiro para chamar VideoPortCreateSecondaryDisplay , conforme mostrado no exemplo anterior.