Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2225 lines
47 KiB

/*++
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__