/*++ Copyright (c) 1991-1999 Microsoft Corporation Module Name: videoprt.h Abstract: This module contains the structure definitions private to the video port driver. Author: Andre Vachon (andreva) 02-Dec-1991 Notes: Revision History: --*/ #ifndef __VIDEOPRT_H__ #define __VIDEOPRT_H__ #define _NTDRIVER_ #ifndef FAR #define FAR #endif #include "dderror.h" #include "ntos.h" #include "pci.h" #include "wdmguid.h" #include "stdarg.h" #include "stdio.h" #include "zwapi.h" #include "ntiologc.h" #include "ntddvdeo.h" #include "video.h" #include "ntagp.h" #include "agp.h" #include "inbv.h" // // Forward declare some basic driver objects. // typedef struct _FDO_EXTENSION *PFDO_EXTENSION; typedef struct _CHILD_PDO_EXTENSION *PCHILD_PDO_EXTENSION; // // Debugging Macro // // // When an IO routine is called, we want to make sure the miniport // in question has reported its IO ports. // VPResourceReported is TRUE when a miniport has called VideoPort- // VerifyAccessRanges. // It is set to FALSE as a default, and set back to FALSE when finishing // an iteration in the loop of VideoPortInitialize (which will reset // the default when we exit the loop also). // // This flag will also be set to TRUE by the VREATE entry point so that // the IO functions always work after init. // #if DBG #undef VideoDebugPrint #define pVideoDebugPrint(arg) VideoPortDebugPrint arg #define IS_ACCESS_RANGES_DEFINED() \ { \ if (!VPResourcesReported) { \ \ pVideoDebugPrint((0, "The miniport driver is trying to access" \ " IO ports or memory location before the" \ " ACCESS_RANGES have been reported to" \ " the port driver with the" \ " VideoPortVerifyAccessRanges(). Please" \ " fix the miniport driver\n")); \ \ DbgBreakPoint(); \ \ } \ } #else #define pVideoDebugPrint(arg) #define IS_ACCESS_RANGES_DEFINED() #endif // // Useful registry buffer length. // #define STRING_LENGTH 60 // // Queue link for mapped addresses stored for unmapping // typedef struct _MAPPED_ADDRESS { struct _MAPPED_ADDRESS *NextMappedAddress; PVOID MappedAddress; PHYSICAL_ADDRESS PhysicalAddress; ULONG NumberOfUchars; ULONG RefCount; UCHAR InIoSpace; BOOLEAN bNeedsUnmapping; BOOLEAN bLargePageRequest; } MAPPED_ADDRESS, *PMAPPED_ADDRESS; // // BusDataRegistry variables // typedef struct _VP_QUERY_DEVICE { PVOID MiniportHwDeviceExtension; PVOID CallbackRoutine; PVOID MiniportContext; VP_STATUS MiniportStatus; ULONG DeviceDataType; } VP_QUERY_DEVICE, *PVP_QUERY_DEVICE; // // Definition of the data passed in for the VideoPortGetRegistryParameters // function for the DeviceDataType. // #define VP_GET_REGISTRY_DATA 0 #define VP_GET_REGISTRY_FILE 1 typedef struct _VIDEO_PORT_DRIVER_EXTENSION { UNICODE_STRING RegistryPath; VIDEO_HW_INITIALIZATION_DATA HwInitData; } VIDEO_PORT_DRIVER_EXTENSION, *PVIDEO_PORT_DRIVER_EXTENSION; // // PnP Detection flags // #define PNP_ENABLED 0x001 #define LEGACY_DETECT 0x002 #define VGA_DRIVER 0x004 #define LEGACY_DRIVER 0x008 #define REPORT_DEVICE 0x020 #define UPGRADE_FAIL_START 0x040 #define FINDADAPTER_SUCCEEDED 0x080 #define UPGRADE_FAIL_HWINIT 0x100 #define VGA_DETECT 0x200 // // ResetHW Structure // typedef struct _VP_RESET_HW { PVIDEO_HW_RESET_HW ResetFunction; PVOID HwDeviceExtension; } VP_RESET_HW, *PVP_RESET_HW; // // AGP Support // #define POOL_TAG 0x72745076 // 'vPrt' typedef struct _AGP_ALLOCATION { PHYSICAL_ADDRESS PhysicalAddress; PVOID VirtualAddress; ULONG Pages; PMDL Mdl; struct _AGP_ALLOCATION *Next; } AGP_ALLOCATION, *PAGP_ALLOCATION; // // Private EVENT support for miniport. // // // This flag indicates that the enveloping VIDEO_PORT_EVENT has a PKEVENT // field filled in by ObReferenceObjectByHandle(). It cannot be waited on // at all. Must be consistent with that in pw32kevt.h in gre. // #define ENG_EVENT_FLAG_IS_MAPPED_USER 0x1 // // This flag indicates that the enveloping VIDEO_PORT_EVENT is about to be // deleted and that the display driver callback is ongoing. Must be consistent // with that in pw32kevt.h in gre. // #define ENG_EVENT_FLAG_IS_INVALID 0x2 // // This flag indicates that the enveloping VIDEO_PORT_EVENT is in a DPC. // It signals the GDI Engine not to delete the VIDEO_POR_EVENT. It signals // the VideoPortSetEventDPC to set it then free it. Must be consistent with // that in pw32kevt.h in gre. // #define ENG_EVENT_FLAG_IN_DPC 0x4 typedef struct _VIDEO_PORT_EVENT { PVOID pKEvent; volatile ULONG fFlags; } VIDEO_PORT_EVENT, *PVIDEO_PORT_EVENT; #define EDID_BUFFER_SIZE 256 typedef enum _HW_INIT_STATUS { HwInitNotCalled, // HwInitialize has not yet been called HwInitSucceeded, // HwInitialize has been called and succeeded HwInitFailed // HwInitialize has been called and failed } HW_INIT_STATUS, *PHW_INIT_STATUS; #define GET_FDO_EXT(p) (((PFDO_EXTENSION)(p)) - 1) // // Define HW_DEVICE_EXTENSION verification macro. // #define IS_HW_DEVICE_EXTENSION(p) (GET_FDO_EXT(p)->HwDeviceExtension == (p)) typedef struct _ALLOC_ENTRY { PVOID Address; ULONG Size; struct _ALLOC_ENTRY *Next; } *PALLOC_ENTRY, ALLOC_ENTRY; // // Device Extension for the FUNCTIONAL Driver Object (FDO) // typedef struct _FDO_EXTENSION { // // Location of the miniport device extension. // PVOID HwDeviceExtension; // // Power management mappings. // DEVICE_POWER_STATE DeviceMapping[PowerSystemMaximum] ; BOOLEAN IsMappingReady ; // // Event object for pVideoPortDispatch synchronization. // KMUTEX SyncMutex; // // Track whether the device has been opened. // BOOLEAN DeviceOpened; //////////////////////////////////////////////////////////////////////////// // // END common header. // //////////////////////////////////////////////////////////////////////////// // // Adapter device objects // PDEVICE_OBJECT FunctionalDeviceObject; PDEVICE_OBJECT PhysicalDeviceObject; PDEVICE_OBJECT AttachedDeviceObject; // // Pointer to the miniport config info so that the port driver // can modify it when the miniport is asking for configuration information. // PVIDEO_PORT_CONFIG_INFO MiniportConfigInfo; // // Miniport exports // PVIDEO_HW_FIND_ADAPTER HwFindAdapter; PVIDEO_HW_INITIALIZE HwInitialize; PVIDEO_HW_INTERRUPT HwInterrupt; PVIDEO_HW_START_IO HwStartIO; PVIDEO_HW_TIMER HwTimer; PVIDEO_HW_POWER_SET HwSetPowerState; PVIDEO_HW_POWER_GET HwGetPowerState; PVIDEO_HW_QUERY_INTERFACE HwQueryInterface; PVIDEO_HW_CHILD_CALLBACK HwChildCallback; // // Legacy resources used by the driver and reported to Plug and Play // via FILTER_RESOURCE_REQUIREMENTS. // PVIDEO_ACCESS_RANGE HwLegacyResourceList; ULONG HwLegacyResourceCount; // // Linked list of all memory mapped io space (done through MmMapIoSpace) // requested by the miniport driver. // This list is kept so we can free up those ressources if the driver // fails to load or if it is unloaded at a later time. // PMAPPED_ADDRESS MappedAddressList; // // Interrupt object // PKINTERRUPT InterruptObject; // // Interrupt vector, irql and mode // ULONG InterruptVector; KIRQL InterruptIrql; ULONG InterruptAffinity; KINTERRUPT_MODE InterruptMode; BOOLEAN InterruptsEnabled; // // Information about the BUS on which the adapteris located // INTERFACE_TYPE AdapterInterfaceType; ULONG SystemIoBusNumber; // // Size of the miniport device extensions. // ULONG HwDeviceExtensionSize; ULONG HwChildDeviceExtensionSize; // // Determines the size required to save the video hardware state // ULONG HardwareStateSize; // // Pointer to the path name indicating the path to the drivers node in // the registry's current control set // PWSTR DriverRegistryPath; ULONG DriverRegistryPathLength; // // Total memory usage of PTEs by a miniport driver. // This is used to track if the miniport is mapping too much memory // ULONG MemoryPTEUsage; // // Pointer to the video request packet; // PVIDEO_REQUEST_PACKET Vrp; // // Determines if the port driver is currently handling an attach caused by // a video filter drivers. // BOOLEAN bAttachInProgress; // // Has the drivers HwInitialize routine been called. // HW_INIT_STATUS HwInitStatus; // // VDM and int10 support // PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress; ULONG VdmPhysicalVideoMemoryLength; // // Memory allocation values // #if DBG LONG FreeAllocation; PALLOC_ENTRY AllocationHead; PAGED_LOOKASIDE_LIST AllocationList; #endif // // DPC Support // KDPC Dpc; //////////////////////////////////////////////////////////////////////////// // // Plug and Play Support // //////////////////////////////////////////////////////////////////////////// PCM_RESOURCE_LIST ResourceList; PCM_RESOURCE_LIST AllocatedResources; // bus driver list PCM_RESOURCE_LIST RawResources; // complete list PCM_RESOURCE_LIST TranslatedResources; // translated complete list ULONG DeviceNumber; ULONG SlotNumber; // // Indicates whether we can enumerate children right away, or if // we need to wait for HwInitialize to be called first. // BOOLEAN AllowEarlyEnumeration; // // Interface for communication with our bus driver. // BOOLEAN ValidBusInterface; BUS_INTERFACE_STANDARD BusInterface; // // Flags that indicate type of driver (VGA, PNP, etc) // ULONG Flags; // // AGP Support // AGP_BUS_INTERFACE_STANDARD AgpInterface; // // Callout support - Phydisp of the device in GDI // PVOID PhysDisp; } FDO_EXTENSION, *PFDO_EXTENSION; #define MAXIMUM_MEM_LIMIT_K 64 // // AGP Data Structures // typedef struct _REGION { ULONG Length; ULONG NumDwords; ULONG BitField[1]; } REGION, *PREGION; typedef struct _RESERVATION_LIST RESERVATION_LIST, *PRESERVATION_LIST; typedef struct _RESERVATION_LIST { ULONG Offset; ULONG Pages; ULONG RefCount; BOOLEAN Reserved; PRESERVATION_LIST Next; }; typedef struct _PHYSICAL_RESERVE_CONTEXT { ULONG Pages; ULONG Caching; PVOID MapHandle; PHYSICAL_ADDRESS PhysicalAddress; PREGION Region; } PHYSICAL_RESERVE_CONTEXT, *PPHYSICAL_RESERVE_CONTEXT; typedef struct _VIRTUAL_RESERVE_CONTEXT { HANDLE ProcessHandle; PEPROCESS Process; PVOID VirtualAddress; PPHYSICAL_RESERVE_CONTEXT PhysicalReserveContext; PRESERVATION_LIST ReservationList; PREGION Region; } VIRTUAL_RESERVE_CONTEXT, *PVIRTUAL_RESERVE_CONTEXT; typedef struct _DEVICE_ADDRESS DEVICE_ADDRESS, *PDEVICE_ADDRESS; typedef struct _DEVICE_ADDRESS { ULONG BusNumber; ULONG Slot; PDEVICE_ADDRESS Next; }; // // Support for GetProcAddress // typedef struct _PROC_ADDRESS { PUCHAR FunctionName; PVOID FunctionAddress; } PROC_ADDRESS, *PPROC_ADDRESS; #define PROC(x) #x, x // // Power Request Context Block // typedef struct tagPOWER_BLOCK { PKEVENT Event; union { NTSTATUS Status; ULONG FinalFlag; } ; PIRP Irp ; } POWER_BLOCK, *PPOWER_BLOCK; // // Global Data // #if DBG extern ULONG VPResourcesReported; extern CHAR *BusType[]; #endif extern BOOLEAN VPFirstTime; extern PVIDEO_WIN32K_CALLOUT Win32kCallout; extern BOOLEAN EnableUSWC; extern ULONG VideoDebugLevel; extern ULONG VideoDeviceNumber; extern PWSTR VideoClassString; extern UNICODE_STRING VideoClassName; extern VP_RESET_HW HwResetHw[]; extern PVOID PhysicalMemorySection; extern ULONG VpC0000Compatible; extern PVOID VgaHwDeviceExtension; extern PDEVICE_OBJECT VgaCompatibleDevice; extern PVIDEO_ACCESS_RANGE VgaAccessRanges; extern ULONG NumVgaAccessRanges; extern PDEVICE_OBJECT DeviceOwningVga; extern PROC_ADDRESS VideoPortEntryPoints[]; extern VIDEO_ACCESS_RANGE VgaLegacyResources[]; extern ULONGLONG VpSystemMemorySize; typedef BOOLEAN (*PSYNCHRONIZE_ROUTINE) ( PKINTERRUPT pInterrupt, PKSYNCHRONIZE_ROUTINE pkSyncronizeRoutine, PVOID pSynchContext ); // // Number of legacy vga resources // #define NUM_VGA_LEGACY_RESOURCES 3 // // These macros are used to protect threads which will enter the // miniport. We need to guarantee that only one thread enters // the miniport at a time. // #define ACQUIRE_DEVICE_LOCK(DeviceExtension) \ KeWaitForSingleObject(&DeviceExtension->SyncMutex, \ Executive, \ KernelMode, \ FALSE, \ (PTIME)NULL); #define RELEASE_DEVICE_LOCK(DeviceExtension) \ KeReleaseMutex(&DeviceExtension->SyncMutex, \ FALSE); // // Define macros to stall execution for given number of milli or micro seconds. // Single call to KeStallExecutionProcessor() can be done for 100us max. // #define DELAY_MILLISECONDS(n) \ { \ ULONG ulCount; \ ULONG ulTotal = 10 * (n); \ \ for (ulCount = 0; ulCount < (n); ulCount++) \ KeStallExecutionProcessor(100); \ } #define DELAY_MICROSECONDS(n) \ { \ ULONG ulCount = (n); \ \ while (ulCount > 0) \ { \ if (ulCount >= 100) \ { \ KeStallExecutionProcessor(100); \ ulCount -= 100; \ } \ else \ { \ KeStallExecutionProcessor(ulCount); \ ulCount = 0; \ } \ } \ } // // Private function declarations // // // ddc.c // BOOLEAN DDCReadEdidSegment( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks, IN OUT PUCHAR pucEdidBuffer, IN ULONG ulEdidBufferSize, IN UCHAR ucEdidSegment, IN UCHAR ucEdidOffset, IN UCHAR ucSetOffsetAddress, IN UCHAR ucReadAddress, IN BOOLEAN bEnhancedDDC ); // // agp.c // BOOLEAN VpQueryAgpInterface( PFDO_EXTENSION DeviceExtension ); // // edid.c // BOOLEAN pVideoPortIsValidEDID( PVOID Edid ); VOID pVideoPortGetEDIDId( PVOID pEdid, PWCHAR pwChar ); PVOID pVideoPortGetMonitordescription( PVOID pEdid ); // // i2c.c // BOOLEAN I2CStart( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks ); BOOLEAN I2CStop( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks ); BOOLEAN I2CWrite( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks, IN PUCHAR pucBuffer, IN ULONG ulLength ); BOOLEAN I2CRead( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks, OUT PUCHAR pucBuffer, IN ULONG ulLength ); BOOLEAN I2CWriteByte( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks, IN UCHAR ucByte ); BOOLEAN I2CReadByte( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks, OUT PUCHAR pucByte, IN BOOLEAN bMore ); BOOLEAN I2CWaitForClockLineHigh( IN PVOID pHwDeviceExtension, IN PI2C_CALLBACKS pI2CCallbacks ); // // pnp.c // NTSTATUS pVideoPortSendIrpToLowerDevice( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS pVideoPortPnpDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); // // registry.c // NTSTATUS VpGetFlags( IN PUNICODE_STRING RegistryPath, PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, PULONG Flags ); NTSTATUS VpSetEventCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event ); // // videoprt.c // NTSTATUS pVideoPortCreateDeviceName( PWSTR DeviceString, ULONG DeviceNumber, PUNICODE_STRING UnicodeString, PWCHAR UnicodeBuffer ); VOID pVideoPortDebugPrint( ULONG DebugPrintLevel, PCHAR DebugMessage, ... ); NTSTATUS pVideoPortDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); PVOID pVideoPortFreeDeviceBase( IN PVOID HwDeviceExtension, IN PVOID MappedAddress ); PVOID pVideoPortGetDeviceBase( IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, IN UCHAR InIoSpace, IN BOOLEAN bLargePage ); NTSTATUS pVideoPortGetRegistryCallback( IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext ); VOID pVPInit( VOID ); NTSTATUS VpCreateDevice( IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, OUT PDEVICE_OBJECT *DeviceObject ); NTSTATUS VideoPortFindAdapter( IN PDRIVER_OBJECT DriverObject, IN PVOID Argument2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext, PDEVICE_OBJECT DeviceObject, PUCHAR nextMiniport ); NTSTATUS VideoPortFindAdapter2( IN PDRIVER_OBJECT DriverObject, IN PVOID Argument2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext, PDEVICE_OBJECT DeviceObject, PUCHAR nextMiniport ); NTSTATUS VpAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ); VP_STATUS VpRegistryCallback( PVOID HwDeviceExtension, PVOID Context, PWSTR ValueName, PVOID ValueData, ULONG ValueLength ); NTSTATUS VpGetBusInterface( PFDO_EXTENSION FdoExtension ); PVOID VpGetProcAddress( IN PVOID HwDeviceExtension, IN PUCHAR FunctionName ); BOOLEAN pVideoPortInterrupt( IN PKINTERRUPT Interrupt, IN PDEVICE_OBJECT DeviceObject ); VOID pVideoPortMapToNtStatus( IN PSTATUS_BLOCK StatusBlock ); NTSTATUS pVideoPortMapUserPhysicalMem( IN PFDO_EXTENSION FdoExtension, IN HANDLE ProcessHandle OPTIONAL, IN PHYSICAL_ADDRESS PhysicalAddress, IN OUT PULONG Length, IN OUT PULONG InIoSpace, IN OUT PVOID *VirtualAddress ); BOOLEAN pVideoPortSynchronizeExecution( PVOID HwDeviceExtension, VIDEO_SYNCHRONIZE_PRIORITY Priority, PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, PVOID Context ); VOID pVideoPortHwTimer( IN PDEVICE_OBJECT DeviceObject, PVOID Context ); BOOLEAN pVideoPortResetDisplay( IN ULONG Columns, IN ULONG Rows ); PHYSICAL_ADDRESS AgpReservePhysical( IN PVOID Context, IN ULONG Pages, IN ULONG Caching, OUT PVOID *PhysicalReserveContext ); VOID AgpReleasePhysical( PVOID Context, PVOID PhysicalReserveContext ); BOOLEAN AgpCommitPhysical( PVOID Context, PVOID PhysicalReserveContext, ULONG Pages, ULONG Offset ); VOID AgpFreePhysical( IN PVOID Context, IN PVOID PhysicalReserveContext, IN ULONG Pages, IN ULONG Offset ); PVOID AgpReserveVirtual( IN PVOID Context, IN HANDLE ProcessHandle, IN PVOID PhysicalReserveContext, OUT PVOID *VirtualReserveContext ); VOID AgpReleaseVirtual( IN PVOID Context, IN PVOID VirtualReserveContext ); PVOID AgpCommitVirtual( IN PVOID Context, IN PVOID VirtualReserveContext, IN ULONG Pages, IN ULONG Offset ); VOID AgpFreeVirtual( IN PVOID Context, IN PVOID VirtualReserveContext, IN ULONG Pages, IN ULONG Offset ); BOOLEAN CreateBitField( ULONG Length, PREGION *Region ); VOID ModifyRegion( PREGION Region, ULONG Offset, ULONG Length, BOOLEAN Set ); BOOLEAN FindFirstRun( PREGION Region, PULONG Offset, PULONG Length ); NTSTATUS VpAppendToRequirementsList( IN PDEVICE_OBJECT DeviceObject, IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *RequirementsList, IN ULONG NumAccessRanges, IN PVIDEO_ACCESS_RANGE AccessRanges ); BOOLEAN VpIsLegacyAccessRange( PFDO_EXTENSION fdoExtension, PVIDEO_ACCESS_RANGE AccessRange ); PCM_RESOURCE_LIST VpRemoveFromResourceList( PCM_RESOURCE_LIST OriginalList, ULONG NumAccessRanges, PVIDEO_ACCESS_RANGE AccessRanges ); VOID VpEnableDisplay( BOOLEAN bState ); VOID VpWin32kCallout( PVIDEO_WIN32K_CALLBACKS_PARAMS calloutParams ); BOOLEAN VpAllowFindAdapter( PFDO_EXTENSION fdoExtension ); ULONG GetCmResourceListSize( PCM_RESOURCE_LIST CmResourceList ); VOID pVideoPortDpcDispatcher( IN PKDPC Dpc, IN PVOID HwDeviceExtension, IN PMINIPORT_DPC_ROUTINE DpcRoutine, IN PVOID Context ); #if DBG VOID DumpRequirements( PIO_RESOURCE_REQUIREMENTS_LIST Requirements ); VOID DumpResourceList( PCM_RESOURCE_LIST pcmResourceList ); PIO_RESOURCE_REQUIREMENTS_LIST BuildRequirements( PCM_RESOURCE_LIST pcmResourceList ); VOID DumpHwInitData( IN PVIDEO_HW_INITIALIZATION_DATA p ); VOID DumpUnicodeString( IN PUNICODE_STRING p ); #endif PCM_PARTIAL_RESOURCE_DESCRIPTOR RtlUnpackPartialDesc( IN UCHAR Type, IN PCM_RESOURCE_LIST ResList, IN OUT PULONG Count ); ULONG pVideoPortGetVgaStatusPci( PVOID HwDeviceExtension ); BOOLEAN VpIsVgaResource( PVIDEO_ACCESS_RANGE AccessRange ); VOID VpInterfaceDefaultReference( IN PVOID pContext ); VOID VpInterfaceDefaultDereference( IN PVOID pContext ); #endif // ifndef __VIDEOPRT_H__