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.
 
 
 
 
 
 

317 lines
13 KiB

/******************************Module*Header*******************************\
* Module Name: driver.h
*
* Contains prototypes for the 64k color VGA driver.
*
* NOTE: Must mirror driver.inc!
*
* Copyright (c) 1992 Microsoft Corporation
\**************************************************************************/
#ifndef _DRIVER_
#define _DRIVER_
#include "stdlib.h"
#include "stddef.h"
#include "windows.h"
#include "winddi.h"
#include "devioctl.h"
#include "ntddvdeo.h"
#include "debug.h"
typedef struct _PDEV PDEV, *PPDEV;
//
// A mode requires broken rasters if the stride is a power of 2 and the video ram
// accessed is greater than 64K.
//
#define POW2(stride) (!((stride) & ((stride)-1))) // TRUE if stride is power of 2
#define BROKEN_RASTERS(stride,cy) ((!(POW2(stride))) && ((stride*cy) > 0x10000))
//
// Sizes assumed for 1-window and 2 RW-window banks.
//
#define BANK_SIZE_1_WINDOW 0x10000L
#define BANK_SIZE_2RW_WINDOW 0x08000L
//
// Temporary buffer must be at least as large as a bank.
// Must also be a multiple of 4.
//
#define TMP_BUFFER_SIZE (BANK_SIZE_1_WINDOW)
/**************************************************************************\
*
* Specifies desired justification for requested scan line within bank window
*
\**************************************************************************/
typedef enum {
JustifyTop = 0,
JustifyBottom,
} BANK_JUST;
/**************************************************************************\
*
* Specifies which window is to be mapped by two-window bank handler.
*
\**************************************************************************/
typedef enum {
MapSourceBank = 0,
MapDestBank,
} BANK_JUST;
/**************************************************************************\
*
* Bank clipping info
*
\**************************************************************************/
typedef struct {
RECTL rclBankBounds; // describes pixels addressable in this bank
ULONG ulBankOffset; // offset of bank start from bitmap start, if
// the bitmap were linearly addressable
} BANK_INFO, *PBANK_INFO;
/**************************************************************************\
*
* Bank control function vector
*
\**************************************************************************/
typedef VOID (*PFN_PlanarEnable)();
typedef VOID (*PFN_PlanarDisable)();
typedef VOID (*PFN_PlanarControl)(PPDEV, ULONG, BANK_JUST);
typedef VOID (*PFN_PlanarControl2)(PPDEV, ULONG, BANK_JUST, ULONG);
typedef VOID (*PFN_PlanarNext)(PPDEV);
typedef VOID (*PFN_PlanarNext2)(PPDEV, ULONG);
typedef VOID (*PFN_BankControl)(PPDEV, ULONG, BANK_JUST);
typedef VOID (*PFN_BankControl2)(PPDEV, ULONG, BANK_JUST, ULONG);
typedef VOID (*PFN_BankNext)(PPDEV);
typedef VOID (*PFN_BankNext2)(PPDEV, ULONG);
/**************************************************************************\
*
* Miscellaneous driver flags
*
\**************************************************************************/
#define DRIVER_PLANAR_CAPABLE 0x01L
#define DRIVER_USE_OFFSCREEN 0x02L // if not set, don't use offscreen memory
// for long operations (because the
// memory won't be refreshed)
#define DRIVER_HAS_OFFSCREEN 0x04L // if not set, can't use any offscreen
// memory
/**************************************************************************\
*
* Bank status flags
*
\**************************************************************************/
#define BANK_BROKEN_RASTER1 0x01L // If bank1 or read bank has broken raster
#define BANK_BROKEN_RASTER2 0x02L // If bank2 or write bank has broken raster
#define BANK_BROKEN_RASTERS (BANK_BROKEN_RASTER1 | BANK_BROKEN_RASTER2)
#define BANK_PLANAR 0x04L // If in planar mode
/**************************************************************************\
*
* Physical device data structure
*
\**************************************************************************/
// ***********************************************************
// *** MUST match the assembler version in i386\driver.inc ***
// ***********************************************************
typedef struct _PDEV
{
FLONG fl; // Driver flags (DRIVER_xxx)
HANDLE hDriver; // Handle to \Device\Screen
HDEV hdevEng; // Engine's handle to PDEV
HSURF hsurfEng; // Engine's handle to surface
HANDLE hsurfBm; // Handle to the "punt" surface
SURFOBJ* pSurfObj; // pointer to the locked "punt" surface
HPALETTE hpalDefault; // Handle to the default palette for device.
PBYTE pjScreen; // This is pointer to base screen address
ULONG cxScreen; // Visible screen width
ULONG cyScreen; // Visible screen height
ULONG ulMode; // Mode the mini-port driver is in.
LONG lDeltaScreen; // Distance from one scan to the next.
FLONG flRed; // For bitfields device, Red Mask
FLONG flGreen; // For bitfields device, Green Mask
FLONG flBlue; // For bitfields device, Blue Mask
ULONG ulBitCount; // # of bits per pel -- can be only 16
GDIINFO* pGdiInfo; // Pointer to temporary buffer for GDIINFO struct
DEVINFO* pDevInfo; // Pointer to temporary buffer for DEVINFO struct
ULONG ulrm0_wmX; // Four values (one per byte) to set
// GC5 to to select read mode 0
// together with write modes 0-3
// Off screen save stuff:
HBITMAP hbmTmp; // Handle to temporary buffer
SURFOBJ* psoTmp; // Temporary surface
PVOID pvTmp; // Pointer to temporary buffer
ULONG cyTmp; // # of scans in temporary surface
// DCI stuff:
BOOL bSupportDCI; // True if miniport supports DCI
// Bank manager stuff common between planar and non-planar modes:
LONG cTotalScans; // Number of usable on and off-screen
// scans
PVIDEO_BANK_SELECT pBankInfo; // Bank info for current mode returned
// by miniport
FLONG flBank; // Flags for current bank state
ULONG ulBitmapSize; // Length of bitmap if there were no
// banking, in CPU addressable bytes
ULONG ulWindowBank[2]; // Current banks mapped into windows
// 0 & 1
PVOID pvBitmapStart; // Single-window bitmap start pointer
// (adjusted as necessary to make
// window map in at proper offset)
PVOID pvBitmapStart2Window[2];// Double-window window 0 and 1 bitmap
// start
// Non-planar mode specific bank management control stuff:
VIDEO_BANK_TYPE vbtBankingType; // Type of banking
PFN pfnBankSwitchCode; // Pointer to bank switch code
LONG lNextScan; // Offset to next bank in bytes
BYTE* pjJustifyTopBank; // Pointer to lookup table for
// converting scans to banks
BANK_INFO* pbiBankInfo; // Array of bank clip info
ULONG ulJustifyBottomOffset; // # of scans from top to bottom
// of bank, for bottom justifying
ULONG iLastBank; // Index of last valid bank in
// pbiBankInfo table
ULONG ulBank2RWSkip; // Offset from one bank index to next
// to make two 32K banks appear to be
// one seamless 64K bank
PFN_BankControl pfnBankControl; // Pointer to bank control function
PFN_BankControl2 pfnBankControl2Window; // Pointer to double-window bank
// control function
PFN_BankNext pfnBankNext; // Pointer to next bank function
PFN_BankNext2 pfnBankNext2Window; // Pointer to double-window next
// bank function
RECTL rcl1WindowClip; // Single-window banking clip rect
RECTL rcl2WindowClip[2]; // Double-window banking clip rects for
// windows 0 & 1
// Planar mode specific bank management control stuff:
VIDEO_BANK_TYPE vbtPlanarType; // Type of planar banking
PFN pfnPlanarSwitchCode; // Pointer to planar bank switch
// code
LONG lPlanarNextScan; // Offset to next planar bank in
// bytes
BYTE* pjJustifyTopPlanar; // Pointer to lookup table for
// converting scans to banks
BANK_INFO* pbiPlanarInfo; // Array of bank clip info
ULONG ulPlanarBottomOffset;// # of scans from top to bottom
// of bank, for bottom justifying
ULONG iLastPlanar; // Index of last valid bank in
// pbiPlanarInfo table
ULONG ulPlanar2RWSkip; // Offset from one bank index to next
// to make two 32K banks appear to be
// one seamless 64K bank
PFN_PlanarControl pfnPlanarControl; // Planar one window bank control
PFN_PlanarControl2 pfnPlanarControl2; // Planar two window bank control
PFN_PlanarNext pfnPlanarNext; // Planar one window next bank
PFN_PlanarNext2 pfnPlanarNext2; // Planar two window next bank
RECTL rcl1PlanarClip; // Single-window banking clip rect
RECTL rcl2PlanarClip[2]; // Double-window banking clip rects for
// windows 0 & 1
PFN_PlanarEnable pfnPlanarEnable; // Function to enable planar mode
PFN_PlanarDisable pfnPlanarDisable; // Function to disable planar mode
// Smart bank manager stuff:
LONG iLastScan; // Last scan we want to enumerate
PVOID pvSaveScan0; // Surface's original pvScan0
RECTL rclSaveBounds; // Clip Object's original bounds
CLIPOBJ* pcoNull; // Points to an empty clip object
// we can use when we're given a
// NULL CLIPOBJ pointer
BYTE iSaveDComplexity; // Clip Object's original complexity
BYTE fjSaveOptions; // Clip Object's original flags
BYTE ajFiller[2]; // Pack dword alignment
BOOLEAN BankIoctlSupported; // does the miniport support ioctl
// based banking?
}; /* pdev */
// Size of the driver extra information in the DEVMODe structure passed
// to and from the display driver
#define DRIVER_EXTRA_SIZE 0
#define DLL_NAME L"vga64k" // Name of the DLL in UNICODE
#define STANDARD_DEBUG_PREFIX "VGA64K: " // All debug output is prefixed
#define ALLOC_TAG '6gvD' // 4 byte TAG for memory allocations
// When calling vEnumStart, make sure you set bAll to FALSE. This will tell
// the Engine to only enumerate rectangles in rclBounds.
// Hooks and Driver function table.
#define HOOKS_BMF16BPP (HOOK_BITBLT | HOOK_TEXTOUT | HOOK_COPYBITS | \
HOOK_STROKEPATH | HOOK_PAINT)
#define BB_RECT_LIMIT 50
typedef struct _BBENUM
{
ULONG c;
RECTL arcl[BB_RECT_LIMIT];
} BBENUM;
// Initialization stuff:
BOOL bEnableBanking(PPDEV);
VOID vDisableBanking(PPDEV);
BOOL bInitPDEV(PPDEV,PDEVMODEW);
BOOL bInitSURF(PPDEV,BOOL);
VOID vDisableSURF(PPDEV);
VOID vInitRegs(PPDEV);
DWORD getAvailableModes(HANDLE, PVIDEO_MODE_INFORMATION *, DWORD *);
// Smart bank manager stuff:
CLIPOBJ* pcoBankStart(PPDEV, RECTL*, SURFOBJ*, CLIPOBJ*);
BOOL bBankEnum(PPDEV, SURFOBJ*, CLIPOBJ*);
VOID vBankStartBltSrc(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
BOOL bBankEnumBltSrc(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
VOID vBankStartBltDest(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
BOOL bBankEnumBltDest(PPDEV, SURFOBJ*, POINTL*, RECTL*, POINTL*, RECTL*);
// Other prototypes:
VOID vPlanarCopyBits(PPDEV, RECTL*, POINTL*);
BOOL bIntersectRect(RECTL*, RECTL*, RECTL*);
VOID vSetWriteModes(ULONG *);
#endif // _DRIVER_