/*++ Copyright (c) 1992 Microsoft Corporation Module Name: fsvga.h Abstract: This is the console fullscreen driver for the VGA card. Environment: kernel mode only Notes: Revision History: --*/ #ifndef _FSVGA_ #define _FSVGA_ #include "stdarg.h" #include "stdio.h" #include "ntddk.h" #include "ntddvdeo.h" #include "vga.h" #include "fsvgalog.h" #define FSVGA_POOL_TAG 'gVsF' #undef ExAllocatePool #define ExAllocatePool(Type, Bytes) ExAllocatePoolWithTag(Type, Bytes, FSVGA_POOL_TAG) // // Define the default number of elements in the class input data queue. // #define DUMP_COUNT 4 #define DEFAULT_DEBUG_LEVEL 0 // // Define the i8042 controller input/output ports. // typedef enum _VGA_IO_PORT_TYPE { CRTCAddressPortColor = 0, CRTCDataPortColor, GRAPHAddressPort, SEQAddressPort, MaximumPortCount } VGA_IO_PORT_TYPE; typedef struct _PORT_LIST { PVOID Port; ULONG Length; BOOLEAN MapRegistersRequired; } PORT_LIST, *PPORT_LIST; // // FSVGA configuration information. // typedef struct _FSVGA_CONFIGURATION_INFORMATION { USHORT EmulationMode; #define ENABLE_WORD_WRITE_VRAM 0x01 USHORT HardwareCursor; #define NO_HARDWARE_CURSOR 0 #define HARDWARE_CURSOR 0x01 USHORT HardwareScroll; #define NO_HARDWARE_SCROLL 0 #define HARDWARE_SCROLL 0x01 #define USE_LINE_COMPARE 0x02 #define OFFSET_128_TO_NEXT_SLICE 0x04 USHORT IOPort; } FSVGA_CONFIGURATION_INFORMATION, *PFSVGA_CONFIGURATION_INFORMATION; // // FSVGA resource information. // typedef struct _FSVGA_RESOURCE_INFORMATION { // // Indicate which hardware is actually present (display). // ULONG HardwarePresent; #ifdef RESOURCE_REQUIREMENTS // // Bus interface type. // INTERFACE_TYPE InterfaceType; // // Bus Number. // ULONG BusNumber; #endif // // The mapped addresses for this device's registers. // PORT_LIST PortList[MaximumPortCount]; } FSVGA_RESOURCE_INFORMATION, *PFSVGA_RESOURCE_INFORMATION; // // EMULATE_BUFFER_INFORMATION structure // typedef struct _EMULATE_BUFFER_INFORMATION { // // Hardware scroll // USHORT StartAddress; USHORT LineCompare; USHORT PrevLineCompare; USHORT BytePerLine; USHORT MaxScanLine; ULONG LimitGRAM; #define LIMIT_64K 0x10000L USHORT DeltaNextFontRow; // // Color Attributes for last access. // UCHAR ColorFg; UCHAR ColorBg; // // Cursor position and attributes for last access. VIDEO_CURSOR_ATTRIBUTES CursorAttributes; FSVIDEO_CURSOR_POSITION CursorPosition; BOOLEAN ShowCursor; } EMULATE_BUFFER_INFORMATION, *PEMULATE_BUFFER_INFORMATION; // // Port device extension. // typedef struct _DEVICE_EXTENSION { // // Pointer to the device object. // PDEVICE_OBJECT DeviceObject; // // Next lower driver in same stack. // PDEVICE_OBJECT LowerDeviceObject; // // Use count on this device. // LONG usage; // // Set when okay to remove this device. // KEVENT evRemove; // // TRUE if we're trying to remove this device. // BOOLEAN removing; // // TRUE if device has been started. // BOOLEAN started; // // Port resource information. // FSVGA_RESOURCE_INFORMATION Resource; // // FSVIDEO_MODE_INFORMATION structure for the current mode // FSVIDEO_MODE_INFORMATION CurrentMode; // // FSVIDEO_SCREEN_INFORMATION structure // FSVIDEO_SCREEN_INFORMATION ScreenAndFont; // // EMULATE_BUFFER_INFORMATION structure // EMULATE_BUFFER_INFORMATION EmulateInfo; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // // Global shared data // typedef struct _GLOBALS { // // Declare the global debug flag for this driver. // ULONG FsVgaDebug; // // A list of the registry path to the service parameters. // UNICODE_STRING RegistryPath; // // Port configuration information. // FSVGA_CONFIGURATION_INFORMATION Configuration; // // Resource list and size // FSVGA_RESOURCE_INFORMATION Resource; } GLOBALS, *PGLOBALS; extern GLOBALS Globals; // // Define the base values for the error log packet's UniqueErrorValue field. // #define FSVGA_ERROR_VALUE_BASE 1000 // // Defines for DeviceExtension->HardwarePresent. // #define FSVGA_HARDWARE_PRESENT 1 // // Function prototypes. // // // fsvga.c // NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); VOID FsVgaQueryDevice( IN PFSVGA_RESOURCE_INFORMATION Resource ); NTSTATUS FsVgaPeripheralCallout( 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 ); #ifdef RESOURCE_REQUIREMENTS NTSTATUS FsVgaQueryAperture( OUT PIO_RESOURCE_LIST *pApertureRequirements ); #endif NTSTATUS FsVgaCreateResource( IN PFSVGA_CONFIGURATION_INFORMATION configuration, OUT PCM_PARTIAL_RESOURCE_LIST *pResourceList ); VOID FsVgaServiceParameters( IN PFSVGA_CONFIGURATION_INFORMATION configuration, IN PUNICODE_STRING RegistryPath ); NTSTATUS FsVgaOpenCloseDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FsVgaDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FsVgaCopyFrameBuffer( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_COPY_FRAME_BUFFER CopyFrameBuffer, ULONG inputBufferLength ); NTSTATUS FsVgaWriteToFrameBuffer( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_WRITE_TO_FRAME_BUFFER WriteFrameBuffer, ULONG inputBufferLength ); NTSTATUS FsVgaReverseMousePointer( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_REVERSE_MOUSE_POINTER MouseBuffer, ULONG inputBufferLength ); NTSTATUS FsVgaSetMode( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_MODE_INFORMATION ModeInformation, ULONG inputBufferLength ); NTSTATUS FsVgaSetScreenInformation( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_SCREEN_INFORMATION ScreenInformation, ULONG inputBufferLength ); NTSTATUS FsVgaSetCursorPosition( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_CURSOR_POSITION CursorPosition, ULONG inputBufferLength ); NTSTATUS FsVgaSetCursorAttribute( PDEVICE_EXTENSION DeviceExtension, PVIDEO_CURSOR_ATTRIBUTES CursorAttributes, ULONG inputBufferLength ); VOID FsVgaLogError( IN PVOID Object, IN NTSTATUS ErrorCode, IN ULONG UniqueErrorValue, IN NTSTATUS FinalStatus, IN PULONG DumpData, IN ULONG DumpCount ); #if DBG VOID FsVgaDebugPrint( ULONG DebugPrintLevel, PCCHAR DebugMessage, ... ); extern ULONG FsVgaDebug; #define FsVgaPrint(x) FsVgaDebugPrint x #else #define FsVgaPrint(x) #endif // // drawscrn.c // ULONG CalcGRAMSize( IN COORD WindowSize, IN PFSVIDEO_SCREEN_INFORMATION ScreenInfo, IN PEMULATE_BUFFER_INFORMATION EmulateInfo ); PUCHAR CalcGRAMAddress( IN COORD WindowSize, IN PFSVIDEO_MODE_INFORMATION VideoModeInfo, IN PFSVIDEO_SCREEN_INFORMATION ScreenInfo, IN PEMULATE_BUFFER_INFORMATION EmulateInfo ); #ifdef LATER_HIGH_SPPED_VRAM_ACCESS // kazum BOOLEAN IsGRAMRowOver( PUCHAR BufPtr, BOOLEAN fDbcs, IN PFSVIDEO_MODE_INFORMATION VideoModeInfo, IN PEMULATE_BUFFER_INFORMATION EmulateInfo ); #endif // LATER_HIGH_SPPED_VRAM_ACCESS // kazum PUCHAR NextGRAMRow( PUCHAR BufPtr, IN PFSVIDEO_MODE_INFORMATION VideoModeInfo, IN PEMULATE_BUFFER_INFORMATION EmulateInfo ); VOID memcpyGRAM( IN PCHAR TargetPtr, IN PCHAR SourcePtr, IN ULONG Length ); VOID memcpyGRAMOver( IN PCHAR TargetPtr, IN PCHAR SourcePtr, IN ULONG Length, IN PUCHAR FrameBufPtr, IN PEMULATE_BUFFER_INFORMATION EmulateInfo ); VOID MoveGRAM( IN PCHAR TargetPtr, IN PCHAR SourcePtr, IN ULONG Length, IN PUCHAR FrameBufPtr, IN PFSVGA_RESOURCE_INFORMATION ResourceInfo, IN PEMULATE_BUFFER_INFORMATION EmulateInfo ); NTSTATUS FsgVgaInitializeHWFlags( PDEVICE_EXTENSION DeviceExtension ); NTSTATUS FsgCopyFrameBuffer( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_COPY_FRAME_BUFFER CopyFrameBuffer, ULONG inputBufferLength ); NTSTATUS FsgWriteToFrameBuffer( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_WRITE_TO_FRAME_BUFFER WriteFrameBuffer, ULONG inputBufferLength ); NTSTATUS FsgReverseMousePointer( PDEVICE_EXTENSION DeviceExtension, PFSVIDEO_REVERSE_MOUSE_POINTER MouseBuffer, ULONG inputBufferLength ); NTSTATUS FsgInvertCursor( PDEVICE_EXTENSION DeviceExtension, BOOLEAN Invert ); NTSTATUS FsgWriteToScreen( PUCHAR FrameBuffer, PUCHAR BitmapBuffer, ULONG cjBytes, BOOLEAN fDbcs, USHORT Attributes1, USHORT Attributes2, PDEVICE_EXTENSION DeviceExtension ); NTSTATUS FsgWriteToScreenCommonLVB( PUCHAR FrameBuffer, USHORT Attributes, PDEVICE_EXTENSION DeviceExtension ); UCHAR AccessGRAM_WR( PUCHAR FrameBuffer, UCHAR write ); UCHAR AccessGRAM_RW( PUCHAR FrameBuffer, UCHAR write ); UCHAR AccessGRAM_AND( PUCHAR FrameBuffer, UCHAR write ); // // foncache.c // ULONG CalcBitmapBufferSize( IN COORD FontSize, IN ULONG dwAlign ); VOID AlignCopyMemory( OUT PUCHAR pDestBits, IN ULONG dwDestAlign, IN PUCHAR pSrcBits, IN ULONG dwSrcAlign, IN COORD FontSize ); // // misc.c // int ConvertOutputToOem( IN LPWSTR Source, IN int SourceLength, // in chars OUT LPSTR Target, IN int TargetLength // in chars ); NTSTATUS TranslateOutputToOem( OUT PCHAR_IMAGE_INFO OutputBuffer, IN PCHAR_IMAGE_INFO InputBuffer, IN ULONG Length ); // // port.c // VOID GetHardwareScrollReg( PPORT_LIST PortList, PEMULATE_BUFFER_INFORMATION EmulateInfo ); VOID SetGRAMWriteMode( PPORT_LIST PortList ); VOID SetGRAMCopyMode( PPORT_LIST PortList ); VOID SetGRAMInvertMode( PPORT_LIST PortList ); VOID set_opaque_bkgnd_proc( PPORT_LIST PortList, PEMULATE_BUFFER_INFORMATION EmulateInfo, PUCHAR FrameBuffer, USHORT Attributes ); VOID ColorSetGridMask( PPORT_LIST PortList, UCHAR BitMask ); VOID ColorSetDirect( PPORT_LIST PortList, PUCHAR FrameBuffer, UCHAR ColorFg, UCHAR ColorBg ); // // pnp.c // VOID FsVgaDriverUnload( IN PDRIVER_OBJECT DriverObject ); NTSTATUS FsVgaAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo ); NTSTATUS FsVgaDevicePnp( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS FsVgaDefaultPnpHandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS FsVgaPnpRemoveDevice( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS FsVgaPnpStartDevice( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS FsVgaPnpStopDevice( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); #ifdef RESOURCE_REQUIREMENTS NTSTATUS FsVgaFilterResourceRequirements( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); #endif NTSTATUS FsVgaDevicePower( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS FsVgaDefaultPowerHandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS CompleteRequest( IN PIRP Irp, IN NTSTATUS status, IN ULONG info ); NTSTATUS ForwardAndWait( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS OnRequestComplete( IN PDEVICE_OBJECT fdo, IN PIRP Irp, IN PKEVENT pev ); VOID RemoveDevice( IN PDEVICE_OBJECT fdo ); BOOLEAN LockDevice( IN PDEVICE_EXTENSION pdx ); VOID UnlockDevice( IN PDEVICE_EXTENSION pdx ); NTSTATUS StartDevice( IN PDEVICE_OBJECT fdo, IN PCM_PARTIAL_RESOURCE_LIST list ); VOID StopDevice( IN PDEVICE_OBJECT fdo ); #endif // _FSVGA_