|
|
/*++
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;
//
// 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;
//
// 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_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 BOOLEAN VpNoVesa; 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 PDEVICE_OBJECT VpBugcheckDeviceObject; extern KBUGCHECK_REASON_CALLBACK_RECORD VpCallbackRecord; extern PVOID VpBugcheckData; extern KMUTEX VpGlobalLock; extern BOOLEAN VpDisableRecovery;
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);
#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 4000
C_ASSERT(MAX_SECONDARY_DUMP_SIZE <= (PAGE_SIZE - sizeof(DUMP_BLOB_FILE_HEADER) - sizeof(DUMP_BLOB_HEADER))); //
// Added to keep track on incompatible changes of BUGCHECK_DATA_SIZE_RESERVED
// declared at video.h
//
C_ASSERT(BUGCHECK_DATA_SIZE_RESERVED >= (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 );
//
// 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 );
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 pVpWriteFile( PWSTR pwszFileName, PVOID pvBuffer, ULONG ulSize );
VP_STATUS pVpFlushRegistry( PWSTR pwszRegKey );
PDEVICE_OBJECT pVpGetFdo( PDEVICE_OBJECT pPdo );
#endif // ifndef __VIDEOPRT_H__
|