VideoPortGetProcAddress 사용

미니포트 드라이버가 최신 운영 체제 버전과 관련된 기능을 사용하지 않는 한, 하나의 NT 기반 운영 체제 버전에서 개발된 비디오 미니포트 드라이버를 이전 운영 체제 버전에서 로드하고 실행할 수 있습니다.

비디오 미니포트 드라이버가 로드되면 VIDEO_PORT_CONFIG_INFO 구조체의 VideoPortGetProcAddress 멤버에 비디오 포트 드라이버가 내보내는 콜백 루틴의 주소인 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);
} 

VideoPortGetProcAddress 콜백 루틴을 통한 호출이 실행된 후 pVPFunctionNULL이거나 VideoPortCreateSecondaryDisplay 함수의 주소를 포함합니다. pVPFunctionNULL인 경우 비디오 포트 드라이버는 찾으려는 함수를 내보내지 않으며 미니포트 드라이버는 이 함수를 사용하려고 시도해서는 안 됩니다. pVPFunctionNULL이 아닌 경우 이전 예제와 같이 이 포인터를 사용하여 VideoPortCreateSecondaryDisplay를 호출할 수 있습니다.