/*++ Copyright (c) 1991-2000 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 #define _NTOSDEF_ #define INITGUID #include "dderror.h" #include "ntosp.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 "acpiioct.h" #include "agp.h" #include "inbv.h" #include "ntrtl.h" #include "ntiodump.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 #else #define pVideoDebugPrint(arg) #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; typedef struct _BUGCHECK_DATA { ULONG ulBugCheckCode; ULONG_PTR ulpBugCheckParameter1; ULONG_PTR ulpBugCheckParameter2; ULONG_PTR ulpBugCheckParameter3; ULONG_PTR ulpBugCheckParameter4; } BUGCHECK_DATA, *PBUGCHECK_DATA; // // 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 // // Int10 Transfer Area // #define VDM_TRANSFER_SEGMENT 0x2000 #define VDM_TRANSFER_OFFSET 0x0000 #define VDM_TRANSFER_LENGTH 0x1000 // // the Extended BIOS data location // #define EXTENDED_BIOS_INFO_LOCATION 0x740 // // Possible values for the InterruptFlags field in the DeviceExtension // #define VP_ERROR_LOGGED 0x01 // // Port driver error logging // typedef struct _VP_ERROR_LOG_ENTRY { PVOID DeviceExtension; ULONG IoControlCode; VP_STATUS ErrorCode; ULONG UniqueId; } VP_ERROR_LOG_ENTRY, *PVP_ERROR_LOG_ENTRY; 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 BOOT_DRIVER 0x010 #define REPORT_DEVICE 0x020 #define UPGRADE_FAIL_START 0x040 #define FINDADAPTER_SUCCEEDED 0x080 #define UPGRADE_FAIL_HWINIT 0x100 #define VGA_DETECT 0x200 // // Setup flags // #define SETUPTYPE_NONE 0 #define SETUPTYPE_FULL 1 #define SETUPTYPE_MINI 2 #define SETUPTYPE_UPGRADE 4 // // ResetHW Structure // typedef struct _VP_RESET_HW { PVIDEO_HW_RESET_HW ResetFunction; PVOID HwDeviceExtension; } VP_RESET_HW, *PVP_RESET_HW; // // Videoprt allocation and DEVICE_EXTENSION header tag. // #define VP_TAG 0x74725076 // 'vPrt' // // 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 // // NOTE: PVIDEO_PORT_EVENT is a private structure. It must be the same as // ENG_EVENT in pw32kevt.h for ENG/GDI. // typedef struct _VIDEO_PORT_EVENT { PVOID pKEvent; ULONG fFlags; } VIDEO_PORT_EVENT, *PVIDEO_PORT_EVENT; typedef struct _VIDEO_PORT_SPIN_LOCK { KSPIN_LOCK Lock; } VIDEO_PORT_SPIN_LOCK, *PVIDEO_PORT_SPIN_LOCK; typedef struct _VIDEO_ACPI_EVENT_CONTEXT { WORK_QUEUE_ITEM workItem; struct _DEVICE_SPECIFIC_EXTENSION *DoSpecificExtension; ULONG EventID; } VIDEO_ACPI_EVENT_CONTEXT, *PVIDEO_ACPI_EVENT_CONTEXT; // // The following takes the place of the EDID in the old DEVICE_EXTENSTION. this type // is private to the video port child enumeration code. // #define NO_EDID 0 #define GOOD_EDID 1 #define BAD_EDID 2 #define EDID_BUFFER_SIZE 256 #define NONEDID_SIGNATURE 0x95C3DA76 #define ACPIDDC_EXIST 0x01 #define ACPIDDC_TESTED 0x02 typedef struct __VIDEO_CHILD_DESCRIPTOR { VIDEO_CHILD_TYPE Type; ULONG UId; BOOLEAN bACPIDevice; UCHAR ACPIDDCFlag; BOOLEAN ValidEDID; BOOLEAN bInvalidate; UCHAR Buffer[EDID_BUFFER_SIZE]; } VIDEO_CHILD_DESCRIPTOR, *PVIDEO_CHILD_DESCRIPTOR; typedef struct __VP_DMA_ADAPTER { struct __VP_DMA_ADAPTER *NextVpDmaAdapter; PDMA_ADAPTER DmaAdapterObject; ULONG NumberOfMapRegisters; } VP_DMA_ADAPTER, *PVP_DMA_ADAPTER; 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; typedef enum _EXTENSION_TYPE { TypeFdoExtension, TypePdoExtension, TypeDeviceSpecificExtension } EXTENSION_TYPE, *PEXTENSION_TYPE; #define GET_DSP_EXT(p) ((((PDEVICE_SPECIFIC_EXTENSION)(p)) - 1)) #define GET_FDO_EXT(p) ((((PDEVICE_SPECIFIC_EXTENSION)(p)) - 1)->pFdoExtension) // // Define HW_DEVICE_EXTENSION verification macro. // #define IS_HW_DEVICE_EXTENSION(p) (((p) != NULL) && (GET_FDO_EXT(p)->HwDeviceExtension == (p))) #define IS_PDO(p) (((p) != NULL) && \ (((PCHILD_PDO_EXTENSION)(p))->Signature == VP_TAG) && \ (((PCHILD_PDO_EXTENSION)(p))->ExtensionType == TypePdoExtension)) #define IS_FDO(p) (((p) != NULL) && \ (((PFDO_EXTENSION)(p))->Signature == VP_TAG) && \ (((PFDO_EXTENSION)(p))->ExtensionType == TypeFdoExtension)) typedef struct _ALLOC_ENTRY { PVOID Address; ULONG Size; struct _ALLOC_ENTRY *Next; } *PALLOC_ENTRY, ALLOC_ENTRY; // // Device Object Specific Extension // // This is data that is allocated for each device object. It contains // a pointer back to the primary FDO_EXTENSION for the hardware device. // #ifdef IOCTL_VIDEO_USE_DEVICE_IN_SESSION #define VIDEO_DEVICE_INVALID_SESSION -1 #endif IOCTL_VIDEO_USE_DEVICE_IN_SESSION typedef struct _DEVICE_SPECIFIC_EXTENSION { // // VideoPort signature. // ULONG Signature; // // Indicates the type of the device extension. // EXTENSION_TYPE ExtensionType; // // Pointer to the hardware specific device extension. // PFDO_EXTENSION pFdoExtension; // // Location of the miniport device extension. // PVOID HwDeviceExtension; // // Pointer to the path name indicating the path to the drivers node in // the registry's current control set // PWSTR DriverRegistryPath; ULONG DriverRegistryPathLength; // // Callout support - Physdisp of the device in GDI // PVOID PhysDisp; BOOLEAN bACPI; ULONG CachedEventID; ULONG AcpiVideoEventsOutstanding; // // Number used to create device object name. (ie. Device\VideoX) // ULONG DeviceNumber; // // Track whether the device has been opened. // BOOLEAN DeviceOpened; // // Flags for DualView // ULONG DualviewFlags; // // Old & New device registry paths // PWSTR DriverNewRegistryPath; ULONG DriverNewRegistryPathLength; PWSTR DriverOldRegistryPath; ULONG DriverOldRegistryPathLength; #ifdef IOCTL_VIDEO_USE_DEVICE_IN_SESSION // // Session the device is currently enabled in // ULONG SessionId; #endif IOCTL_VIDEO_USE_DEVICE_IN_SESSION } DEVICE_SPECIFIC_EXTENSION, *PDEVICE_SPECIFIC_EXTENSION; // // Device Extension for the PHYSICAL Driver Object (PDO) // typedef struct _CHILD_PDO_EXTENSION { // // VideoPort signature. // ULONG Signature; // // Indicates the type of the device extension. // EXTENSION_TYPE ExtensionType; // // Pointer to the FDO extension. // It can also be used to determine if this is the PDO or FDO. // PFDO_EXTENSION pFdoExtension; // // Location of the miniport device extension. // PVOID HwDeviceExtension; // // This is only valid because ALL requests are processed synchronously. // NOTE: this must be consistent with DEVICE_EXTENSIONs. // KPROCESSOR_MODE CurrentIrpRequestorMode; // // Saved Power state to detect transitions. // DEVICE_POWER_STATE DevicePowerState; // // Power management mappings. // DEVICE_POWER_STATE DeviceMapping[PowerSystemMaximum] ; BOOLEAN IsMappingReady ; // // Event object for pVideoPortDispatch synchronization. // KMUTEX SyncMutex; IO_REMOVE_LOCK RemoveLock; //////////////////////////////////////////////////////////////////////////// // // END common header. // //////////////////////////////////////////////////////////////////////////// // // Non-paged copy of the UId in the VideoChildDescriptor, so we can do // power management at raise IRQL. // ULONG ChildUId; // // Device descriptor (EDID for monitors,etc). // PVIDEO_CHILD_DESCRIPTOR VideoChildDescriptor; // // Child PDO we created // PDEVICE_OBJECT ChildDeviceObject; // // Child FDO // PDEVICE_OBJECT ChildFdo; // // PDEVICE_OBJECT link pointer for enumeration. // struct _CHILD_PDO_EXTENSION* NextChild; // // BOOLEAN to indicate if this child device has been found // in the last enumeration. // BOOLEAN bIsEnumerated; // // Is this a lid override case. If this variable is set to TRUE, // don't bring the panel out of D3. // BOOLEAN PowerOverride; } CHILD_PDO_EXTENSION; // // Device Extension for the FUNCTIONAL Driver Object (FDO) // typedef struct _FDO_EXTENSION { // // VideoPort signature. // ULONG Signature; // // Indicates the type of the device extension. // EXTENSION_TYPE ExtensionType; // // Pointer to the FDO extension. // It can also be used to determine if this is the PDO or FDO. // PFDO_EXTENSION pFdoExtension; // // Location of the miniport device extension. // PVOID HwDeviceExtension; // // RequestorMode of the Currently processed IRP. // This is only valid because ALL requests are processed synchronously. // NOTE: this must be consistent with CHILD_PDO_EXTENSIONs. // KPROCESSOR_MODE CurrentIrpRequestorMode; // // Saved Power state to detect transitions. // DEVICE_POWER_STATE DevicePowerState; // // Power management mappings. // DEVICE_POWER_STATE DeviceMapping[PowerSystemMaximum] ; BOOLEAN IsMappingReady ; // // Monitor power override. If TRUE, always set monitors to D3. // BOOLEAN OverrideMonitorPower; // // Event object for pVideoPortDispatch synchronization. // KMUTEX SyncMutex; IO_REMOVE_LOCK RemoveLock; //////////////////////////////////////////////////////////////////////////// // // END common header. // //////////////////////////////////////////////////////////////////////////// // // Adapter device objects // PDEVICE_OBJECT FunctionalDeviceObject; PDEVICE_OBJECT PhysicalDeviceObject; PDEVICE_OBJECT AttachedDeviceObject; // // Point to the next FdoExtension // PFDO_EXTENSION NextFdoExtension; // // Pointer to the first Child PDO // ULONG ChildPdoNumber; PCHILD_PDO_EXTENSION ChildPdoList; // // 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_START_DMA HwStartDma; PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor; 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; KAFFINITY InterruptAffinity; KINTERRUPT_MODE InterruptMode; BOOLEAN InterruptsEnabled; // // Information about the BUS on which the adapteris located // INTERFACE_TYPE AdapterInterfaceType; ULONG SystemIoBusNumber; // // DPC used to log errors. // KDPC ErrorLogDpc; // // Stores the size and pointer to the EmulatorAccessEntries. These are // kept since they will be accessed later on when the Emulation must be // enabled. // ULONG NumEmulatorAccessEntries; PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries; ULONG_PTR EmulatorAccessEntriesContext; // // Size of the miniport device extensions. // ULONG HwDeviceExtensionSize; // // Determines the size required to save the video hardware state // ULONG HardwareStateSize; // // Total memory usage of PTEs by a miniport driver. // This is used to track if the miniport is mapping too much memory // ULONG MemoryPTEUsage; // // Has the drivers HwInitialize routine been called. // HW_INIT_STATUS HwInitStatus; // // State set during an Interrupt that must be dealt with afterwards // ULONG InterruptFlags; // // LogEntry Packet so the information can be save when called from within // an interrupt. // VP_ERROR_LOG_ENTRY ErrorLogEntry; // // VDM and int10 support // PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress; ULONG VdmPhysicalVideoMemoryLength; PEPROCESS VdmProcess; //////////////////////////////////////////////////////////////////////////// // // DMA support. // //////////////////////////////////////////////////////////////////////////// PVP_DMA_ADAPTER VpDmaAdapterHead; // // Adapter object returned by IoGetDmaAdapter. This is for old DMA stuff // PDMA_ADAPTER DmaAdapterObject; // // 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 // // Slot/Function number where the device is located // 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; // // Cache away a pointer to our driver object. // PDRIVER_OBJECT DriverObject; // // Flags that indicate type of driver (VGA, PNP, etc) // ULONG Flags; // // ROM Support // PVOID RomImage; // // AGP Support // AGP_BUS_INTERFACE_STANDARD AgpInterface; // // Power management variables related to hardware reset // BOOLEAN bGDIResetHardware; // // Index to be used for the registry path: // CCS\Control\Video\[GUID]\000x // The index is used for dual-view and for legacy drivers // ULONG RegistryIndex; // // Power management vaiable. If set to TRUE the device must // stay at D0 all the time during the system Shutdown (S5) and // Hibernation (S4) requests // BOOLEAN OnHibernationPath; // // Support for bugcheck reason callbacks // PVIDEO_BUGCHECK_CALLBACK BugcheckCallback; ULONG BugcheckDataSize; } FDO_EXTENSION, *PFDO_EXTENSION; #define MAXIMUM_MEM_LIMIT_K 64 // // AGP Data Structures // typedef struct _REGION { ULONG Length; ULONG NumWords; // number of USHORTs USHORT BitField[1]; } REGION, *PREGION; typedef struct _PHYSICAL_RESERVE_CONTEXT { ULONG Pages; VIDEO_PORT_CACHE_TYPE Caching; PVOID MapHandle; PHYSICAL_ADDRESS PhysicalAddress; PREGION Region; PREGION MapTable; } PHYSICAL_RESERVE_CONTEXT, *PPHYSICAL_RESERVE_CONTEXT; typedef struct _VIRTUAL_RESERVE_CONTEXT { HANDLE ProcessHandle; PEPROCESS Process; PVOID VirtualAddress; PPHYSICAL_RESERVE_CONTEXT PhysicalReserveContext; PREGION Region; PREGION MapTable; } 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; // // PowerState work item // typedef struct _POWER_STATE_WORK_ITEM { WORK_QUEUE_ITEM WorkItem; PVOID Argument1; PVOID Argument2; } POWER_STATE_WORK_ITEM, *PPOWER_STATE_WORK_ITEM; // // Support for backlight control // typedef struct _BACKLIGHT_STATUS { BOOLEAN bNewAPISupported; BOOLEAN bQuerySupportedBrightnessCalled; BOOLEAN bACBrightnessKnown; BOOLEAN bDCBrightnessKnown; BOOLEAN bACBrightnessInRegistry; BOOLEAN bDCBrightnessInRegistry; BOOLEAN bBIOSDefaultACKnown; BOOLEAN bBIOSDefaultDCKnown; UCHAR ucACBrightness; UCHAR ucDCBrightness; UCHAR ucBIOSDefaultAC; UCHAR ucBIOSDefaultDC; UCHAR ucAmbientLightLevel; } BACKLIGHT_STATUS, *PBACKLIGHT_STATUS; // // New registry key // #define SZ_GUID L"VideoID" #define SZ_LEGACY_KEY L"LegacyKey" #define SZ_VIDEO_DEVICES L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video" #define SZ_USE_NEW_KEY L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\UseNewKey" #define SZ_LIDCLOSE L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\LidCloseSetPower" #define SZ_INITIAL_SETTINGS L"Settings" #define SZ_COMMON_SUBKEY L"Video" #define SZ_SERVICE L"Service" // // Global Data // #if DBG extern CHAR *BusType[]; #endif extern ULONG VpSetupType; extern ULONG VpSetupTypeAtBoot; extern BOOLEAN VPFirstTime; extern PVIDEO_WIN32K_CALLOUT Win32kCallout; extern BOOLEAN EnableUSWC; extern ULONG VideoDebugLevel; extern ULONG VideoPortMaxDmaSize; extern ULONG VideoDeviceNumber; extern ULONG VideoChildDevices; extern PWSTR VideoClassString; extern UNICODE_STRING VideoClassName; extern CONFIGURATION_TYPE VpQueryDeviceControllerType; extern CONFIGURATION_TYPE VpQueryDevicePeripheralType; extern ULONG VpQueryDeviceControllerNumber; extern ULONG VpQueryDevicePeripheralNumber; extern VP_RESET_HW HwResetHw[]; extern PFDO_EXTENSION FdoList[]; extern PFDO_EXTENSION FdoHead; extern BOOLEAN VpBaseVideo; extern PVOID PhysicalMemorySection; extern PEPROCESS CsrProcess; extern ULONG VpC0000Compatible; extern PVOID VgaHwDeviceExtension; extern PVIDEO_ACCESS_RANGE VgaAccessRanges; extern ULONG NumVgaAccessRanges; extern PDEVICE_OBJECT DeviceOwningVga; extern PROC_ADDRESS VideoPortEntryPoints[]; extern VIDEO_ACCESS_RANGE VgaLegacyResources[]; extern PDEVICE_ADDRESS gDeviceAddressList; extern ULONGLONG VpSystemMemorySize; extern PDEVICE_OBJECT LCDPanelDevice; extern KMUTEX LCDPanelMutex; extern KMUTEX VpInt10Mutex; extern PVOID PowerStateCallbackHandle; extern PVOID DockCallbackHandle; extern ULONG NumDevicesStarted; extern BOOLEAN EnableNewRegistryKey; extern BOOLEAN VpSetupAllowDriversToStart; extern BOOLEAN VpSystemInitialized; extern ULONG ServerBiosAddressSpaceInitialized; extern BOOLEAN Int10BufferAllocated; extern PKEVENT VpThreadStuckEvent; extern HANDLE VpThreadStuckEventHandle; extern PDEVICE_OBJECT VpBugcheckDeviceObject; extern CONTEXT VpEaRecoveryContext; extern KBUGCHECK_REASON_CALLBACK_RECORD VpCallbackRecord; extern PVOID VpBugcheckData; extern KMUTEX VpGlobalLock; extern PVOID VpDump; extern ULONG_PTR KiBugCheckData[5]; // bugcheck data exported from ntoskrnl // {D00CE1F5-D60C-41c2-AF75-A4370C9976A3} DEFINE_GUID(VpBugcheckGUID, 0xd00ce1f5, 0xd60c, 0x41c2, 0xaf, 0x75, 0xa4, 0x37, 0xc, 0x99, 0x76, 0xa3); extern BACKLIGHT_STATUS VpBacklightStatus; extern BOOLEAN VpRunningOnAC; extern BOOLEAN VpLidCloseSetPower; #if defined(_IA64_) || defined(_AMD64_) PUCHAR BiosTransferArea; #endif typedef BOOLEAN (*PSYNCHRONIZE_ROUTINE) ( PKINTERRUPT pInterrupt, PKSYNCHRONIZE_ROUTINE pkSyncronizeRoutine, PVOID pSynchContext ); // // Number of legacy vga resources // #define NUM_VGA_LEGACY_RESOURCES 3 #define DMA_OPERATION(a) (VpDmaAdapter->DmaAdapterObject->DmaOperations->a) // // 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 50us max. // #define DELAY_MILLISECONDS(n) \ { \ ULONG d_ulCount; \ ULONG d_ulTotal = 20 * (n); \ \ for (d_ulCount = 0; d_ulCount < d_ulTotal; d_ulCount++) \ KeStallExecutionProcessor(50); \ } #define DELAY_MICROSECONDS(n) \ { \ ULONG d_ulCount = (n); \ \ while (d_ulCount > 0) \ { \ if (d_ulCount >= 50) \ { \ KeStallExecutionProcessor(50); \ d_ulCount -= 50; \ } \ else \ { \ KeStallExecutionProcessor(d_ulCount); \ d_ulCount = 0; \ } \ } \ } // // Max size for secondary dump data // #define MAX_SECONDARY_DUMP_SIZE (0x1000 - sizeof(DUMP_BLOB_FILE_HEADER) - sizeof(DUMP_BLOB_HEADER)) // // Private function declarations // // // i386\porti386.c // mips\portmips.c // alpha\portalpha.c VOID pVideoPortInitializeInt10( IN PFDO_EXTENSION FdoExtension ); NTSTATUS pVideoPortEnableVDM( IN PFDO_EXTENSION FdoExtension, IN BOOLEAN Enable, IN PVIDEO_VDM VdmInfo, IN ULONG VdmInfoSize ); NTSTATUS pVideoPortRegisterVDM( IN PFDO_EXTENSION FdoExtension, IN PVIDEO_VDM VdmInfo, IN ULONG VdmInfoSize, OUT PVIDEO_REGISTER_VDM RegisterVdm, IN ULONG RegisterVdmSize, OUT PULONG_PTR OutputSize ); NTSTATUS pVideoPortSetIOPM( IN ULONG NumAccessRanges, IN PVIDEO_ACCESS_RANGE AccessRange, IN BOOLEAN Enable, IN ULONG IOPMNumber ); VP_STATUS pVideoPortGetVDMBiosData( IN PFDO_EXTENSION FdoExtension, PCHAR Buffer, ULONG Length ); NTSTATUS pVideoPortPutVDMBiosData( IN PFDO_EXTENSION FdoExtension, PCHAR Buffer, ULONG Length ); // // acpi.c // NTSTATUS pVideoPortQueryACPIInterface( PDEVICE_SPECIFIC_EXTENSION FdoExtension ); NTSTATUS pVideoPortDockEventCallback ( PVOID NotificationStructure, PDEVICE_SPECIFIC_EXTENSION DoSpecificExtension ); VOID pVideoPortACPIEventCallback( PDEVICE_SPECIFIC_EXTENSION pFdoObject, ULONG eventID ); VOID pVideoPortACPIEventHandler( PVIDEO_ACPI_EVENT_CONTEXT EventContext ); NTSTATUS pVideoPortACPIIoctl( IN PDEVICE_OBJECT DeviceObject, IN ULONG MethodName, IN PULONG InputParam1, IN PULONG InputParam2, IN ULONG OutputBufferSize, IN PACPI_EVAL_OUTPUT_BUFFER pOutputBuffer ); VOID VpRegisterLCDCallbacks( ); VOID VpUnregisterLCDCallbacks( ); VOID VpRegisterPowerStateCallback( VOID ); VOID VpPowerStateCallback( IN PVOID CallbackContext, IN PVOID Argument1, IN PVOID Argument2 ); VOID VpDelayedPowerStateCallback( IN PVOID Context ); NTSTATUS VpSetLCDPowerUsage( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN FullPower ); NTSTATUS VpQueryBacklightLevels( IN PDEVICE_OBJECT DeviceObject, OUT PUCHAR ucBacklightLevels, OUT PULONG pulNumberOfLevelsSupported ); // // ddc.c // BOOLEAN DDCReadEdidSegment( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl, IN OUT PUCHAR pucEdidBuffer, IN ULONG ulEdidBufferSize, IN UCHAR ucEdidSegment, IN UCHAR ucEdidOffset, IN UCHAR ucSetOffsetAddress, IN UCHAR ucReadAddress, IN BOOLEAN bEnhancedDDC ); // // dma.c // #if DBG VOID pDumpScatterGather( PVP_SCATTER_GATHER_LIST SGList ); #define DUMP_SCATTER_GATHER(SGList) pDumpScatterGather(SGList) #else #define DUMP_SCATTER_GATHER(SGList) #endif PVOID VideoPortGetCommonBuffer( IN PVOID HwDeviceExtension, IN ULONG DesiredLength, IN ULONG Alignment, OUT PPHYSICAL_ADDRESS LogicalAddress, OUT PULONG ActualLength, IN BOOLEAN CacheEnabled ); VOID VideoPortFreeCommonBuffer( IN PVOID HwDeviceExtension, IN ULONG Length, IN PVOID VirtualAddress, IN PHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled ); PDMA VideoPortDoDma( IN PVOID HwDeviceExtension, IN PDMA pDma, IN DMA_FLAGS DmaFlags ); BOOLEAN VideoPortLockPages( IN PVOID HwDeviceExtension, IN OUT PVIDEO_REQUEST_PACKET pVrp, IN PEVENT pMappedUserEvent, IN PEVENT pDisplayEvent, IN DMA_FLAGS DmaFlags ); BOOLEAN VideoPortUnlockPages( PVOID HwDeviceExtension, PDMA pDma ); PVOID VideoPortGetMdl( IN PVOID HwDeviceExtension, IN PDMA pDma ); VOID pVideoPortListControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp, IN PSCATTER_GATHER_LIST ScatterGather, IN PVOID Context ); // // edid.c // BOOLEAN pVideoPortIsValidEDID( PVOID Edid ); VOID pVideoPortGetEDIDId( PVOID pEdid, PWCHAR pwChar ); PVOID pVideoPortGetMonitordescription( PVOID pEdid ); ULONG pVideoPortGetEdidOemID( IN PVOID pEdid, OUT PUCHAR pBuffer ); // // enum.c // NTSTATUS pVideoPnPCapabilities( IN PCHILD_PDO_EXTENSION PdoExtension, IN PDEVICE_CAPABILITIES Capabilities ); NTSTATUS pVideoPnPResourceRequirements( IN PCHILD_PDO_EXTENSION PdoExtension, OUT PCM_RESOURCE_LIST * ResourceList ); NTSTATUS pVideoPnPQueryId( IN PDEVICE_OBJECT DeviceObject, IN BUS_QUERY_ID_TYPE BusQueryIdType, IN OUT PWSTR * BusQueryId ); NTSTATUS VpAddPdo( PDEVICE_OBJECT DeviceObject, PVIDEO_CHILD_DESCRIPTOR VideoChildDescriptor ); NTSTATUS pVideoPortEnumerateChildren( PDEVICE_OBJECT DeviceObject, PIRP Irp ); NTSTATUS pVideoPortQueryDeviceText( PDEVICE_OBJECT ChildDevice, DEVICE_TEXT_TYPE TextType, PWSTR * ReturnValue ); NTSTATUS pVideoPortCleanUpChildList( PFDO_EXTENSION FdoExtension, PDEVICE_OBJECT deviceObject ); // // 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 ); // // i2c2.c // BOOLEAN I2CStart2( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl ); BOOLEAN I2CStop2( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl ); BOOLEAN I2CWrite2( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl, IN PUCHAR pucBuffer, IN ULONG ulLength ); BOOLEAN I2CRead2( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl, OUT PUCHAR pucBuffer, IN ULONG ulLength, IN BOOLEAN bEndOfRead ); BOOLEAN I2CWriteByte2( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl, IN UCHAR ucByte ); BOOLEAN I2CReadByte2( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl, OUT PUCHAR pucByte, IN BOOLEAN bEndOfRead ); BOOLEAN I2CWaitForClockLineHigh2( IN PVOID pHwDeviceExtension, IN PVIDEO_I2C_CONTROL pI2CControl ); // // pnp.c // NTSTATUS pVideoPortSendIrpToLowerDevice( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS pVideoPortPowerCallDownIrpStack( PDEVICE_OBJECT AttachedDeviceObject, PIRP Irp ); VOID pVideoPortHibernateNotify( IN PDEVICE_OBJECT Pdo, BOOLEAN IsVideoObject ); NTSTATUS pVideoPortPnpDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS pVideoPortPowerDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID pVideoPortPowerIrpComplete( IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ); NTSTATUS pVideoPortPowerUpComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); // // registry.c // NTSTATUS VpGetFlags( IN PUNICODE_STRING RegistryPath, PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, PULONG Flags ); BOOLEAN IsMirrorDriver( PFDO_EXTENSION FdoExtension ); BOOLEAN pOverrideConflict( PFDO_EXTENSION FdoExtension, BOOLEAN bSetResources ); NTSTATUS pVideoPortReportResourceList( PDEVICE_SPECIFIC_EXTENSION DoSpecificExtension, ULONG NumAccessRanges, PVIDEO_ACCESS_RANGE AccessRanges, PBOOLEAN Conflict, PDEVICE_OBJECT DeviceObject, BOOLEAN ClaimUnlistedResources ); VOID VpReleaseResources( PFDO_EXTENSION FdoExtension ); BOOLEAN VpIsDetection( PUNICODE_STRING RegistryPath ); NTSTATUS VpSetEventCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event ); VOID UpdateRegValue( IN PUNICODE_STRING RegistryPath, IN PWCHAR RegValue, IN ULONG Value ); // // videoprt.c // NTSTATUS pVideoPortCreateDeviceName( PWSTR DeviceString, ULONG DeviceNumber, PUNICODE_STRING UnicodeString, PWCHAR UnicodeBuffer ); NTSTATUS pVideoPortDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS pVideoPortSystemControl( 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 pVideoPortGetDeviceDataRegistry( IN PVOID Context, IN PUNICODE_STRING PathName, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN PKEY_VALUE_FULL_INFORMATION *BusInformation, IN CONFIGURATION_TYPE ControllerType, IN ULONG ControllerNumber, IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, IN CONFIGURATION_TYPE PeripheralType, IN ULONG PeripheralNumber, IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation ); NTSTATUS pVideoPortGetRegistryCallback( IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext ); VOID pVPInit( VOID ); NTSTATUS VpInitializeBusCallback( IN PVOID Context, IN PUNICODE_STRING PathName, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN PKEY_VALUE_FULL_INFORMATION *BusInformation, IN CONFIGURATION_TYPE ControllerType, IN ULONG ControllerNumber, IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, IN CONFIGURATION_TYPE PeripheralType, IN ULONG PeripheralNumber, IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation ); NTSTATUS VpCreateDevice( IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, OUT PDEVICE_OBJECT *DeviceObject ); ULONG VideoPortLegacyFindAdapter( IN PDRIVER_OBJECT DriverObject, IN PVOID Argument2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext, IN ULONG PnpFlags ); 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 ); VOID VpDriverUnload( IN PDRIVER_OBJECT DriverObject ); 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 ); BOOLEAN pVideoPortLogErrorEntry( IN PVOID Context ); VOID pVideoPortLogErrorEntryDPC( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); 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 ); VOID pVideoPortPowerCompletionIoctl( IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ); 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 ); BOOLEAN pVideoPortMapStoD( IN PVOID DeviceExtension, IN SYSTEM_POWER_STATE SystemState, OUT PDEVICE_POWER_STATE DeviceState ); // // agp.c // BOOLEAN VpQueryAgpInterface( PFDO_EXTENSION DeviceExtension, IN USHORT Version ); PHYSICAL_ADDRESS AgpReservePhysical( IN PVOID Context, IN ULONG Pages, IN VIDEO_PORT_CACHE_TYPE 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 AgpSetRate( IN PVOID Context, IN ULONG AgpRate ); VP_STATUS VpGetAgpServices2( IN PVOID pHwDeviceExtension, OUT PVIDEO_PORT_AGP_INTERFACE_2 pAgpInterface ); // // ??? // BOOLEAN CreateBitField( PREGION *Region, ULONG Length ); 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 ); BOOLEAN VpIsResourceInList( PCM_PARTIAL_RESOURCE_DESCRIPTOR pResource, PCM_FULL_RESOURCE_DESCRIPTOR pFullResource, PCM_RESOURCE_LIST removeList ); PCM_RESOURCE_LIST VpRemoveFromResourceList( PCM_RESOURCE_LIST OriginalList, ULONG NumAccessRanges, PVIDEO_ACCESS_RANGE AccessRanges ); VOID VpEnableDisplay( PFDO_EXTENSION fdoExtension, BOOLEAN bState ); VOID VpWin32kCallout( PVIDEO_WIN32K_CALLBACKS_PARAMS calloutParams ); BOOLEAN pCheckActiveMonitor( PCHILD_PDO_EXTENSION pChildDeviceExtension ); BOOLEAN VpAllowFindAdapter( PFDO_EXTENSION fdoExtension ); VOID InitializePowerStruct( IN PIRP Irp, OUT PVIDEO_POWER_MANAGEMENT vpPower, OUT BOOLEAN * bWakeUp ); BOOLEAN VpTranslateResource( IN PFDO_EXTENSION fdoExtension, IN PULONG InIoSpace, IN PPHYSICAL_ADDRESS PhysicalAddress, OUT PPHYSICAL_ADDRESS TranslatedAddress ); ULONG GetCmResourceListSize( PCM_RESOURCE_LIST CmResourceList ); VOID AddToResourceList( ULONG BusNumber, ULONG Slot ); BOOLEAN CheckResourceList( ULONG BusNumber, ULONG Slot ); BOOLEAN VpTranslateBusAddress( IN PFDO_EXTENSION fdoExtension, IN PPHYSICAL_ADDRESS IoAddress, IN OUT PULONG addressSpace, IN OUT PPHYSICAL_ADDRESS TranslatedAddress ); 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 DumpUnicodeString( IN PUNICODE_STRING p ); #endif PCM_PARTIAL_RESOURCE_DESCRIPTOR RtlUnpackPartialDesc( IN UCHAR Type, IN PCM_RESOURCE_LIST ResList, IN OUT PULONG Count ); NTSTATUS pVideoMiniDeviceIoControl( IN PDEVICE_OBJECT hDevice, IN ULONG dwIoControlCode, IN PVOID lpInBuffer, IN ULONG nInBufferSize, OUT PVOID lpOutBuffer, IN ULONG nOutBufferSize ); ULONG pVideoPortGetVgaStatusPci( PVOID HwDeviceExtension ); BOOLEAN VpIsVgaResource( PVIDEO_ACCESS_RANGE AccessRange ); VOID VpInterfaceDefaultReference( IN PVOID pContext ); VOID VpInterfaceDefaultDereference( IN PVOID pContext ); BOOLEAN VpEnableAdapterInterface( PDEVICE_SPECIFIC_EXTENSION DoSpecificExtension ); VOID VpDisableAdapterInterface( PFDO_EXTENSION fdoExtension ); ULONG VpGetDeviceCount( PVOID HwDeviceExtension ); VOID VpEnableNewRegistryKey( PFDO_EXTENSION FdoExtension, PDEVICE_SPECIFIC_EXTENSION DoSpecificExtension, PUNICODE_STRING RegistryPath, ULONG RegistryIndex ); VOID VpInitializeKey( PDEVICE_OBJECT PhysicalDeviceObject, PWSTR NewRegistryPath ); VOID VpInitializeLegacyKey( PWSTR OldRegistryPath, PWSTR NewRegistryPath ); NTSTATUS VpCopyRegistry( HANDLE hKeyRootSrc, HANDLE hKeyRootDst, PWSTR SrcKeyPath, PWSTR DstKeyPath ); VP_STATUS VPSetRegistryParameters( PVOID HwDeviceExtension, PWSTR ValueName, PVOID ValueData, ULONG ValueLength, PWSTR RegistryPath, ULONG RegistryPathLength ); VP_STATUS VPGetRegistryParameters( PVOID HwDeviceExtension, PWSTR ParameterName, UCHAR IsParameterFileName, PMINIPORT_GET_REGISTRY_ROUTINE CallbackRoutine, PVOID Context, PWSTR RegistryPath, ULONG RegistryPathLength ); BOOLEAN VpGetServiceSubkey( PUNICODE_STRING RegistryPath, HANDLE* pServiceSubKey ); VP_STATUS VpInt10AllocateBuffer( IN PVOID Context, OUT PUSHORT Seg, OUT PUSHORT Off, IN OUT PULONG Length ); VP_STATUS VpInt10FreeBuffer( IN PVOID Context, IN USHORT Seg, IN USHORT Off ); VP_STATUS VpInt10ReadMemory( IN PVOID Context, IN USHORT Seg, IN USHORT Off, OUT PVOID Buffer, IN ULONG Length ); VP_STATUS VpInt10WriteMemory( IN PVOID Context, IN USHORT Seg, IN USHORT Off, OUT PVOID Buffer, IN ULONG Length ); VP_STATUS VpInt10CallBios( PVOID HwDeviceExtension, PINT10_BIOS_ARGUMENTS BiosArguments ); VOID pVpBugcheckCallback( IN KBUGCHECK_CALLBACK_REASON Reason, IN PKBUGCHECK_REASON_CALLBACK_RECORD Record, IN OUT PVOID ReasonSpecificData, IN ULONG ReasonSpecificDataLength ); VOID VpAcquireLock( VOID ); VOID VpReleaseLock( VOID ); PVOID VpAllocateNonPagedPoolPageAligned( ULONG Size ); VOID pVpGeneralBugcheckHandler( PKBUGCHECK_SECONDARY_DUMP_DATA DumpData ); VOID pVpSimulateBugcheckEA( VOID ); VOID pVpWriteFile( PWSTR pwszFileName, PVOID pvBuffer, ULONG ulSize ); ULONG pVpAppendSecondaryMinidumpData( PVOID pvSecondaryData, ULONG ulSecondaryDataSize, PVOID pvDump ); #endif // ifndef __VIDEOPRT_H__