Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

196 lines
8.6 KiB

/******************************Module*Header*******************************\
* Module Name: multi.hxx *
* *
* Supports splitting of request over multiple PDEVs *
* *
* Created: 29-Apr-1996 *
* Author: Tom Zakrajsek [tomzak] *
* *
* Copyright (c) 1996 Microsoft Corporation *
\**************************************************************************/
extern BOOL gbTraceMulti;
typedef struct _VDEV VDEV; // Handy forward declaration
typedef struct _DISPSURF DISPSURF; // Handy forward declaration
struct _DISPSURF;
typedef struct _DISPSURF DISPSURF, *PDISPSURF;
struct _DISPSURF
{
ULONG iDispSurf; // Sequentially allocated dispsurf number
BOOL bIsReadable; // TRUE if this surface is readable
HDEV hdev; // Handle that GDI knows us by
RECTL rcl; // DispSurf's coordinates
DISPSURF* pbNext; // For traversing the entire list of dispsurfs
DISPSURF* pbLeft; // For traversing by direction
DISPSURF* pbUp;
DISPSURF* pbRight;
DISPSURF* pbDown;
};
typedef struct _VDEV
{
LONG cSurfaces; // Number of surfaces controlled by this layer
HSURF hsurf; // Handle to our virtual surface
HDEV hdev; // Handle to our "driver layer"
CLIPOBJ* pco; // A temporary CLIPOBJ that we can modify
ULONG iBitmapFormat; // Current colour depth
FLONG flHooks; // Those functions that the main driver
// is hooking
RECTL rclBounds; // Bounding rectangle for all of the surfaces
DISPSURF* pb; // Where to start enumerating
DISPSURF* pbHome; // DispSurf used for full-screen
DISPSURF* pbUpperLeft; // DispSurf in upper-left corner
DISPSURF* pbUpperRight;
DISPSURF* pbLowerLeft;
DISPSURF* pbLowerRight;
DISPSURF* pbMaxLeft; // DispSurf that is most left
DISPSURF* pbMaxUp;
DISPSURF* pbMaxRight;
DISPSURF* pbMaxDown;
DISPSURF* pmbPointer; // DispSurf where cursor is currently visible
DISPSURF* pmbCurrent; // Currently selected dispsurf (needed for
// DrvRealizeBrush)
} VDEV, *PVDEV;
class TRACER {
public:
char *psz; // string to be printed
TRACER(char *pszFunc)
{
psz = pszFunc;
if (gbTraceMulti)
{
KdPrint(("Trace Enter - %s\n", psz));
}
}
~TRACER()
{
if (gbTraceMulti)
{
KdPrint(("Trace Exit - %s\n", psz));
}
}
};
class PVCONSUMER {
public:
PVOID *ppvConsumerTable;
PVOID *ppvConsumer;
PVCONSUMER(PVOID *ppv, LONG csurf)
{
ppvConsumer = ppv;
ppvConsumerTable = (PVOID*)*ppv;
if (ppvConsumerTable == NULL)
{
ppvConsumerTable = (PVOID*)EngAllocMem(FL_ZERO_MEMORY,
csurf * sizeof(PVOID),
'lumG');
*ppv = (PVOID)ppvConsumerTable;
}
}
~PVCONSUMER()
{
*ppvConsumer = (PVOID)ppvConsumerTable;
}
VOID DestroyTable()
{
if (ppvConsumerTable != NULL)
{
EngFreeMem(ppvConsumerTable);
ppvConsumerTable = NULL;
*ppvConsumer = (PVOID)ppvConsumerTable;
}
}
VOID LoadElement(LONG i)
{
*ppvConsumer = ppvConsumerTable[i];
}
VOID StoreElement(LONG i)
{
ppvConsumerTable[i] = *ppvConsumer;
}
};
/******************************Public*Routine******************************\
* Macro DISPSURF_DIRECTION_LIST
*
* Creates a single large VDEV that will represent the combination of other
* smaller driver surfaces
*
\**************************************************************************/
#define DISPSURF_DIRECTION_LIST(pvdev, Direction, direction, subdirection, arrow)\
{ \
PDISPSURF pbPrev = NULL; \
PDISPSURF pbCurrent = pvdev->pbMax##Direction; \
\
while ((pbCurrent) && \
((pDispSurf->rcl.##direction ##arrow pbCurrent->rcl.##direction) ||\
((pDispSurf->rcl.##direction == pbCurrent->rcl.##direction) && \
(pDispSurf->rcl.##subdirection ##arrow= pbCurrent->rcl.##subdirection))))\
{ \
pbPrev = pbCurrent; \
pbCurrent = pbCurrent->pb##Direction; \
} \
\
pDispSurf->pb##Direction = pbCurrent; \
\
if (pbCurrent == pvdev->pbMax##Direction) \
{ \
pvdev->pbMax##Direction = pDispSurf; \
} \
else \
{ \
pbPrev->pb##Direction = pDispSurf; \
} \
}
// Debug Routines
VOID DbgDumpPVDEV(VDEV *pvdev);
VOID DbgDumpPMDEV(MDEV *pmdev);
// Exported Driver Routines
extern "C" BOOL MulDrvEnableDriver(ULONG,ULONG,PDRVENABLEDATA);
extern "C" DHPDEV MulDrvEnablePDEV(PDEVMODEW,LPWSTR,ULONG,HSURF *,ULONG,PGDIINFO,ULONG,PDEVINFO,HDEV,LPWSTR,HANDLE);
extern "C" VOID MulDrvCompletePDEV(DHPDEV,HDEV);
extern "C" VOID MulDrvDisablePDEV(DHPDEV);
extern "C" VOID MulDrvSynchronize(DHPDEV,RECTL *);
extern "C" HSURF MulDrvEnableSurface(DHPDEV);
extern "C" VOID MulDrvDisableSurface(DHPDEV);
extern "C" BOOL MulDrvAssertMode(DHPDEV, BOOL);
extern "C" BOOL MulDrvTextOut(SURFOBJ *,STROBJ *,FONTOBJ *,CLIPOBJ *,RECTL *, RECTL *,BRUSHOBJ *,BRUSHOBJ *,POINTL *,MIX);
extern "C" BOOL MulDrvStretchBlt(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *, COLORADJUSTMENT *,POINTL *,RECTL *,RECTL *,POINTL *,ULONG);
extern "C" BOOL MulDrvBitBlt(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *, RECTL *,POINTL *,POINTL *,BRUSHOBJ *,POINTL *,ROP4);
extern "C" BOOL MulDrvRealizeBrush(BRUSHOBJ *,SURFOBJ *,SURFOBJ *,SURFOBJ *,XLATEOBJ *,ULONG);
extern "C" BOOL MulDrvCopyBits(SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,RECTL *,POINTL *);
extern "C" ULONG MulDrvDitherColor(DHPDEV, ULONG, ULONG, ULONG *);
extern "C" HBITMAP MulDrvCreateDeviceBitmap(DHPDEV dhpdev, SIZEL sizl, ULONG iFormat);
extern "C" VOID MulDrvDeleteDeviceBitmap(DHSURF dhsurf);
extern "C" BOOL MulDrvSetPalette(DHPDEV, PALOBJ *, FLONG, ULONG, ULONG);
extern "C" ULONG MulDrvEscape(SURFOBJ *, ULONG, ULONG, PVOID, ULONG, PVOID);
extern "C" ULONG MulDrvDrawEscape(SURFOBJ *, ULONG, CLIPOBJ *, RECTL *, ULONG, PVOID);
extern "C" ULONG MulDrvSetPointerShape(SURFOBJ *, SURFOBJ *, SURFOBJ *,XLATEOBJ *,LONG,LONG,LONG,LONG,RECTL *,FLONG);
extern "C" VOID MulDrvMovePointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl);
extern "C" VOID MulDrvExcludePointer(DHPDEV, RECTL *);
extern "C" BOOL MulDrvStrokePath(SURFOBJ *,PATHOBJ *,CLIPOBJ *,XFORMOBJ *, BRUSHOBJ *,POINTL *,LINEATTRS *,MIX);
extern "C" BOOL MulDrvFillPath(SURFOBJ *,PATHOBJ *,CLIPOBJ *,BRUSHOBJ *, POINTL *,MIX,FLONG);
extern "C" BOOL MulDrvStrokeAndFillPath(SURFOBJ *,PATHOBJ *,CLIPOBJ *,XFORMOBJ *, BRUSHOBJ *,LINEATTRS *,BRUSHOBJ *, POINTL *,MIX,FLONG);
extern "C" BOOL MulDrvPaint(SURFOBJ *,CLIPOBJ *,BRUSHOBJ *,POINTL *,MIX);
extern "C" BOOL MulDrvResetPDEV(DHPDEV dhpdevOld, DHPDEV dhpdevNew);
extern "C" ULONG MulDrvSaveScreenBits(SURFOBJ *, ULONG, ULONG, RECTL *);
extern "C" ULONG MulDrvGetModes(HANDLE, ULONG, DEVMODEW *);