/*
 * DirectDraw driver interface
 * (DirectX 7 version)
 *
 * Copyright (C) 2001 Ove Kaaven
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef __DDRAWI_INCLUDED__
#define __DDRAWI_INCLUDED__

#ifdef __cplusplus
extern "C" {
#endif

#define OBJECT_ISROOT           0x80000000

#include <ddraw.h>
#include <dvp.h>
#include <ddkernel.h>
#include <dmemmgr.h>

#define DDAPI WINAPI

#define VALID_ALIGNMENT(align) \
    (!((align==0)||(align%2)!= 0 ))

/* the DirectDraw versions */
#define DD_VERSION         0x0200 /* compatibility version */
#define DD_RUNTIME_VERSION 0x0902 /* actual version */

/* the HAL version returned from QUERYESCSUPPORT - DCICOMMAND */
#define DD_HAL_VERSION     0x0100

/* more DCICOMMAND escapes */
#ifndef DCICOMMAND
#define DCICOMMAND 3075
#endif

#define DDCREATEDRIVEROBJECT 10
#define DDGET32BITDRIVERNAME 11
#define DDNEWCALLBACKFNS     12
#define DDVERSIONINFO        13

#define DDUNSUPPORTEDMODE  ((DWORD) -1)

#include "dciddi.h"

#ifndef CCHDEVICENAME
#define CCHDEVICENAME 32
#endif
#define MAX_DRIVER_NAME CCHDEVICENAME

#define DDHAL_DRIVER_DLLNAME    "DDRAW16.DLL"
#define DDHAL_APP_DLLNAME       "DDRAW.DLL"

/* GUID */
#ifdef _WIN32
DEFINE_GUID(GUID_MiscellaneousCallbacks, 0xefd60cc0, 0x49e7, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, 0x00, 0xbb, 0xb7, 0x6a);
DEFINE_GUID(GUID_VideoPortCallbacks,     0xefd60cc1, 0x49e7, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, 0x00, 0xbb, 0xb7, 0x6a);
DEFINE_GUID(GUID_ColorControlCallbacks,  0xefd60cc2, 0x49e7, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, 0x00, 0xbb, 0xb7, 0x6a);
DEFINE_GUID(GUID_VideoPortCaps,          0xefd60cc3, 0x49e7, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, 0x00, 0xbb, 0xb7, 0x6a);
DEFINE_GUID(GUID_D3DCallbacks2,          0x0ba584e1, 0x70b6, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, 0x00, 0xbb, 0xb7, 0x6a);
DEFINE_GUID(GUID_D3DCallbacks3,          0xddf41230, 0xec0a, 0x11d0, 0xa9, 0xb6, 0x00, 0xaa, 0x00, 0xc0, 0x99, 0x3e);
DEFINE_GUID(GUID_NonLocalVidMemCaps,     0x86c4fa80, 0x8d84, 0x11d0, 0x94, 0xe8, 0x00, 0xc0, 0x4f, 0xc3, 0x41, 0x37);
DEFINE_GUID(GUID_KernelCallbacks,        0x80863800, 0x6B06, 0x11D0, 0x9B, 0x06, 0x0, 0xA0, 0xC9, 0x03, 0xA3, 0xB8);
DEFINE_GUID(GUID_KernelCaps,             0xFFAA7540, 0x7AA8, 0x11D0, 0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8);
DEFINE_GUID(GUID_D3DExtendedCaps,        0x7de41f80, 0x9d93, 0x11d0, 0x89, 0xab, 0x0, 0xa0, 0xc9, 0x5, 0x41, 0x29);
DEFINE_GUID(GUID_ZPixelFormats,          0x93869880, 0x36cf, 0x11d1, 0x9b, 0x1b, 0x0, 0xaa, 0x0, 0xbb, 0xb8, 0xae);
DEFINE_GUID(GUID_DDMoreSurfaceCaps,      0x3b8a0466, 0xf269, 0x11d1, 0x88, 0x0b, 0x0, 0xc0, 0x4f, 0xd9, 0x30, 0xc5);
DEFINE_GUID(GUID_DDStereoMode,           0xf828169c, 0xa8e8, 0x11d2, 0xa1, 0xf2, 0x0, 0xa0, 0xc9, 0x83, 0xea, 0xf6);
DEFINE_GUID(GUID_OptSurfaceKmodeInfo,    0xe05c8472, 0x51d4, 0x11d1, 0x8c, 0xce, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8);
DEFINE_GUID(GUID_OptSurfaceUmodeInfo,    0x9d792804, 0x5fa8, 0x11d1, 0x8c, 0xd0, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8);
DEFINE_GUID(GUID_UserModeDriverInfo,     0xf0b0e8e2, 0x5f97, 0x11d1, 0x8c, 0xd0, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8);
DEFINE_GUID(GUID_UserModeDriverPassword, 0x97f861b6, 0x60a1, 0x11d1, 0x8c, 0xd0, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8);
DEFINE_GUID(GUID_D3DParseUnknownCommandCallback, 0x2e04ffa0, 0x98e4, 0x11d1, 0x8c, 0xe1, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8);
DEFINE_GUID(GUID_MotionCompCallbacks,    0xb1122b40, 0x5dA5, 0x11d1, 0x8f, 0xcF, 0x00, 0xc0, 0x4f, 0xc2, 0x9b, 0x4e);
DEFINE_GUID(GUID_Miscellaneous2Callbacks, 0x406B2F00, 0x3E5A, 0x11D1, 0xB6, 0x40, 0x00, 0xAA, 0x00, 0xA1, 0xF9, 0x6A);
#endif

#ifndef _WIN32
#undef  E_NOTIMPL
#undef  E_OUTOFMEMORY
#undef  E_INVALIDARG
#undef  E_FAIL
#define E_NOTIMPL      0x80004001L
#define E_OUTOFMEMORY  0x8007000EL
#define E_INVALIDARG   0x80070057L
#define E_FAIL         0x80004005L
#endif

/*****************************************************************************
 * Initialization stuff
 */
typedef struct {
  char szName[260];
  char szEntryPoint[64];
  DWORD dwContext;
} DD32BITDRIVERDATA,*LPDD32BITDRIVERDATA;

typedef struct {
  DWORD dwHALVersion;
  ULONG_PTR dwReserved1;
  ULONG_PTR dwReserved2;
} DDVERSIONDATA,*LPDDVERSIONDATA;

typedef DWORD (PASCAL *LPDD32BITDRIVERINIT)(DWORD dwContext);

/* predeclare some structures */
typedef struct _DDHALINFO *LPDDHALINFO;
typedef struct _DDRAWI_DIRECTDRAW_INT *LPDDRAWI_DIRECTDRAW_INT;

#ifndef DDRAWI_DIRECTDRAW_DEFINED
typedef struct _DDRAWI_DIRECTDRAW_LCL *LPDDRAWI_DIRECTDRAW_LCL;
typedef struct _DDRAWI_DIRECTDRAW_GBL *LPDDRAWI_DIRECTDRAW_GBL;
#define DDRAWI_DIRECTDRAW_DEFINED
#endif

typedef struct _DDRAWI_DDRAWSURFACE_INT *LPDDRAWI_DDRAWSURFACE_INT;

#ifndef DDRAWI_DDRAWSURFACE_DEFINED
typedef struct _DDRAWI_DDRAWSURFACE_LCL *LPDDRAWI_DDRAWSURFACE_LCL;
#define DDRAWI_DDRAWSURFACE_DEFINED
#endif

typedef struct _DDRAWI_DDRAWSURFACE_GBL *LPDDRAWI_DDRAWSURFACE_GBL;
typedef struct _DDRAWI_DDRAWSURFACE_MORE *LPDDRAWI_DDRAWSURFACE_MORE;
typedef struct _DDRAWI_DDRAWSURFACE_GBL_MORE *LPDDRAWI_DDRAWSURFACE_GBL_MORE;
typedef struct _DDRAWI_DDRAWPALETTE_INT *LPDDRAWI_DDRAWPALETTE_INT;
typedef struct _DDRAWI_DDRAWPALETTE_LCL *LPDDRAWI_DDRAWPALETTE_LCL;
typedef struct _DDRAWI_DDRAWPALETTE_GBL *LPDDRAWI_DDRAWPALETTE_GBL;
typedef struct _DDRAWI_DDRAWCLIPPER_INT *LPDDRAWI_DDRAWCLIPPER_INT;
typedef struct _DDRAWI_DDRAWCLIPPER_LCL *LPDDRAWI_DDRAWCLIPPER_LCL;
typedef struct _DDRAWI_DDRAWCLIPPER_GBL *LPDDRAWI_DDRAWCLIPPER_GBL;
typedef struct _DDRAWI_DDVIDEOPORT_INT *LPDDRAWI_DDVIDEOPORT_INT;
typedef struct _DDRAWI_DDVIDEOPORT_LCL *LPDDRAWI_DDVIDEOPORT_LCL;
typedef struct _DDRAWI_DDMOTIONCOMP_INT *LPDDRAWI_DDMOTIONCOMP_INT;
typedef struct _DDRAWI_DDMOTIONCOMP_LCL *LPDDRAWI_DDMOTIONCOMP_LCL;

/*****************************************************************************
 * driver->ddraw callbacks
 */
typedef BOOL    (DDAPI *LPDDHAL_SETINFO)(LPDDHALINFO lpDDHalInfo, BOOL reset);
typedef FLATPTR (DDAPI *LPDDHAL_VIDMEMALLOC)(LPDDRAWI_DIRECTDRAW_GBL lpDD, int heap, DWORD dwWidth, DWORD dwHeight);
typedef void    (DDAPI *LPDDHAL_VIDMEMFREE)(LPDDRAWI_DIRECTDRAW_GBL lpDD, int heap, FLATPTR fpMem);

typedef struct {
  DWORD dwSize;
  LPDDHAL_SETINFO lpSetInfo;
  LPDDHAL_VIDMEMALLOC lpVidMemAlloc;
  LPDDHAL_VIDMEMFREE lpVidMemFree;
} DDHALDDRAWFNS, *LPDDHALDDRAWFNS;

/*****************************************************************************
 * mode info structure
 */
typedef struct _DDHALMODEINFO {
  DWORD dwWidth;
  DWORD dwHeight;
  LONG lPitch;
  DWORD dwBPP;
  WORD wFlags;
  WORD wRefreshRate;
  DWORD dwRBitMask;
  DWORD dwGBitMask;
  DWORD dwBBitMask;
  DWORD dwAlphaBitMask;
} DDHALMODEINFO, *LPDDHALMODEINFO;

#define DDMODEINFO_PALETTIZED  0x0001
#define DDMODEINFO_MODEX       0x0002
#define DDMODEINFO_UNSUPPORTED 0x0004
#define DDMODEINFO_STANDARDVGA 0x0008
#define DDMODEINFO_MAXREFRESH  0x0010
#define DDMODEINFO_STEREO      0x0020

/*****************************************************************************
 * video memory info structure
 */
typedef struct _VIDMEM {
    DWORD dwFlags;
    FLATPTR fpStart;
    __GNU_EXTENSION union {
 FLATPTR fpEnd;
 DWORD dwWidth;
    };
    DDSCAPS ddsCaps;
    DDSCAPS ddsCapsAlt;
    __GNU_EXTENSION union {
 LPVMEMHEAP lpHeap;
 DWORD dwHeight;
    };
} VIDMEM;

#define VIDMEM_ISLINEAR                       0x00000001l
#define VIDMEM_ISRECTANGULAR                  0x00000002l
#define VIDMEM_ISHEAP                         0x00000004l
#define VIDMEM_ISNONLOCAL                     0x00000008l
#define VIDMEM_ISWC                           0x00000010l
#define VIDMEM_HEAPDISABLED                   0x00000020l

typedef struct _VIDMEMINFO {
    FLATPTR fpPrimary;
    DWORD dwFlags;
    DWORD dwDisplayWidth;
    DWORD dwDisplayHeight;
    LONG lDisplayPitch;
    DDPIXELFORMAT ddpfDisplay;
    DWORD dwOffscreenAlign;
    DWORD dwOverlayAlign;
    DWORD dwTextureAlign;
    DWORD dwZBufferAlign;
    DWORD dwAlphaAlign;
    DWORD dwNumHeaps;
    LPVIDMEM pvmList;
} VIDMEMINFO, *LPVIDMEMINFO;

typedef struct _HEAPALIAS {
  FLATPTR fpVidMem;
  LPVOID lpAlias;
  DWORD dwAliasSize;
} HEAPALIAS, *LPHEAPALIAS;

typedef struct _HEAPALIASINFO {
  DWORD dwRefCnt;
  DWORD dwFlags;
  DWORD dwNumHeaps;
  LPHEAPALIAS lpAliases;
} HEAPALIASINFO, *LPHEAPALIASINFO;

#define HEAPALIASINFO_MAPPEDREAL  0x00000001
#define HEAPALIASINFO_MAPPEDDUMMY 0x00000002

/*****************************************************************************
 * capabilities structures
 */
typedef struct _DDCORECAPS {
  DWORD dwSize;
  DWORD dwCaps;
  DWORD dwCaps2;
  DWORD dwCKeyCaps;
  DWORD dwFXCaps;
  DWORD dwFXAlphaCaps;
  DWORD dwPalCaps;
  DWORD dwSVCaps;
  DWORD dwAlphaBltConstBitDepths;
  DWORD dwAlphaBltPixelBitDepths;
  DWORD dwAlphaBltSurfaceBitDepths;
  DWORD dwAlphaOverlayConstBitDepths;
  DWORD dwAlphaOverlayPixelBitDepths;
  DWORD dwAlphaOverlaySurfaceBitDepths;
  DWORD dwZBufferBitDepths;
  DWORD dwVidMemTotal;
  DWORD dwVidMemFree;
  DWORD dwMaxVisibleOverlays;
  DWORD dwCurrVisibleOverlays;
  DWORD dwNumFourCCCodes;
  DWORD dwAlignBoundarySrc;
  DWORD dwAlignSizeSrc;
  DWORD dwAlignBoundaryDest;
  DWORD dwAlignSizeDest;
  DWORD dwAlignStrideAlign;
  DWORD dwRops[DD_ROP_SPACE];
  DDSCAPS ddsCaps;
  DWORD dwMinOverlayStretch;
  DWORD dwMaxOverlayStretch;
  DWORD dwMinLiveVideoStretch;
  DWORD dwMaxLiveVideoStretch;
  DWORD dwMinHwCodecStretch;
  DWORD dwMaxHwCodecStretch;
  DWORD dwReserved1;
  DWORD dwReserved2;
  DWORD dwReserved3;
  DWORD dwSVBCaps;
  DWORD dwSVBCKeyCaps;
  DWORD dwSVBFXCaps;
  DWORD dwSVBRops[DD_ROP_SPACE];
  DWORD dwVSBCaps;
  DWORD dwVSBCKeyCaps;
  DWORD dwVSBFXCaps;
  DWORD dwVSBRops[DD_ROP_SPACE];
  DWORD dwSSBCaps;
  DWORD dwSSBCKeyCaps;
  DWORD dwSSBFXCaps;
  DWORD dwSSBRops[DD_ROP_SPACE];
  DWORD dwMaxVideoPorts;
  DWORD dwCurrVideoPorts;
  DWORD dwSVBCaps2;
} DDCORECAPS, *LPDDCORECAPS;

typedef struct _DDNONLOCALVIDMEMCAPS {
  DWORD dwSize;
  DWORD dwNLVBCaps;
  DWORD dwNLVBCaps2;
  DWORD dwNLVBCKeyCaps;
  DWORD dwNLVBFXCaps;
  DWORD dwNLVBRops[DD_ROP_SPACE];
} DDNONLOCALVIDMEMCAPS, *LPDDNONLOCALVIDMEMCAPS;

#define DDSCAPS_EXECUTEBUFFER  DDSCAPS_RESERVED2
#define DDSCAPS2_VERTEXBUFFER  DDSCAPS2_RESERVED1
#define DDSCAPS2_COMMANDBUFFER DDSCAPS2_RESERVED2

/*****************************************************************************
 * ddraw->driver callbacks
 */
#define DDHAL_DRIVER_NOTHANDLED               0x00000000l
#define DDHAL_DRIVER_HANDLED                  0x00000001l
#define DDHAL_DRIVER_NOCKEYHW                 0x00000002l

typedef struct _DDHAL_DESTROYDRIVERDATA *LPDDHAL_DESTROYDRIVERDATA;
typedef struct _DDHAL_CREATESURFACEDATA *LPDDHAL_CREATESURFACEDATA;
typedef struct _DDHAL_DRVSETCOLORKEYDATA *LPDDHAL_DRVSETCOLORKEYDATA;
typedef struct _DDHAL_SETMODEDATA *LPDDHAL_SETMODEDATA;
typedef struct _DDHAL_WAITFORVERTICALBLANKDATA *LPDDHAL_WAITFORVERTICALBLANKDATA;
typedef struct _DDHAL_CANCREATESURFACEDATA *LPDDHAL_CANCREATESURFACEDATA;
typedef struct _DDHAL_CREATEPALETTEDATA *LPDDHAL_CREATEPALETTEDATA;
typedef struct _DDHAL_GETSCANLINEDATA *LPDDHAL_GETSCANLINEDATA;
typedef struct _DDHAL_SETEXCLUSIVEMODEDATA *LPDDHAL_SETEXCLUSIVEMODEDATA;
typedef struct _DDHAL_FLIPTOGDISURFACEDATA *LPDDHAL_FLIPTOGDISURFACEDATA;

typedef DWORD (PASCAL *LPDDHAL_DESTROYDRIVER)       (LPDDHAL_DESTROYDRIVERDATA);
typedef DWORD (PASCAL *LPDDHAL_CREATESURFACE)       (LPDDHAL_CREATESURFACEDATA);
typedef DWORD (PASCAL *LPDDHAL_SETCOLORKEY)         (LPDDHAL_DRVSETCOLORKEYDATA);
typedef DWORD (PASCAL *LPDDHAL_SETMODE)             (LPDDHAL_SETMODEDATA);
typedef DWORD (PASCAL *LPDDHAL_WAITFORVERTICALBLANK)(LPDDHAL_WAITFORVERTICALBLANKDATA);
typedef DWORD (PASCAL *LPDDHAL_CANCREATESURFACE)    (LPDDHAL_CANCREATESURFACEDATA );
typedef DWORD (PASCAL *LPDDHAL_CREATEPALETTE)       (LPDDHAL_CREATEPALETTEDATA);
typedef DWORD (PASCAL *LPDDHAL_GETSCANLINE)         (LPDDHAL_GETSCANLINEDATA);
typedef DWORD (PASCAL *LPDDHAL_SETEXCLUSIVEMODE)    (LPDDHAL_SETEXCLUSIVEMODEDATA);
typedef DWORD (PASCAL *LPDDHAL_FLIPTOGDISURFACE)    (LPDDHAL_FLIPTOGDISURFACEDATA);

typedef struct _DDHAL_DDCALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHAL_DESTROYDRIVER DestroyDriver;
  LPDDHAL_CREATESURFACE CreateSurface;
  LPDDHAL_SETCOLORKEY SetColorKey;
  LPDDHAL_SETMODE SetMode;
  LPDDHAL_WAITFORVERTICALBLANK WaitForVerticalBlank;
  LPDDHAL_CANCREATESURFACE CanCreateSurface;
  LPDDHAL_CREATEPALETTE CreatePalette;
  LPDDHAL_GETSCANLINE GetScanLine;
  /* DirectX 2 */
  LPDDHAL_SETEXCLUSIVEMODE SetExclusiveMode;
  LPDDHAL_FLIPTOGDISURFACE FlipToGDISurface;
} DDHAL_DDCALLBACKS, *LPDDHAL_DDCALLBACKS;

typedef struct _DDHAL_DESTROYSURFACEDATA *LPDDHAL_DESTROYSURFACEDATA;
typedef struct _DDHAL_FLIPDATA *LPDDHAL_FLIPDATA;
typedef struct _DDHAL_SETCLIPLISTDATA *LPDDHAL_SETCLIPLISTDATA;
typedef struct _DDHAL_LOCKDATA *LPDDHAL_LOCKDATA;
typedef struct _DDHAL_UNLOCKDATA *LPDDHAL_UNLOCKDATA;
typedef struct _DDHAL_BLTDATA *LPDDHAL_BLTDATA;
typedef struct _DDHAL_SETCOLORKEYDATA *LPDDHAL_SETCOLORKEYDATA;
typedef struct _DDHAL_ADDATTACHEDSURFACEDATA *LPDDHAL_ADDATTACHEDSURFACEDATA;
typedef struct _DDHAL_GETBLTSTATUSDATA *LPDDHAL_GETBLTSTATUSDATA;
typedef struct _DDHAL_GETFLIPSTATUSDATA *LPDDHAL_GETFLIPSTATUSDATA;
typedef struct _DDHAL_UPDATEOVERLAYDATA *LPDDHAL_UPDATEOVERLAYDATA;
typedef struct _DDHAL_SETOVERLAYPOSITIONDATA *LPDDHAL_SETOVERLAYPOSITIONDATA;
typedef struct _DDHAL_SETPALETTEDATA *LPDDHAL_SETPALETTEDATA;

typedef DWORD (PASCAL *LPDDHALSURFCB_DESTROYSURFACE) (LPDDHAL_DESTROYSURFACEDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_FLIP) (LPDDHAL_FLIPDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_SETCLIPLIST) (LPDDHAL_SETCLIPLISTDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_LOCK) (LPDDHAL_LOCKDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_UNLOCK) (LPDDHAL_UNLOCKDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_BLT) (LPDDHAL_BLTDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_SETCOLORKEY) (LPDDHAL_SETCOLORKEYDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_ADDATTACHEDSURFACE)(LPDDHAL_ADDATTACHEDSURFACEDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_GETBLTSTATUS) (LPDDHAL_GETBLTSTATUSDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_GETFLIPSTATUS) (LPDDHAL_GETFLIPSTATUSDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_UPDATEOVERLAY) (LPDDHAL_UPDATEOVERLAYDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_SETOVERLAYPOSITION)(LPDDHAL_SETOVERLAYPOSITIONDATA);
typedef DWORD (PASCAL *LPDDHALSURFCB_SETPALETTE) (LPDDHAL_SETPALETTEDATA);

typedef struct _DDHAL_DDSURFACECALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHALSURFCB_DESTROYSURFACE DestroySurface;
  LPDDHALSURFCB_FLIP Flip;
  LPDDHALSURFCB_SETCLIPLIST SetClipList;
  LPDDHALSURFCB_LOCK Lock;
  LPDDHALSURFCB_UNLOCK Unlock;
  LPDDHALSURFCB_BLT Blt;
  LPDDHALSURFCB_SETCOLORKEY SetColorKey;
  LPDDHALSURFCB_ADDATTACHEDSURFACE AddAttachedSurface;
  LPDDHALSURFCB_GETBLTSTATUS GetBltStatus;
  LPDDHALSURFCB_GETFLIPSTATUS GetFlipStatus;
  LPDDHALSURFCB_UPDATEOVERLAY UpdateOverlay;
  LPDDHALSURFCB_SETOVERLAYPOSITION SetOverlayPosition;
  LPVOID reserved4;
  LPDDHALSURFCB_SETPALETTE SetPalette;
} DDHAL_DDSURFACECALLBACKS, *LPDDHAL_DDSURFACECALLBACKS;

typedef struct _DDHAL_DESTROYPALETTEDATA *LPDDHAL_DESTROYPALETTEDATA;
typedef struct _DDHAL_SETENTRIESDATA *LPDDHAL_SETENTRIESDATA;

typedef DWORD (PASCAL *LPDDHALPALCB_DESTROYPALETTE) (LPDDHAL_DESTROYPALETTEDATA);
typedef DWORD (PASCAL *LPDDHALPALCB_SETENTRIES) (LPDDHAL_SETENTRIESDATA);

typedef struct _DDHAL_DDPALETTECALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHALPALCB_DESTROYPALETTE DestroyPalette;
  LPDDHALPALCB_SETENTRIES SetEntries;
} DDHAL_DDPALETTECALLBACKS, *LPDDHAL_DDPALETTECALLBACKS;

typedef DWORD (PASCAL *LPDDHALEXEBUFCB_CANCREATEEXEBUF) (LPDDHAL_CANCREATESURFACEDATA);
typedef DWORD (PASCAL *LPDDHALEXEBUFCB_CREATEEXEBUF) (LPDDHAL_CREATESURFACEDATA);
typedef DWORD (PASCAL *LPDDHALEXEBUFCB_DESTROYEXEBUF) (LPDDHAL_DESTROYSURFACEDATA);
typedef DWORD (PASCAL *LPDDHALEXEBUFCB_LOCKEXEBUF) (LPDDHAL_LOCKDATA);
typedef DWORD (PASCAL *LPDDHALEXEBUFCB_UNLOCKEXEBUF) (LPDDHAL_UNLOCKDATA);

typedef struct _DDHAL_DDEXEBUFCALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHALEXEBUFCB_CANCREATEEXEBUF CanCreateExecuteBuffer;
  LPDDHALEXEBUFCB_CREATEEXEBUF CreateExecuteBuffer;
  LPDDHALEXEBUFCB_DESTROYEXEBUF DestroyExecuteBuffer;
  LPDDHALEXEBUFCB_LOCKEXEBUF LockExecuteBuffer;
  LPDDHALEXEBUFCB_UNLOCKEXEBUF UnlockExecuteBuffer;
} DDHAL_DDEXEBUFCALLBACKS, *LPDDHAL_DDEXEBUFCALLBACKS;

typedef struct _DDHAL_GETAVAILDRIVERMEMORYDATA *LPDDHAL_GETAVAILDRIVERMEMORYDATA;
typedef struct _DDHAL_UPDATENONLOCALHEAPDATA *LPDDHAL_UPDATENONLOCALHEAPDATA;
typedef struct _DDHAL_GETHEAPALIGNMENTDATA *LPDDHAL_GETHEAPALIGNMENTDATA;

typedef DWORD (PASCAL *LPDDHAL_GETAVAILDRIVERMEMORY)(LPDDHAL_GETAVAILDRIVERMEMORYDATA);
typedef DWORD (PASCAL *LPDDHAL_UPDATENONLOCALHEAP)  (LPDDHAL_UPDATENONLOCALHEAPDATA);
typedef DWORD (PASCAL *LPDDHAL_GETHEAPALIGNMENT)    (LPDDHAL_GETHEAPALIGNMENTDATA);

typedef struct _DDHAL_DDMISCELLANEOUSCALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHAL_GETAVAILDRIVERMEMORY GetAvailDriverMemory;
  LPDDHAL_UPDATENONLOCALHEAP UpdateNonLocalHeap;
  LPDDHAL_GETHEAPALIGNMENT GetHeapAlignment;
  LPDDHALSURFCB_GETBLTSTATUS GetSysmemBltStatus;
} DDHAL_DDMISCELLANEOUSCALLBACKS, *LPDDHAL_DDMISCELLANEOUSCALLBACKS;

typedef struct _DDHAL_CREATESURFACEEXDATA *LPDDHAL_CREATESURFACEEXDATA;
typedef struct _DDHAL_GETDRIVERSTATEDATA *LPDDHAL_GETDRIVERSTATEDATA;
typedef struct _DDHAL_DESTROYDDLOCALDATA *LPDDHAL_DESTROYDDLOCALDATA;

typedef DWORD (PASCAL *LPDDHAL_CREATESURFACEEX)(LPDDHAL_CREATESURFACEEXDATA);
typedef DWORD (PASCAL *LPDDHAL_GETDRIVERSTATE) (LPDDHAL_GETDRIVERSTATEDATA);
typedef DWORD (PASCAL *LPDDHAL_DESTROYDDLOCAL) (LPDDHAL_DESTROYDDLOCALDATA);

typedef struct _DDHAL_DDMISCELLANEOUS2CALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPVOID Reserved;
  LPDDHAL_CREATESURFACEEX CreateSurfaceEx;
  LPDDHAL_GETDRIVERSTATE GetDriverState;
  LPDDHAL_DESTROYDDLOCAL DestroyDDLocal;
} DDHAL_DDMISCELLANEOUS2CALLBACKS, *LPDDHAL_DDMISCELLANEOUS2CALLBACKS;

typedef struct _DDHAL_CANCREATEVPORTDATA       *LPDDHAL_CANCREATEVPORTDATA;
typedef struct _DDHAL_CREATEVPORTDATA          *LPDDHAL_CREATEVPORTDATA;
typedef struct _DDHAL_FLIPVPORTDATA            *LPDDHAL_FLIPVPORTDATA;
typedef struct _DDHAL_GETVPORTCONNECTDATA      *LPDDHAL_GETVPORTCONNECTDATA;
typedef struct _DDHAL_GETVPORTBANDWIDTHDATA    *LPDDHAL_GETVPORTBANDWIDTHDATA;
typedef struct _DDHAL_GETVPORTINPUTFORMATDATA  *LPDDHAL_GETVPORTINPUTFORMATDATA;
typedef struct _DDHAL_GETVPORTOUTPUTFORMATDATA *LPDDHAL_GETVPORTOUTPUTFORMATDATA;
typedef struct _DDHAL_GETVPORTFIELDDATA        *LPDDHAL_GETVPORTFIELDDATA;
typedef struct _DDHAL_GETVPORTLINEDATA         *LPDDHAL_GETVPORTLINEDATA;
typedef struct _DDHAL_DESTROYVPORTDATA         *LPDDHAL_DESTROYVPORTDATA;
typedef struct _DDHAL_GETVPORTFLIPSTATUSDATA   *LPDDHAL_GETVPORTFLIPSTATUSDATA;
typedef struct _DDHAL_UPDATEVPORTDATA          *LPDDHAL_UPDATEVPORTDATA;
typedef struct _DDHAL_WAITFORVPORTSYNCDATA     *LPDDHAL_WAITFORVPORTSYNCDATA;
typedef struct _DDHAL_GETVPORTSIGNALDATA       *LPDDHAL_GETVPORTSIGNALDATA;
typedef struct _DDHAL_VPORTCOLORDATA           *LPDDHAL_VPORTCOLORDATA;

typedef DWORD (PASCAL *LPDDHALVPORTCB_CANCREATEVIDEOPORT)(LPDDHAL_CANCREATEVPORTDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_CREATEVIDEOPORT)(LPDDHAL_CREATEVPORTDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_FLIP)(LPDDHAL_FLIPVPORTDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETBANDWIDTH)(LPDDHAL_GETVPORTBANDWIDTHDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETINPUTFORMATS)(LPDDHAL_GETVPORTINPUTFORMATDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETOUTPUTFORMATS)(LPDDHAL_GETVPORTOUTPUTFORMATDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETFIELD)(LPDDHAL_GETVPORTFIELDDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETLINE)(LPDDHAL_GETVPORTLINEDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETVPORTCONNECT)(LPDDHAL_GETVPORTCONNECTDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_DESTROYVPORT)(LPDDHAL_DESTROYVPORTDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETFLIPSTATUS)(LPDDHAL_GETVPORTFLIPSTATUSDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_UPDATE)(LPDDHAL_UPDATEVPORTDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_WAITFORSYNC)(LPDDHAL_WAITFORVPORTSYNCDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_GETSIGNALSTATUS)(LPDDHAL_GETVPORTSIGNALDATA);
typedef DWORD (PASCAL *LPDDHALVPORTCB_COLORCONTROL)(LPDDHAL_VPORTCOLORDATA);

typedef struct _DDHAL_DDVIDEOPORTCALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHALVPORTCB_CANCREATEVIDEOPORT CanCreateVideoPort;
  LPDDHALVPORTCB_CREATEVIDEOPORT CreateVideoPort;
  LPDDHALVPORTCB_FLIP FlipVideoPort;
  LPDDHALVPORTCB_GETBANDWIDTH GetVideoPortBandwidth;
  LPDDHALVPORTCB_GETINPUTFORMATS GetVideoPortInputFormats;
  LPDDHALVPORTCB_GETOUTPUTFORMATS GetVideoPortOutputFormats;
  LPVOID lpReserved1;
  LPDDHALVPORTCB_GETFIELD GetVideoPortField;
  LPDDHALVPORTCB_GETLINE GetVideoPortLine;
  LPDDHALVPORTCB_GETVPORTCONNECT GetVideoPortConnectInfo;
  LPDDHALVPORTCB_DESTROYVPORT DestroyVideoPort;
  LPDDHALVPORTCB_GETFLIPSTATUS GetVideoPortFlipStatus;
  LPDDHALVPORTCB_UPDATE UpdateVideoPort;
  LPDDHALVPORTCB_WAITFORSYNC WaitForVideoPortSync;
  LPDDHALVPORTCB_GETSIGNALSTATUS GetVideoSignalStatus;
  LPDDHALVPORTCB_COLORCONTROL ColorControl;
} DDHAL_DDVIDEOPORTCALLBACKS;

typedef struct _DDHAL_COLORCONTROLDATA *LPDDHAL_COLORCONTROLDATA;

typedef DWORD (PASCAL *LPDDHALCOLORCB_COLORCONTROL)(LPDDHAL_COLORCONTROLDATA);

typedef struct _DDHAL_DDCOLORCONTROLCALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHALCOLORCB_COLORCONTROL ColorControl;
} DDHAL_DDCOLORCONTROLCALLBACKS;

typedef struct _DDHAL_SYNCSURFACEDATA   *LPDDHAL_SYNCSURFACEDATA;
typedef struct _DDHAL_SYNCVIDEOPORTDATA *LPDDHAL_SYNCVIDEOPORTDATA;

typedef DWORD (PASCAL *LPDDHALKERNELCB_SYNCSURFACE)(LPDDHAL_SYNCSURFACEDATA);
typedef DWORD (PASCAL *LPDDHALKERNELCB_SYNCVIDEOPORT)(LPDDHAL_SYNCVIDEOPORTDATA);

typedef struct _DDHAL_DDKERNELCALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHALKERNELCB_SYNCSURFACE SyncSurfaceData;
  LPDDHALKERNELCB_SYNCVIDEOPORT SyncVideoPortData;
} DDHAL_DDKERNELCALLBACKS, *LPDDHAL_DDKERNELCALLBACKS;

typedef struct _DDHAL_GETMOCOMPGUIDSDATA *LPDDHAL_GETMOCOMPGUIDSDATA;
typedef struct _DDHAL_GETMOCOMPFORMATSDATA *LPDDHAL_GETMOCOMPFORMATSDATA;
typedef struct _DDHAL_CREATEMOCOMPDATA *LPDDHAL_CREATEMOCOMPDATA;
typedef struct _DDHAL_GETMOCOMPCOMPBUFFDATA *LPDDHAL_GETMOCOMPCOMPBUFFDATA;
typedef struct _DDHAL_GETINTERNALMOCOMPDATA *LPDDHAL_GETINTERNALMOCOMPDATA;
typedef struct _DDHAL_BEGINMOCOMPFRAMEDATA *LPDDHAL_BEGINMOCOMPFRAMEDATA;
typedef struct _DDHAL_ENDMOCOMPFRAMEDATA *LPDDHAL_ENDMOCOMPFRAMEDATA;
typedef struct _DDHAL_RENDERMOCOMPDATA *LPDDHAL_RENDERMOCOMPDATA;
typedef struct _DDHAL_QUERYMOCOMPSTATUSDATA *LPDDHAL_QUERYMOCOMPSTATUSDATA;
typedef struct _DDHAL_DESTROYMOCOMPDATA *LPDDHAL_DESTROYMOCOMPDATA;

typedef DWORD (PASCAL *LPDDHALMOCOMPCB_GETGUIDS)(LPDDHAL_GETMOCOMPGUIDSDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_GETFORMATS)(LPDDHAL_GETMOCOMPFORMATSDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_CREATE)(LPDDHAL_CREATEMOCOMPDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_GETCOMPBUFFINFO)(LPDDHAL_GETMOCOMPCOMPBUFFDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_GETINTERNALINFO)(LPDDHAL_GETINTERNALMOCOMPDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_BEGINFRAME)(LPDDHAL_BEGINMOCOMPFRAMEDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_ENDFRAME)(LPDDHAL_ENDMOCOMPFRAMEDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_RENDER)(LPDDHAL_RENDERMOCOMPDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_QUERYSTATUS)(LPDDHAL_QUERYMOCOMPSTATUSDATA);
typedef DWORD (PASCAL *LPDDHALMOCOMPCB_DESTROY)(LPDDHAL_DESTROYMOCOMPDATA);

typedef struct _DDHAL_DDMOTIONCOMPCALLBACKS {
  DWORD dwSize;
  DWORD dwFlags;
  LPDDHALMOCOMPCB_GETGUIDS GetMoCompGuids;
  LPDDHALMOCOMPCB_GETFORMATS GetMoCompFormats;
  LPDDHALMOCOMPCB_CREATE CreateMoComp;
  LPDDHALMOCOMPCB_GETCOMPBUFFINFO GetMoCompBuffInfo;
  LPDDHALMOCOMPCB_GETINTERNALINFO GetInternalMoCompInfo;
  LPDDHALMOCOMPCB_BEGINFRAME BeginMoCompFrame;
  LPDDHALMOCOMPCB_ENDFRAME EndMoCompFrame;
  LPDDHALMOCOMPCB_RENDER RenderMoComp;
  LPDDHALMOCOMPCB_QUERYSTATUS QueryMoCompStatus;
  LPDDHALMOCOMPCB_DESTROY DestroyMoComp;
} DDHAL_DDMOTIONCOMPCALLBACKS, *LPDDHAL_DDMOTIONCOMPCALLBACKS;

typedef HRESULT (WINAPI *LPDDGAMMACALIBRATORPROC)(LPDDGAMMARAMP, LPBYTE);

/*****************************************************************************
 * driver info structure
 *
 * The HAL is queried for additional callbacks via the GetDriverInfo callback.
 */
typedef struct _DDHAL_GETDRIVERINFODATA *LPDDHAL_GETDRIVERINFODATA;
typedef DWORD (PASCAL *LPDDHAL_GETDRIVERINFO)(LPDDHAL_GETDRIVERINFODATA);

typedef struct _DDHAL_GETDRIVERINFODATA {
  DWORD dwSize;
  DWORD dwFlags;
  GUID guidInfo;
  DWORD dwExpectedSize;
  LPVOID lpvData;
  DWORD dwActualSize;
  HRESULT ddRVal;
  ULONG_PTR dwContext;
} DDHAL_GETDRIVERINFODATA;

typedef struct _DDHALINFO {
  DWORD dwSize;
  LPDDHAL_DDCALLBACKS lpDDCallbacks;
  LPDDHAL_DDSURFACECALLBACKS lpDDSurfaceCallbacks;
  LPDDHAL_DDPALETTECALLBACKS lpDDPaletteCallbacks;
  VIDMEMINFO vmiData;
  DDCORECAPS ddCaps;
  DWORD dwMonitorFrequency;
  LPDDHAL_GETDRIVERINFO GetDriverInfo;
  DWORD dwModeIndex;
  LPDWORD lpdwFourCC;
  DWORD dwNumModes;
  LPDDHALMODEINFO lpModeInfo;
  DWORD dwFlags;
  LPVOID lpPDevice;
  DWORD hInstance;
  /* DirectX 2 */
  ULONG_PTR lpD3DGlobalDriverData;
  ULONG_PTR lpD3DHALCallbacks;
  LPDDHAL_DDEXEBUFCALLBACKS lpDDExeBufCallbacks;
} DDHALINFO;

#define DDPALETTECALLBACKSSIZE sizeof(DDHAL_DDPALETTECALLBACKS)
#define DDSURFACECALLBACKSSIZE sizeof(DDHAL_DDSURFACECALLBACKS)
#define DDMISCELLANEOUSCALLBACKSSIZE sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS)
#define DDMISCELLANEOUS2CALLBACKSSIZE sizeof(DDHAL_DDMISCELLANEOUS2CALLBACKS)
#define DDEXEBUFCALLBACKSSIZE sizeof(DDHAL_DDEXEBUFCALLBACKS)
#define DDVIDEOPORTCALLBACKSSIZE sizeof(DDHAL_DDVIDEOPORTCALLBACKS)
#define DDCOLORCONTROLCALLBACKSSIZE sizeof(DDHAL_DDCOLORCONTROLCALLBACKS)
#define DDKERNELCALLBACKSSIZE sizeof(DDHAL_DDKERNELCALLBACKS)
#define DDMOTIONCOMPCALLBACKSSIZE sizeof(DDHAL_DDMOTIONCOMPCALLBACKS)

#define MAX_PALETTE_SIZE                    256

#define MAX_AUTOFLIP_BUFFERS                10
#define DDSCAPS2_INDEXBUFFER                DDSCAPS2_RESERVED3
#define DDSCAPS3_VIDEO                      DDSCAPS3_RESERVED2
#define D3DFMT_INTERNAL_D32                 71
#define D3DFMT_INTERNAL_S1D15               72
#define D3DFMT_INTERNAL_D15S1               73
#define D3DFMT_INTERNAL_S8D24               74
#define D3DFMT_INTERNAL_D24S8               75
#define D3DFMT_INTERNAL_X8D24               76
#define D3DFMT_INTERNAL_D24X8               77
#define DDHAL_PLEASEALLOC_BLOCKSIZE         0x00000002l
#define DDHAL_PLEASEALLOC_LINEARSIZE        0x00000003l

#define DDHAL_CB32_DESTROYDRIVER            0x00000001l
#define DDHAL_CB32_CREATESURFACE            0x00000002l
#define DDHAL_CB32_SETCOLORKEY              0x00000004l
#define DDHAL_CB32_SETMODE                  0x00000008l
#define DDHAL_CB32_WAITFORVERTICALBLANK     0x00000010l
#define DDHAL_CB32_CANCREATESURFACE         0x00000020l
#define DDHAL_CB32_CREATEPALETTE            0x00000040l
#define DDHAL_CB32_GETSCANLINE              0x00000080l
#define DDHAL_CB32_SETEXCLUSIVEMODE         0x00000100l
#define DDHAL_CB32_FLIPTOGDISURFACE         0x00000200l
#define DDHAL_PALCB32_DESTROYPALETTE        0x00000001l
#define DDHAL_PALCB32_SETENTRIES            0x00000002l
#define DDHALINFO_ISPRIMARYDISPLAY          0x00000001
#define DDHALINFO_MODEXILLEGAL              0x00000002
#define DDHALINFO_GETDRIVERINFOSET          0x00000004
#define DDHALINFO_GETDRIVERINFO2            0x00000008
#define DDRAWI_VPORTSTART                   0x0001
#define DDRAWI_VPORTSTOP                    0x0002
#define DDRAWI_VPORTUPDATE                  0x0003
#define DDRAWI_VPORTGETCOLOR                0x0001
#define DDRAWI_VPORTSETCOLOR                0x0002
#define DDHAL_SURFCB32_DESTROYSURFACE       0x00000001
#define DDHAL_SURFCB32_FLIP                 0x00000002
#define DDHAL_SURFCB32_SETCLIPLIST          0x00000004
#define DDHAL_SURFCB32_LOCK                 0x00000008
#define DDHAL_SURFCB32_UNLOCK               0x00000010
#define DDHAL_SURFCB32_BLT                  0x00000020
#define DDHAL_SURFCB32_SETCOLORKEY          0x00000040
#define DDHAL_SURFCB32_ADDATTACHEDSURFACE   0x00000080
#define DDHAL_SURFCB32_GETBLTSTATUS         0x00000100
#define DDHAL_SURFCB32_GETFLIPSTATUS        0x00000200
#define DDHAL_SURFCB32_UPDATEOVERLAY        0x00000400
#define DDHAL_SURFCB32_SETOVERLAYPOSITION   0x00000800
#define DDHAL_SURFCB32_RESERVED4            0x00001000
#define DDHAL_SURFCB32_SETPALETTE           0x00002000
#define DDHAL_MISCCB32_GETAVAILDRIVERMEMORY 0x00000001
#define DDHAL_MISCCB32_UPDATENONLOCALHEAP   0x00000002
#define DDHAL_MISCCB32_GETHEAPALIGNMENT     0x00000004
#define DDHAL_MISCCB32_GETSYSMEMBLTSTATUS   0x00000008
#define DDHAL_MISC2CB32_ALPHABLT            0x00000001
#define DDHAL_MISC2CB32_CREATESURFACEEX     0x00000002
#define DDHAL_MISC2CB32_GETDRIVERSTATE      0x00000004
#define DDHAL_MISC2CB32_DESTROYDDLOCAL      0x00000008
#define DDHAL_EXEBUFCB32_CANCREATEEXEBUF    0x00000001l
#define DDHAL_EXEBUFCB32_CREATEEXEBUF       0x00000002l
#define DDHAL_EXEBUFCB32_DESTROYEXEBUF      0x00000004l
#define DDHAL_EXEBUFCB32_LOCKEXEBUF         0x00000008l
#define DDHAL_EXEBUFCB32_UNLOCKEXEBUF       0x00000010l
#define DDHAL_VPORT32_CANCREATEVIDEOPORT    0x00000001
#define DDHAL_VPORT32_CREATEVIDEOPORT       0x00000002
#define DDHAL_VPORT32_FLIP                  0x00000004
#define DDHAL_VPORT32_GETBANDWIDTH          0x00000008
#define DDHAL_VPORT32_GETINPUTFORMATS       0x00000010
#define DDHAL_VPORT32_GETOUTPUTFORMATS      0x00000020
#define DDHAL_VPORT32_GETFIELD              0x00000080
#define DDHAL_VPORT32_GETLINE               0x00000100
#define DDHAL_VPORT32_GETCONNECT            0x00000200
#define DDHAL_VPORT32_DESTROY               0x00000400
#define DDHAL_VPORT32_GETFLIPSTATUS         0x00000800
#define DDHAL_VPORT32_UPDATE                0x00001000
#define DDHAL_VPORT32_WAITFORSYNC           0x00002000
#define DDHAL_VPORT32_GETSIGNALSTATUS       0x00004000
#define DDHAL_VPORT32_COLORCONTROL          0x00008000
#define DDHAL_COLOR_COLORCONTROL            0x00000001
#define DDHAL_KERNEL_SYNCSURFACEDATA        0x00000001l
#define DDHAL_KERNEL_SYNCVIDEOPORTDATA      0x00000002l
#define DDHAL_MOCOMP32_GETGUIDS             0x00000001
#define DDHAL_MOCOMP32_GETFORMATS           0x00000002
#define DDHAL_MOCOMP32_CREATE               0x00000004
#define DDHAL_MOCOMP32_GETCOMPBUFFINFO      0x00000008
#define DDHAL_MOCOMP32_GETINTERNALINFO      0x00000010
#define DDHAL_MOCOMP32_BEGINFRAME           0x00000020
#define DDHAL_MOCOMP32_ENDFRAME             0x00000040
#define DDHAL_MOCOMP32_RENDER               0x00000080
#define DDHAL_MOCOMP32_QUERYSTATUS          0x00000100
#define DDHAL_MOCOMP32_DESTROY              0x00000200

/* where the high-level ddraw implementation stores the callbacks */
typedef struct _DDHAL_CALLBACKS {
  DDHAL_DDCALLBACKS cbDDCallbacks;
  DDHAL_DDSURFACECALLBACKS cbDDSurfaceCallbacks;
  DDHAL_DDPALETTECALLBACKS cbDDPaletteCallbacks;
  DDHAL_DDCALLBACKS HALDD;
  DDHAL_DDSURFACECALLBACKS HALDDSurface;
  DDHAL_DDPALETTECALLBACKS HALDDPalette;
  DDHAL_DDCALLBACKS HELDD;
  DDHAL_DDSURFACECALLBACKS HELDDSurface;
  DDHAL_DDPALETTECALLBACKS HELDDPalette;
  DDHAL_DDEXEBUFCALLBACKS cbDDExeBufCallbacks;
  DDHAL_DDEXEBUFCALLBACKS HALDDExeBuf;
  DDHAL_DDEXEBUFCALLBACKS HELDDExeBuf;
  DDHAL_DDVIDEOPORTCALLBACKS cbDDVideoPortCallbacks;
  DDHAL_DDVIDEOPORTCALLBACKS HALDDVideoPort;
  DDHAL_DDCOLORCONTROLCALLBACKS cbDDColorControlCallbacks;
  DDHAL_DDCOLORCONTROLCALLBACKS HALDDColorControl;
  DDHAL_DDMISCELLANEOUSCALLBACKS cbDDMiscellaneousCallbacks;
  DDHAL_DDMISCELLANEOUSCALLBACKS HALDDMiscellaneous;
  DDHAL_DDKERNELCALLBACKS cbDDKernelCallbacks;
  DDHAL_DDKERNELCALLBACKS HALDDKernel;
  DDHAL_DDMOTIONCOMPCALLBACKS cbDDMotionCompCallbacks;
  DDHAL_DDMOTIONCOMPCALLBACKS HALDDMotionComp;
} DDHAL_CALLBACKS, *LPDDHAL_CALLBACKS;

/*****************************************************************************
 * parameter structures
 */
typedef struct _DDHAL_DESTROYDRIVERDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  HRESULT ddRVal;
  LPDDHAL_DESTROYDRIVER DestroyDriver;
} DDHAL_DESTROYDRIVERDATA;

typedef struct _DDHAL_SETMODEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DWORD dwModeIndex;
  HRESULT ddRVal;
  LPDDHAL_SETMODE SetMode;
  BOOL inexcl;
  BOOL useRefreshRate;
} DDHAL_SETMODEDATA;

typedef struct _DDHAL_CREATESURFACEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDSURFACEDESC lpDDSurfaceDesc;
  LPDDRAWI_DDRAWSURFACE_LCL *lplpSList;
  DWORD dwSCnt;
  HRESULT ddRVal;
  LPDDHAL_CREATESURFACE CreateSurface;
} DDHAL_CREATESURFACEDATA;

typedef struct _DDHAL_CANCREATESURFACEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDSURFACEDESC lpDDSurfaceDesc;
  DWORD bIsDifferentPixelFormat;
  HRESULT ddRVal;
  LPDDHAL_CANCREATESURFACE CanCreateSurface;
} DDHAL_CANCREATESURFACEDATA;

typedef struct _DDHAL_CREATEPALETTEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWPALETTE_GBL lpDDPalette;
  LPPALETTEENTRY lpColorTable;
  HRESULT ddRVal;
  LPDDHAL_CREATEPALETTE CreatePalette;
  BOOL is_excl;
} DDHAL_CREATEPALETTEDATA;

typedef struct _DDHAL_SETEXCLUSIVEMODEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DWORD dwEnterExcl;
  DWORD dwReserved;
  HRESULT ddRVal;
  LPDDHAL_SETEXCLUSIVEMODE SetExclusiveMode;
} DDHAL_SETEXCLUSIVEMODEDATA;

/* surfaces */
typedef struct _DDHAL_DESTROYSURFACEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  HRESULT ddRVal;
  LPDDHALSURFCB_DESTROYSURFACE DestroySurface;
} DDHAL_DESTROYSURFACEDATA;

typedef struct _DDHAL_FLIPDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurfCurr;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurfTarg;
  DWORD dwFlags;
  HRESULT ddRVal;
  LPDDHALSURFCB_FLIP Flip;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurfCurrLeft;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurfTargLeft;
} DDHAL_FLIPDATA;

typedef struct _DDHAL_LOCKDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  DWORD bHasRect;
  RECTL rArea;
  LPVOID lpSurfData;
  HRESULT ddRVal;
  LPDDHALSURFCB_LOCK Lock;
  DWORD dwFlags;
} DDHAL_LOCKDATA;

typedef struct _DDHAL_UNLOCKDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  HRESULT ddRVal;
  LPDDHALSURFCB_UNLOCK Unlock;
} DDHAL_UNLOCKDATA;

typedef struct _DDHAL_BLTDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDDestSurface;
  RECTL rDest;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSrcSurface;
  RECTL rSrc;
  DWORD dwFlags;
  DWORD dwROPFlags;
  DDBLTFX bltFX;
  HRESULT ddRVal;
  LPDDHALSURFCB_BLT Blt;
  BOOL IsClipped;
  RECTL rOrigDest;
  RECTL rOrigSrc;
  DWORD dwRectCnt;
  LPRECT prDestRects;
} DDHAL_BLTDATA;

typedef struct _DDHAL_SETPALETTEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  LPDDRAWI_DDRAWPALETTE_GBL lpDDPalette;
  HRESULT ddRVal;
  LPDDHALSURFCB_SETPALETTE SetPalette;
  BOOL Attach;
} DDHAL_SETPALETTEDATA;

/* palettes */
typedef struct _DDHAL_DESTROYPALETTEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWPALETTE_GBL lpDDPalette;
  HRESULT ddRVal;
  LPDDHALPALCB_DESTROYPALETTE DestroyPalette;
} DDHAL_DESTROYPALETTEDATA;

typedef struct _DDHAL_SETENTRIESDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWPALETTE_GBL lpDDPalette;
  DWORD dwBase;
  DWORD dwNumEntries;
  LPPALETTEENTRY lpEntries;
  HRESULT ddRVal;
  LPDDHALPALCB_SETENTRIES SetEntries;
} DDHAL_SETENTRIESDATA;

typedef struct _DDHAL_CANCREATEVPORTDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDVIDEOPORTDESC lpDDVideoPortDesc;
  HRESULT ddRVal;
  LPDDHALVPORTCB_CANCREATEVIDEOPORT CanCreateVideoPort;
} DDHAL_CANCREATEVPORTDATA;

typedef struct _DDHAL_CREATEVPORTDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDVIDEOPORTDESC lpDDVideoPortDesc;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  HRESULT ddRVal;
  LPDDHALVPORTCB_CREATEVIDEOPORT CreateVideoPort;
} DDHAL_CREATEVPORTDATA;

typedef struct _DDHAL_GETVPORTBANDWIDTHDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  LPDDPIXELFORMAT lpddpfFormat;
  DWORD dwWidth;
  DWORD dwHeight;
  DWORD dwFlags;
  LPDDVIDEOPORTBANDWIDTH lpBandwidth;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETBANDWIDTH GetVideoPortBandwidth;
} DDHAL_GETVPORTBANDWIDTHDATA;

typedef struct _DDHAL_GETVPORTINPUTFORMATDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  DWORD dwFlags;
  LPDDPIXELFORMAT lpddpfFormat;
  DWORD dwNumFormats;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETINPUTFORMATS GetVideoPortInputFormats;
} DDHAL_GETVPORTINPUTFORMATDATA;

typedef struct _DDHAL_GETVPORTFIELDDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  BOOL bField;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETFIELD GetVideoPortField;
} DDHAL_GETVPORTFIELDDATA;

typedef struct _DDHAL_GETVPORTOUTPUTFORMATDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  DWORD dwFlags;
  LPDDPIXELFORMAT lpddpfInputFormat;
  LPDDPIXELFORMAT lpddpfOutputFormats;
  DWORD dwNumFormats;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETOUTPUTFORMATS GetVideoPortOutputFormats;
} DDHAL_GETVPORTOUTPUTFORMATDATA;

typedef struct _DDHAL_GETVPORTLINEDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  DWORD dwLine;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETLINE GetVideoPortLine;
} DDHAL_GETVPORTLINEDATA;

typedef struct _DDHAL_DESTROYVPORTDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  HRESULT ddRVal;
  LPDDHALVPORTCB_DESTROYVPORT DestroyVideoPort;
} DDHAL_DESTROYVPORTDATA;

typedef struct _DDHAL_GETVPORTFLIPSTATUSDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  FLATPTR fpSurface;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETFLIPSTATUS GetVideoPortFlipStatus;
} DDHAL_GETVPORTFLIPSTATUSDATA;

typedef struct _DDHAL_UPDATEVPORTDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  LPDDRAWI_DDRAWSURFACE_INT *lplpDDSurface;
  LPDDRAWI_DDRAWSURFACE_INT *lplpDDVBISurface;
  LPDDVIDEOPORTINFO lpVideoInfo;
  DWORD dwFlags;
  DWORD dwNumAutoflip;
  DWORD dwNumVBIAutoflip;
  HRESULT ddRVal;
  LPDDHALVPORTCB_UPDATE UpdateVideoPort;
} DDHAL_UPDATEVPORTDATA;

typedef struct _DDHAL_WAITFORVPORTSYNCDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  DWORD dwFlags;
  DWORD dwLine;
  DWORD dwTimeOut;
  HRESULT ddRVal;
  LPDDHALVPORTCB_WAITFORSYNC WaitForVideoPortSync;
} DDHAL_WAITFORVPORTSYNCDATA;

typedef struct _DDHAL_GETVPORTSIGNALDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  DWORD dwStatus;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETSIGNALSTATUS GetVideoSignalStatus;
} DDHAL_GETVPORTSIGNALDATA;

typedef struct _DDHAL_VPORTCOLORDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  DWORD dwFlags;
  LPDDCOLORCONTROL lpColorData;
  HRESULT ddRVal;
  LPDDHALVPORTCB_COLORCONTROL ColorControl;
} DDHAL_VPORTCOLORDATA;

typedef struct _DDHAL_FLIPVPORTDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurfCurr;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurfTarg;
  HRESULT ddRVal;
  LPDDHALVPORTCB_FLIP FlipVideoPort;
} DDHAL_FLIPVPORTDATA;

typedef struct _DDHAL_GETVPORTCONNECTDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  DWORD dwPortId;
  LPDDVIDEOPORTCONNECT lpConnect;
  DWORD dwNumEntries;
  HRESULT ddRVal;
  LPDDHALVPORTCB_GETVPORTCONNECT GetVideoPortConnectInfo;
} DDHAL_GETVPORTCONNECTDATA;

typedef struct _DDHAL_SYNCSURFACEDATA {
  DWORD dwSize;
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  DWORD dwSurfaceOffset;
  ULONG_PTR fpLockPtr;
  LONG lPitch;
  DWORD dwOverlayOffset;
  DWORD dwOverlaySrcWidth;
  DWORD dwOverlaySrcHeight;
  DWORD dwOverlayDestWidth;
  DWORD dwOverlayDestHeight;
  ULONG_PTR dwDriverReserved1;
  ULONG_PTR dwDriverReserved2;
  ULONG_PTR dwDriverReserved3;
  HRESULT ddRVal;
} DDHAL_SYNCSURFACEDATA;

typedef struct _DDHAL_SYNCVIDEOPORTDATA {
  DWORD dwSize;
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  DWORD dwOriginOffset;
  DWORD dwHeight;
  DWORD dwVBIHeight;
  ULONG_PTR dwDriverReserved1;
  ULONG_PTR dwDriverReserved2;
  ULONG_PTR dwDriverReserved3;
  HRESULT ddRVal;
} DDHAL_SYNCVIDEOPORTDATA;

typedef struct _DDHAL_DESTROYDDLOCALDATA {
  DWORD dwFlags;
  LPDDRAWI_DIRECTDRAW_LCL pDDLcl;
  HRESULT ddRVal;
} DDHAL_DESTROYDDLOCALDATA;

typedef struct _DDHAL_CREATESURFACEEXDATA {
  DWORD dwFlags;
  LPDDRAWI_DIRECTDRAW_LCL lpDDLcl;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSLcl;
  HRESULT ddRVal;
} DDHAL_CREATESURFACEEXDATA;

typedef struct _DDHAL_GETHEAPALIGNMENTDATA {
  ULONG_PTR dwInstance;
  DWORD dwHeap;
  HRESULT ddRVal;
  LPDDHAL_GETHEAPALIGNMENT GetHeapAlignment;
  HEAPALIGNMENT Alignment;
} DDHAL_GETHEAPALIGNMENTDATA;

typedef struct _DDMORESURFACECAPS {
  DWORD dwSize;
  DDSCAPSEX ddsCapsMore;
  struct tagExtendedHeapRestrictions {
    DDSCAPSEX ddsCapsEx;
    DDSCAPSEX ddsCapsExAlt;
  } ddsExtendedHeapRestrictions[1];
} DDMORESURFACECAPS, *LPDDMORESURFACECAPS;

typedef struct _DDSTEREOMODE {
  DWORD dwSize;
  DWORD dwHeight;
  DWORD dwWidth;
  DWORD dwBpp;
  DWORD dwRefreshRate;
  BOOL bSupported;
} DDSTEREOMODE, *LPDDSTEREOMODE;

/*****************************************************************************
 * high-level ddraw implementation structures
 */
typedef struct _IUNKNOWN_LIST {
  struct _IUNKNOWN_LIST *lpLink;
  LPGUID lpGuid;
#ifndef _NO_COM
  IUnknown *lpIUnknown;
#else
  LPVOID lpIUnknown;
#endif /* _NO_COM */
} IUNKNOWN_LIST, *LPIUNKNOWN_LIST;

typedef struct _PROCESS_LIST {
  struct _PROCESS_LIST *lpLink;
  DWORD dwProcessId;
  DWORD dwRefCnt;
  DWORD dwAlphaDepth;
  DWORD dwZDepth;
} PROCESS_LIST, *LPPROCESS_LIST;

typedef struct _ATTACHLIST {
  DWORD dwFlags;
  struct _ATTACHLIST *lpLink;
  LPDDRAWI_DDRAWSURFACE_LCL lpAttached;
  LPDDRAWI_DDRAWSURFACE_INT lpIAttached;
} ATTACHLIST, *LPATTACHLIST;

#define DDAL_IMPLICIT 0x00000001

typedef struct _ACCESSRECTLIST {
  struct _ACCESSRECTLIST *lpLink;
  RECT rDest;
  LPDDRAWI_DIRECTDRAW_LCL lpOwner;
  LPVOID lpSurfaceData;
  DWORD dwFlags;
  LPHEAPALIASINFO lpHeapAliasInfo;
} ACCESSRECTLIST, *LPACCESSRECTLIST;

#define ACCESSRECT_VRAMSTYLE           0x00000001
#define ACCESSRECT_NOTHOLDINGWIN16LOCK 0x00000002
#define ACCESSRECT_BROKEN              0x00000004

typedef struct _DBLNODE {
  struct _DBLNODE *next;
  struct _DBLNODE *prev;
  LPDDRAWI_DDRAWSURFACE_LCL object;
  LPDDRAWI_DDRAWSURFACE_INT object_int;
} DBLNODE, *LPDBLNODE;

typedef struct _DDRAWI_DIRECTDRAW_INT {
  LPVOID lpVtbl;
  LPDDRAWI_DIRECTDRAW_LCL lpLcl;
  LPDDRAWI_DIRECTDRAW_INT lpLink;
  DWORD dwIntRefCnt;
} DDRAWI_DIRECTDRAW_INT;

typedef struct _DDRAWI_DIRECTDRAW_LCL {
  DWORD lpDDMore;
  LPDDRAWI_DIRECTDRAW_GBL lpGbl;
  DWORD dwUnused0;
  DWORD dwLocalFlags;
  DWORD dwLocalRefCnt;
  DWORD dwProcessId;
#ifndef _NO_COM
  IUnknown *pUnkOuter;
#else
  PVOID pUnkOuter;
#endif
  DWORD dwObsolete1;
  ULONG_PTR hWnd;
  ULONG_PTR hDC;
  DWORD dwErrorMode;
  LPDDRAWI_DDRAWSURFACE_INT lpPrimary;
  LPDDRAWI_DDRAWSURFACE_INT lpCB;
  DWORD dwPreferredMode;
  /* DirectX 2 */
  HINSTANCE hD3DInstance;
#ifndef _NO_COM
  IUnknown *pD3DIUnknown;
#else
  PVOID pD3DIUnknown;
#endif
  LPDDHAL_CALLBACKS lpDDCB;
  ULONG_PTR hDDVxd;
  /* DirectX 5.0 */
  DWORD dwAppHackFlags;
  /* DirectX 5.0A */
  ULONG_PTR hFocusWnd;
  DWORD dwHotTracking;
  DWORD dwIMEState;
  /* DirectX 6.0 */
  ULONG_PTR hWndPopup;
  ULONG_PTR hDD;
  ULONG_PTR hGammaCalibrator;
  LPDDGAMMACALIBRATORPROC lpGammaCalibrator;
} DDRAWI_DIRECTDRAW_LCL;

#define DDRAWILCL_HASEXCLUSIVEMODE    0x00000001
#define DDRAWILCL_ISFULLSCREEN        0x00000002
#define DDRAWILCL_SETCOOPCALLED       0x00000004
#define DDRAWILCL_ACTIVEYES           0x00000008
#define DDRAWILCL_ACTIVENO            0x00000010
#define DDRAWILCL_HOOKEDHWND          0x00000020
#define DDRAWILCL_ALLOWMODEX          0x00000040
#define DDRAWILCL_V1SCLBEHAVIOUR      0x00000080
#define DDRAWILCL_MODEHASBEENCHANGED  0x00000100
#define DDRAWILCL_CREATEDWINDOW       0x00000200
#define DDRAWILCL_DIRTYDC             0x00000400
#define DDRAWILCL_DISABLEINACTIVATE   0x00000800
#define DDRAWILCL_CURSORCLIPPED       0x00001000
#define DDRAWILCL_EXPLICITMONITOR     0x00002000
#define DDRAWILCL_MULTITHREADED       0x00004000
#define DDRAWILCL_FPUSETUP            0x00008000
#define DDRAWILCL_POWEREDDOWN         0x00010000
#define DDRAWILCL_DIRECTDRAW7         0x00020000
#define DDRAWILCL_ATTEMPTEDD3DCONTEXT 0x00040000
#define DDRAWILCL_FPUPRESERVE         0x00080000
#define DDRAWILCL_DX8DRIVER           0x00100000
#define DDRAWILCL_DIRECTDRAW8         0x00200000

typedef struct _DDRAWI_DIRECTDRAW_GBL {
  DWORD dwRefCnt;
  DWORD dwFlags;
  FLATPTR fpPrimaryOrig;
  DDCORECAPS ddCaps;
  DWORD dwInternal1;
  DWORD dwUnused1[9];
  LPDDHAL_CALLBACKS lpDDCBtmp;
  LPDDRAWI_DDRAWSURFACE_INT dsList;
  LPDDRAWI_DDRAWPALETTE_INT palList;
  LPDDRAWI_DDRAWCLIPPER_INT clipperList;
  LPDDRAWI_DIRECTDRAW_GBL lp16DD;
  DWORD dwMaxOverlays;
  DWORD dwCurrOverlays;
  DWORD dwMonitorFrequency;
  DDCORECAPS ddHELCaps;
  DWORD dwUnused2[50];
  DDCOLORKEY ddckCKDestOverlay;
  DDCOLORKEY ddckCKSrcOverlay;
  VIDMEMINFO vmiData;
  LPVOID lpDriverHandle;
  LPDDRAWI_DIRECTDRAW_LCL lpExclusiveOwner;
  DWORD dwModeIndex;
  DWORD dwModeIndexOrig;
  DWORD dwNumFourCC;
  LPDWORD lpdwFourCC;
  DWORD dwNumModes;
  LPDDHALMODEINFO lpModeInfo;
  PROCESS_LIST plProcessList;
  DWORD dwSurfaceLockCount;
  DWORD dwAliasedLockCnt;
  ULONG_PTR dwReserved3;
  ULONG_PTR hDD;
  char cObsolete[12];
  DWORD dwReserved1;
  DWORD dwReserved2;
  DBLNODE dbnOverlayRoot;
  volatile LPWORD lpwPDeviceFlags;
  DWORD dwPDevice;
  DWORD dwWin16LockCnt;
  DWORD dwUnused3;
  DWORD hInstance;
  DWORD dwEvent16;
  DWORD dwSaveNumModes;
  /* DirectX 2 */
  ULONG_PTR lpD3DGlobalDriverData;
  ULONG_PTR lpD3DHALCallbacks;
  DDCORECAPS ddBothCaps;
  /* DirectX 5.0 */
  LPDDVIDEOPORTCAPS lpDDVideoPortCaps;
  LPDDRAWI_DDVIDEOPORT_INT dvpList;
  ULONG_PTR lpD3DHALCallbacks2;
  RECT rectDevice;
  DWORD cMonitors;
  LPVOID gpbmiSrc;
  LPVOID gpbmiDest;
  LPHEAPALIASINFO phaiHeapAliases;
  ULONG_PTR hKernelHandle;
  ULONG_PTR pfnNotifyProc;
  LPDDKERNELCAPS lpDDKernelCaps;
  LPDDNONLOCALVIDMEMCAPS lpddNLVCaps;
  LPDDNONLOCALVIDMEMCAPS lpddNLVHELCaps;
  LPDDNONLOCALVIDMEMCAPS lpddNLVBothCaps;
  ULONG_PTR lpD3DExtendedCaps;
  /* DirectX 5.0A */
  DWORD dwDOSBoxEvent;
  RECT rectDesktop;
  char cDriverName[MAX_DRIVER_NAME];
  /* DirectX 6.0 */
  ULONG_PTR lpD3DHALCallbacks3;
  DWORD dwNumZPixelFormats;
  LPDDPIXELFORMAT lpZPixelFormats;
  LPDDRAWI_DDMOTIONCOMP_INT mcList;
  DWORD hDDVxd;
  DDSCAPSEX ddsCapsMore;
} DDRAWI_DIRECTDRAW_GBL;

#define DDRAWI_xxxxxxxxx1              0x00000001
#define DDRAWI_xxxxxxxxx2              0x00000002
#define DDRAWI_VIRTUALDESKTOP          0x00000008
#define DDRAWI_MODEX                   0x00000010
#define DDRAWI_DISPLAYDRV              0x00000020
#define DDRAWI_FULLSCREEN              0x00000040
#define DDRAWI_MODECHANGED             0x00000080
#define DDRAWI_NOHARDWARE              0x00000100
#define DDRAWI_PALETTEINIT             0x00000200
#define DDRAWI_NOEMULATION             0x00000400
#define DDRAWI_HASCKEYDESTOVERLAY      0x00000800
#define DDRAWI_HASCKEYSRCOVERLAY       0x00001000
#define DDRAWI_HASGDIPALETTE           0x00002000
#define DDRAWI_EMULATIONINITIALIZED    0x00004000
#define DDRAWI_HASGDIPALETTE_EXCLUSIVE 0x00008000
#define DDRAWI_MODEXILLEGAL            0x00010000
#define DDRAWI_FLIPPEDTOGDI            0x00020000
#define DDRAWI_NEEDSWIN16FORVRAMLOCK   0x00040000
#define DDRAWI_PDEVICEVRAMBITCLEARED   0x00080000
#define DDRAWI_STANDARDVGA             0x00100000
#define DDRAWI_EXTENDEDALIGNMENT       0x00200000
#define DDRAWI_CHANGINGMODE            0x00400000
#define DDRAWI_GDIDRV                  0x00800000
#define DDRAWI_ATTACHEDTODESKTOP       0x01000000
#define DDRAWI_UMODELOADED             0x02000000
#define DDRAWI_DDRAWDATANOTFETCHED     0x04000000
#define DDRAWI_SECONDARYDRIVERLOADED   0x08000000
#define DDRAWI_TESTINGMODES            0x10000000
#define DDRAWI_DRIVERINFO2             0x20000000
#define DDRAWI_BADPDEV                 0x40000000

/* surfaces */
typedef struct _DDRAWI_DDRAWSURFACE_INT {
  LPVOID lpVtbl;
  LPDDRAWI_DDRAWSURFACE_LCL lpLcl;
  LPDDRAWI_DDRAWSURFACE_INT lpLink;
  DWORD dwIntRefCnt;
} DDRAWI_DDRAWSURFACE_INT;

typedef struct _DDRAWI_DDRAWSURFACE_GBL {
  DWORD dwRefCnt;
  DWORD dwGlobalFlags;
  __GNU_EXTENSION union {
    LPACCESSRECTLIST lpRectList;
    DWORD dwBlockSizeY;
    LONG lSlicePitch;
  };
  __GNU_EXTENSION union {
    LPVMEMHEAP lpVidMemHeap;
    DWORD dwBlockSizeX;
  };
  __GNU_EXTENSION union {
    LPDDRAWI_DIRECTDRAW_GBL lpDD;
    LPVOID lpDDHandle;
  };
  FLATPTR fpVidMem;
  __GNU_EXTENSION union {
    LONG lPitch;
    DWORD dwLinearSize;
  };
  WORD wHeight;
  WORD wWidth;
  DWORD dwUsageCount;
  ULONG_PTR dwReserved1;
  DDPIXELFORMAT ddpfSurface;
} DDRAWI_DDRAWSURFACE_GBL;

#define DDRAWISURFGBL_MEMFREE                    0x00000001L
#define DDRAWISURFGBL_SYSMEMREQUESTED            0x00000002L
#define DDRAWISURFGBL_ISGDISURFACE               0x00000004L
#define DDRAWISURFGBL_SOFTWAREAUTOFLIP           0x00000008L
#define DDRAWISURFGBL_LOCKNOTHOLDINGWIN16LOCK    0x00000010L
#define DDRAWISURFGBL_LOCKVRAMSTYLE              0x00000020L
#define DDRAWISURFGBL_LOCKBROKEN                 0x00000040L
#define DDRAWISURFGBL_IMPLICITHANDLE             0x00000080L
#define DDRAWISURFGBL_ISCLIENTMEM                0x00000100L
#define DDRAWISURFGBL_HARDWAREOPSOURCE           0x00000200L
#define DDRAWISURFGBL_HARDWAREOPDEST             0x00000400L
#define DDRAWISURFGBL_HARDWAREOPSTARTED (DDRAWISURFGBL_HARDWAREOPSOURCE|DDRAWISURFGBL_HARDWAREOPDEST)
#define DDRAWISURFGBL_VPORTINTERLEAVED           0x00000800L
#define DDRAWISURFGBL_VPORTDATA                  0x00001000L
#define DDRAWISURFGBL_LATEALLOCATELINEAR         0x00002000L
#define DDRAWISURFGBL_SYSMEMEXECUTEBUFFER        0x00004000L
#define DDRAWISURFGBL_FASTLOCKHELD               0x00008000L
#define DDRAWISURFGBL_READONLYLOCKHELD           0x00010000L
#define DDRAWISURFGBL_DX8SURFACE                 0x00080000L
#define DDRAWISURFGBL_DDHELDONTFREE              0x00100000L
#define DDRAWISURFGBL_NOTIFYWHENUNLOCKED         0x00200000L
#define DDRAWISURFGBL_RESERVED0                  0x80000000L // Reserved flag

typedef struct _DDRAWI_DDRAWSURFACE_GBL_MORE {
  DWORD dwSize;
  __GNU_EXTENSION union {
    DWORD dwPhysicalPageTable;
    FLATPTR fpPhysicalVidMem;
  };
  LPDWORD pPageTable;
  DWORD cPages;
  ULONG_PTR dwSavedDCContext;
  FLATPTR fpAliasedVidMem;
  ULONG_PTR dwDriverReserved;
  ULONG_PTR dwHELReserved;
  DWORD cPageUnlocks;
  ULONG_PTR hKernelSurface;
  DWORD dwKernelRefCnt;
  LPDDCOLORCONTROL lpColorInfo;
  FLATPTR fpNTAlias;
  DWORD dwContentsStamp;
  LPVOID lpvUnswappedDriverReserved;
  LPVOID lpDDRAWReserved2;
  DWORD dwDDRAWReserved1;
  DWORD dwDDRAWReserved2;
  FLATPTR fpAliasOfVidMem;
} DDRAWI_DDRAWSURFACE_GBL_MORE;

/* the MS version of this macro was somewhat obfuscated and unreadable
 * (possibly because of mediocre MS coders)... so I simplified it...
 * (and so I commit no copyright violations either, hah) */
#define GET_LPDDRAWSURFACE_GBL_MORE(psurf_gbl) \
  (*(((LPDDRAWI_DDRAWSURFACE_GBL_MORE *)(psurf_gbl)) - 1))

#define SURFACE_PHYSICALVIDMEM( psurf_gbl ) \
  ( GET_LPDDRAWSURFACE_GBL_MORE(psurf_gbl )->fpPhysicalVidMem )

typedef struct  _DISPLAYMODEINFO {
  WORD wWidth;
  WORD wHeight;
  BYTE wBPP;
  BYTE wMonitorsAttachedToDesktop;
  WORD wRefreshRate;
} DISPLAYMODEINFO, *LPDISPLAYMODEINFO;

#define EQUAL_DISPLAYMODE ( A, B ) (0 == memcmp(&(A), &(B), sizeof (DISPLAYMODEINFO)))

typedef struct _DDRAWI_DDRAWSURFACE_MORE {
  DWORD dwSize;
  IUNKNOWN_LIST *lpIUnknowns;
  LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl;
  DWORD dwPageLockCount;
  DWORD dwBytesAllocated;
  LPDDRAWI_DIRECTDRAW_INT lpDD_int;
  DWORD dwMipMapCount;
  LPDDRAWI_DDRAWCLIPPER_INT lpDDIClipper;
  /* DirectX 5.0 */
  LPHEAPALIASINFO lpHeapAliasInfo;
  DWORD dwOverlayFlags;
  VOID *rgjunc;
  LPDDRAWI_DDVIDEOPORT_LCL lpVideoPort;
  LPDDOVERLAYFX lpddOverlayFX;
  DDSCAPSEX ddsCapsEx;
  DWORD dwTextureStage;
  LPVOID lpDDRAWReserved;
  LPVOID lpDDRAWReserved2;
  LPVOID lpDDrawReserved3;
  DWORD dwDDrawReserved4;
  LPVOID lpDDrawReserved5;
  LPDWORD lpGammaRamp;
  LPDWORD lpOriginalGammaRamp;
  LPVOID lpDDrawReserved6;
# ifndef WIN95
  DISPLAYMODEINFO dmiDDrawReserved7;
# endif
  DWORD dwSurfaceHandle;
  DWORD qwDDrawReserved8[2];
  LPVOID lpDDrawReserved9;
  DWORD cSurfaces;
  LPDDSURFACEDESC2 pCreatedDDSurfaceDesc2;
  LPDDRAWI_DDRAWSURFACE_LCL *slist;
  DWORD dwFVF;
  LPVOID lpVB;
} DDRAWI_DDRAWSURFACE_MORE;

typedef struct _DDRAWI_DDRAWSURFACE_LCL {
  LPDDRAWI_DDRAWSURFACE_MORE lpSurfMore;
  LPDDRAWI_DDRAWSURFACE_GBL lpGbl;
  ULONG_PTR hDDSurface;
  LPATTACHLIST lpAttachList;
  LPATTACHLIST lpAttachListFrom;
  DWORD dwLocalRefCnt;
  DWORD dwProcessId;
  DWORD dwFlags;
  DDSCAPS ddsCaps;
  __GNU_EXTENSION union {
    LPDDRAWI_DDRAWPALETTE_INT lpDDPalette;
    LPDDRAWI_DDRAWPALETTE_INT lp16DDPalette;
  };
  __GNU_EXTENSION union {
    LPDDRAWI_DDRAWCLIPPER_LCL lpDDClipper;
    LPDDRAWI_DDRAWCLIPPER_INT lp16DDClipper;
  };
  DWORD dwModeCreatedIn;
  DWORD dwBackBufferCount;
  DDCOLORKEY ddckCKDestBlt;
  DDCOLORKEY ddckCKSrcBlt;
  ULONG_PTR hDC;
  ULONG_PTR dwReserved1;
  DDCOLORKEY ddckCKSrcOverlay;
  DDCOLORKEY ddckCKDestOverlay;
  LPDDRAWI_DDRAWSURFACE_INT lpSurfaceOverlaying;
  DBLNODE dbnOverlayNode;
  RECT rcOverlaySrc;
  RECT rcOverlayDest;
  DWORD dwClrXparent;
  DWORD dwAlpha;
  LONG lOverlayX;
  LONG lOverlayY;
} DDRAWI_DDRAWSURFACE_LCL;

#define DDRAWISURF_ATTACHED           0x00000001L
#define DDRAWISURF_IMPLICITCREATE     0x00000002L
#define DDRAWISURF_ISFREE             0x00000004L
#define DDRAWISURF_ATTACHED_FROM      0x00000008L
#define DDRAWISURF_IMPLICITROOT       0x00000010L
#define DDRAWISURF_PARTOFPRIMARYCHAIN 0x00000020L
#define DDRAWISURF_DATAISALIASED      0x00000040L
#define DDRAWISURF_HASDC              0x00000080L
#define DDRAWISURF_HASCKEYDESTOVERLAY 0x00000100L
#define DDRAWISURF_HASCKEYDESTBLT     0x00000200L
#define DDRAWISURF_HASCKEYSRCOVERLAY  0x00000400L
#define DDRAWISURF_HASCKEYSRCBLT      0x00000800L
#define DDRAWISURF_LOCKEXCLUDEDCURSOR 0x00001000L
#define DDRAWISURF_HASPIXELFORMAT     0x00002000L
#define DDRAWISURF_HASOVERLAYDATA     0x00004000L
#define DDRAWISURF_SETGAMMA           0x00008000L
#define DDRAWISURF_SW_CKEYDESTOVERLAY 0x00010000L
#define DDRAWISURF_SW_CKEYDESTBLT     0x00020000L
#define DDRAWISURF_SW_CKEYSRCOVERLAY  0x00040000L
#define DDRAWISURF_SW_CKEYSRCBLT      0x00080000L
#define DDRAWISURF_HW_CKEYDESTOVERLAY 0x00100000L
#define DDRAWISURF_HW_CKEYDESTBLT     0x00200000L
#define DDRAWISURF_HW_CKEYSRCOVERLAY  0x00400000L
#define DDRAWISURF_HW_CKEYSRCBLT      0x00800000L
#define DDRAWISURF_INMASTERSPRITELIST 0x01000000L
#define DDRAWISURF_HELCB              0x02000000L
#define DDRAWISURF_FRONTBUFFER        0x04000000L
#define DDRAWISURF_BACKBUFFER         0x08000000L
#define DDRAWISURF_INVALID            0x10000000L
#define DDRAWISURF_DCIBUSY            0x20000000L
#define DDRAWISURF_GETDCNULL          0x40000000L
#define DDRAWISURF_STEREOSURFACELEFT  0x20000000L
#define DDRAWISURF_DRIVERMANAGED      0x40000000L
#define DDRAWISURF_DCILOCK            0x80000000L

/* palettes */
typedef struct _DDRAWI_DDRAWPALETTE_INT {
  LPVOID lpVtbl;
  LPDDRAWI_DDRAWPALETTE_LCL lpLcl;
  LPDDRAWI_DDRAWPALETTE_INT lpLink;
  DWORD dwIntRefCnt;
} DDRAWI_DDRAWPALETTE_INT;

typedef struct _DDRAWI_DDRAWPALETTE_GBL {
  DWORD dwRefCnt;
  DWORD dwFlags;
  LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl;
  DWORD dwProcessId;
  LPPALETTEENTRY lpColorTable;
  __GNU_EXTENSION union {
    ULONG_PTR dwReserved1;
    HPALETTE hHELGDIPalette;
  };
  DWORD dwDriverReserved;
  DWORD dwContentsStamp;
  DWORD dwSaveStamp;
  DWORD dwHandle;
} DDRAWI_DDRAWPALETTE_GBL;

#define DDRAWIPAL_256           0x00000001
#define DDRAWIPAL_16            0x00000002
#define DDRAWIPAL_GDI           0x00000004
#define DDRAWIPAL_STORED_8      0x00000008
#define DDRAWIPAL_STORED_16     0x00000010
#define DDRAWIPAL_STORED_24     0x00000020
#define DDRAWIPAL_EXCLUSIVE     0x00000040
#define DDRAWIPAL_INHEL         0x00000080
#define DDRAWIPAL_DIRTY         0x00000100
#define DDRAWIPAL_ALLOW256      0x00000200
#define DDRAWIPAL_4             0x00000400
#define DDRAWIPAL_2             0x00000800
#define DDRAWIPAL_STORED_8INDEX 0x00001000
#define DDRAWIPAL_ALPHA         0x00002000

#define D3DFORMAT_OP_TEXTURE                              0x00000001L
#define D3DFORMAT_OP_VOLUMETEXTURE                        0x00000002L
#define D3DFORMAT_OP_CUBETEXTURE                          0x00000004L
#define D3DFORMAT_OP_OFFSCREEN_RENDERTARGET               0x00000008L
#define D3DFORMAT_OP_SAME_FORMAT_RENDERTARGET             0x00000010L
#define D3DFORMAT_OP_ZSTENCIL                             0x00000040L
#define D3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH  0x00000080L
#define D3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET 0x00000100L
#define D3DFORMAT_OP_DISPLAYMODE                          0x00000400L
#define D3DFORMAT_OP_3DACCELERATION                       0x00000800L
#define D3DFORMAT_OP_PIXELSIZE                            0x00001000L
#define D3DFORMAT_OP_CONVERT_TO_ARGB                      0x00002000L
#define D3DFORMAT_OP_OFFSCREENPLAIN                       0x00004000L
#define D3DFORMAT_OP_SRGBREAD                             0x00008000L
#define D3DFORMAT_OP_BUMPMAP                              0x00010000L
#define D3DFORMAT_OP_NOFILTER                             0x00040000L
#define DDPF_D3DFORMAT                                    0x00200000l
#define DDPF_NOVEL_TEXTURE_FORMAT                         0x00100000l
#define D3DFORMAT_MEMBEROFGROUP_ARGB                      0x00080000L
#define D3DFORMAT_OP_SRGBWRITE                            0x00100000L
#define D3DFORMAT_OP_NOALPHABLEND                         0x00200000L
#define D3DFORMAT_OP_AUTOGENMIPMAP                        0x00400000L
#define D3DFORMAT_OP_VERTEXTEXTURE                        0x00800000L
#define D3DFORMAT_OP_NOTEXCOORDWRAPNORMIP                 0x01000000L
#define DELETED_OK                                        0
#define DELETED_LASTONE                                   1
#define DELETED_NOTFOUND                                  2
#define DDCALLBACKSSIZE_V1                                (offsetof(DDHAL_DDCALLBACKS, SetExclusiveMode))
#define DDCALLBACKSSIZE                                   sizeof( DDHAL_DDCALLBACKS )
#define DDRAWICLIP_WATCHWINDOW                            0x00000001
#define DDRAWICLIP_ISINITIALIZED                          0x00000002
#define DDRAWICLIP_INMASTERSPRITELIST                     0x00000004
#define PFINDEX_UNINITIALIZED                             (0UL)
#define PFINDEX_UNSUPPORTED                               (~0UL)
#define ROP_HAS_SOURCE                                    0x00000001l
#define ROP_HAS_PATTERN                                   0x00000002l
#define ROP_HAS_SOURCEPATTERN                             ROP_HAS_SOURCE | ROP_HAS_PATTERN
#define DDRAWIVPORT_ON                                    0x00000001
#define DDRAWIVPORT_SOFTWARE_AUTOFLIP                     0x00000002
#define DDRAWIVPORT_COLORKEYANDINTERP                     0x00000004
#define DDRAWIVPORT_NOKERNELHANDLES                       0x00000008
#define DDRAWIVPORT_SOFTWARE_BOB                          0x00000010
#define DDRAWIVPORT_VBION                                 0x00000020
#define DDRAWIVPORT_VIDEOON                               0x00000040
#define DDRAWI_GETCOLOR                                   0x0001
#define DDRAWI_SETCOLOR                                   0x0002
#define DDMCQUERY_READ                                    0x00000001
#define DDWAITVB_I_TESTVB                                 0x80000006

#define DDBLT_ANYALPHA                                           \
  (DDBLT_ALPHASRCSURFACEOVERRIDE | DDBLT_ALPHASRCCONSTOVERRIDE | \
   DDBLT_ALPHASRC | DDBLT_ALPHADESTSURFACEOVERRIDE |             \
   DDBLT_ALPHADESTCONSTOVERRIDE | DDBLT_ALPHADEST)

#define DDHAL_ALIGNVALIDCAPS (DDSCAPS_OFFSCREENPLAIN | DDSCAPS_EXECUTEBUFFER | \
                              DDSCAPS_OVERLAY | DDSCAPS_TEXTURE |              \
                              DDSCAPS_ZBUFFER | DDSCAPS_ALPHA | DDSCAPS_FLIP )

#define DDHALINFOSIZE_V2 sizeof(DDHALINFO)

#define DDOVER_ANYALPHA                                            \
  (DDOVER_ALPHASRCSURFACEOVERRIDE | DDOVER_ALPHASRCCONSTOVERRIDE | \
   DDOVER_ALPHASRC | DDOVER_ALPHADESTSURFACEOVERRIDE |             \
   DDOVER_ALPHADESTCONSTOVERRIDE | DDOVER_ALPHADEST)

typedef struct _DDRAWI_DDRAWPALETTE_LCL {
  DWORD lpPalMore;
  LPDDRAWI_DDRAWPALETTE_GBL lpGbl;
  ULONG_PTR dwUnused0;
  DWORD dwLocalRefCnt;
#ifndef _NO_COM
  IUnknown *pUnkOuter;
#else
  PVOID pUnkOuter;
#endif
  LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl;
  ULONG_PTR dwReserved1;
  /* DirectX 6.0 */
  ULONG_PTR dwDDRAWReserved1;
  ULONG_PTR dwDDRAWReserved2;
  ULONG_PTR dwDDRAWReserved3;
} DDRAWI_DDRAWPALETTE_LCL;

typedef struct _DDMCCOMPBUFFERINFO {
  DWORD dwSize;
  DWORD dwNumCompBuffers;
  DWORD dwWidthToCreate;
  DWORD dwHeightToCreate;
  DWORD dwBytesToAllocate;
  DDSCAPS2 ddCompCaps;
  DDPIXELFORMAT ddPixelFormat;
} DDMCCOMPBUFFERINFO, *LPDDMCCOMPBUFFERINFO;

typedef struct _DDMCBUFFERINFO {
  DWORD dwSize;
  LPDDRAWI_DDRAWSURFACE_LCL lpCompSurface;
  DWORD dwDataOffset;
  DWORD dwDataSize;
  LPVOID lpPrivate;
} DDMCBUFFERINFO, *LPDDMCBUFFERINFO;

typedef struct _DDHAL_GETDRIVERSTATEDATA {
  DWORD dwFlags;
  __GNU_EXTENSION union {
    ULONG_PTR dwhContext;
  };
  LPDWORD lpdwStates;
  DWORD dwLength;
  HRESULT ddRVal;
} DDHAL_GETDRIVERSTATEDATA;

typedef struct _DDHAL_ADDATTACHEDSURFACEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurfAttached;
  HRESULT ddRVal;
  LPDDHALSURFCB_ADDATTACHEDSURFACE AddAttachedSurface;
} DDHAL_ADDATTACHEDSURFACEDATA;

typedef struct _DDHAL_BEGINMOCOMPFRAMEDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDMOTIONCOMP_LCL lpMoComp;
  LPDDRAWI_DDRAWSURFACE_LCL lpDestSurface;
  DWORD dwInputDataSize;
  LPVOID lpInputData;
  DWORD dwOutputDataSize;
  LPVOID lpOutputData;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_BEGINFRAME BeginMoCompFrame;
} DDHAL_BEGINMOCOMPFRAMEDATA;

typedef struct _DDHAL_COLORCONTROLDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  LPDDCOLORCONTROL lpColorData;
  DWORD dwFlags;
  HRESULT ddRVal;
  LPDDHALCOLORCB_COLORCONTROL ColorControl;
} DDHAL_COLORCONTROLDATA;

typedef struct _DDHAL_CREATEMOCOMPDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDMOTIONCOMP_LCL lpMoComp;
  LPGUID lpGuid;
  DWORD dwUncompWidth;
  DWORD dwUncompHeight;
  DDPIXELFORMAT ddUncompPixelFormat;
  LPVOID lpData;
  DWORD dwDataSize;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_CREATE CreateMoComp;
} DDHAL_CREATEMOCOMPDATA;

typedef struct _DDHAL_DESTROYMOCOMPDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDMOTIONCOMP_LCL lpMoComp;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_DESTROY DestroyMoComp;
} DDHAL_DESTROYMOCOMPDATA;

typedef struct _DDHAL_ENDMOCOMPFRAMEDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDMOTIONCOMP_LCL lpMoComp;
  LPVOID lpInputData;
  DWORD dwInputDataSize;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_ENDFRAME EndMoCompFrame;
} DDHAL_ENDMOCOMPFRAMEDATA;

typedef struct _DDHAL_FLIPTOGDISURFACEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DWORD dwToGDI;
  DWORD dwReserved;
  HRESULT ddRVal;
  LPDDHAL_FLIPTOGDISURFACE FlipToGDISurface;
} DDHAL_FLIPTOGDISURFACEDATA;

typedef struct _DDHAL_GETAVAILDRIVERMEMORYDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DDSCAPS DDSCaps;
  DWORD dwTotal;
  DWORD dwFree;
  HRESULT ddRVal;
  LPDDHAL_GETAVAILDRIVERMEMORY GetAvailDriverMemory;
  DDSCAPSEX ddsCapsEx;
} DDHAL_GETAVAILDRIVERMEMORYDATA;

typedef struct _DDHAL_GETBLTSTATUSDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  DWORD dwFlags;
  HRESULT ddRVal;
  LPDDHALSURFCB_GETBLTSTATUS GetBltStatus;
} DDHAL_GETBLTSTATUSDATA;

typedef struct _DDHAL_GETFLIPSTATUSDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  DWORD dwFlags;
  HRESULT ddRVal;
  LPDDHALSURFCB_GETFLIPSTATUS GetFlipStatus;
} DDHAL_GETFLIPSTATUSDATA;

typedef struct _DDHAL_GETINTERNALMOCOMPDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPGUID lpGuid;
  DWORD dwWidth;
  DWORD dwHeight;
  DDPIXELFORMAT ddPixelFormat;
  DWORD dwScratchMemAlloc;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_GETINTERNALINFO GetInternalMoCompInfo;
} DDHAL_GETINTERNALMOCOMPDATA;

typedef struct _DDHAL_GETMOCOMPCOMPBUFFDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPGUID lpGuid;
  DWORD dwWidth;
  DWORD dwHeight;
  DDPIXELFORMAT ddPixelFormat;
  DWORD dwNumTypesCompBuffs;
  LPDDMCCOMPBUFFERINFO lpCompBuffInfo;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_GETCOMPBUFFINFO GetMoCompBuffInfo;
} DDHAL_GETMOCOMPCOMPBUFFDATA;

typedef struct _DDHAL_GETMOCOMPGUIDSDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  DWORD dwNumGuids;
  LPGUID lpGuids;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_GETGUIDS GetMoCompGuids;
} DDHAL_GETMOCOMPGUIDSDATA;

typedef struct _DDHAL_GETMOCOMPFORMATSDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPGUID lpGuid;
  DWORD dwNumFormats;
  LPDDPIXELFORMAT lpFormats;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_GETFORMATS GetMoCompFormats;
} DDHAL_GETMOCOMPFORMATSDATA;

typedef struct _DDHAL_GETSCANLINEDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DWORD dwScanLine;
  HRESULT ddRVal;
  LPDDHAL_GETSCANLINE GetScanLine;
} DDHAL_GETSCANLINEDATA;

typedef struct _DDHAL_QUERYMOCOMPSTATUSDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDMOTIONCOMP_LCL lpMoComp;
  LPDDRAWI_DDRAWSURFACE_LCL lpSurface;
  DWORD dwFlags;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_QUERYSTATUS QueryMoCompStatus;
} DDHAL_QUERYMOCOMPSTATUSDATA;

typedef struct _DDHAL_RENDERMOCOMPDATA {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  LPDDRAWI_DDMOTIONCOMP_LCL lpMoComp;
  DWORD dwNumBuffers;
  LPDDMCBUFFERINFO lpBufferInfo;
  DWORD dwFunction;
  LPVOID lpInputData;
  DWORD dwInputDataSize;
  LPVOID lpOutputData;
  DWORD dwOutputDataSize;
  HRESULT ddRVal;
  LPDDHALMOCOMPCB_RENDER RenderMoComp;
} DDHAL_RENDERMOCOMPDATA;

typedef struct _DDHAL_SETCOLORKEYDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  DWORD dwFlags;
  DDCOLORKEY ckNew;
  HRESULT ddRVal;
  LPDDHALSURFCB_SETCOLORKEY SetColorKey;
} DDHAL_SETCOLORKEYDATA;

typedef struct _DDHAL_SETOVERLAYPOSITIONDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSrcSurface;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDDestSurface;
  LONG lXPos;
  LONG lYPos;
  HRESULT ddRVal;
  LPDDHALSURFCB_SETOVERLAYPOSITION SetOverlayPosition;
} DDHAL_SETOVERLAYPOSITIONDATA;

typedef struct _DDHAL_UPDATEOVERLAYDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDDestSurface;
  RECTL rDest;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSrcSurface;
  RECTL rSrc;
  DWORD dwFlags;
  DDOVERLAYFX overlayFX;
  HRESULT ddRVal;
  LPDDHALSURFCB_UPDATEOVERLAY UpdateOverlay;
} DDHAL_UPDATEOVERLAYDATA;

typedef struct _DDHAL_WAITFORVERTICALBLANKDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DWORD dwFlags;
  DWORD bIsInVB;
  ULONG_PTR hEvent;
  HRESULT ddRVal;
  LPDDHAL_WAITFORVERTICALBLANK WaitForVerticalBlank;
} DDHAL_WAITFORVERTICALBLANKDATA;

typedef struct _DDHAL_DRVSETCOLORKEYDATA {
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  DWORD dwFlags;
  DDCOLORKEY ckNew;
  HRESULT ddRVal;
  LPDDHAL_SETCOLORKEY SetColorKey;
} DDHAL_DRVSETCOLORKEYDATA;

typedef struct _DDMONITORINFO {
  WORD Manufacturer;
  WORD Product;
  DWORD SerialNumber;
  GUID DeviceIdentifier;
  int Mode640x480;
  int Mode800x600;
  int Mode1024x768;
  int Mode1280x1024;
  int Mode1600x1200;
  int ModeReserved1;
  int ModeReserved2;
  int ModeReserved3;
} DDMONITORINFO, FAR *LPDDMONITORINFO;

typedef struct _DDRAWI_DDRAWCLIPPER_INT {
  LPVOID lpVtbl;
  LPDDRAWI_DDRAWCLIPPER_LCL lpLcl;
  LPDDRAWI_DDRAWCLIPPER_INT lpLink;
  DWORD dwIntRefCnt;
} DDRAWI_DDRAWCLIPPER_INT;

typedef struct _DDHAL_UPDATENONLOCALHEAPDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DWORD dwHeap;
  FLATPTR fpGARTLin;
  FLATPTR fpGARTDev;
  ULONG_PTR ulPolicyMaxBytes;
  HRESULT ddRVal;
  LPDDHAL_UPDATENONLOCALHEAP UpdateNonLocalHeap;
} DDHAL_UPDATENONLOCALHEAPDATA;

typedef struct _DDHAL_SETCLIPLISTDATA {
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
  HRESULT ddRVal;
  LPDDHALSURFCB_SETCLIPLIST SetClipList;
} DDHAL_SETCLIPLISTDATA;

typedef struct _DDRAWI_DDMOTIONCOMP_LCL {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  GUID guid;
  DWORD dwUncompWidth;
  DWORD dwUncompHeight;
  DDPIXELFORMAT ddUncompPixelFormat;
  DWORD dwInternalFlags;
  DWORD dwRefCnt;
  DWORD dwProcessId;
  HANDLE hMoComp;
  DWORD dwDriverReserved1;
  DWORD dwDriverReserved2;
  DWORD dwDriverReserved3;
  LPVOID lpDriverReserved1;
  LPVOID lpDriverReserved2;
  LPVOID lpDriverReserved3;
} DDRAWI_DDMOTIONCOMP_LCL;

typedef struct _DDRAWI_DDMOTIONCOMP_INT {
  LPVOID lpVtbl;
  LPDDRAWI_DDMOTIONCOMP_LCL lpLcl;
  LPDDRAWI_DDMOTIONCOMP_INT lpLink;
  DWORD dwIntRefCnt;
} DDRAWI_DDMOTIONCOMP_INT;

typedef struct _DDRAWI_DDVIDEOPORT_LCL {
  LPDDRAWI_DIRECTDRAW_LCL lpDD;
  DDVIDEOPORTDESC ddvpDesc;
  DDVIDEOPORTINFO ddvpInfo;
  LPDDRAWI_DDRAWSURFACE_INT lpSurface;
  LPDDRAWI_DDRAWSURFACE_INT lpVBISurface;
  LPDDRAWI_DDRAWSURFACE_INT *lpFlipInts;
  DWORD dwNumAutoflip;
  DWORD dwProcessID;
  DWORD dwStateFlags;
  DWORD dwFlags;
  DWORD dwRefCnt;
  FLATPTR fpLastFlip;
  ULONG_PTR dwReserved1;
  ULONG_PTR dwReserved2;
  HANDLE hDDVideoPort;
  DWORD dwNumVBIAutoflip;
  LPDDVIDEOPORTDESC lpVBIDesc;
  LPDDVIDEOPORTDESC lpVideoDesc;
  LPDDVIDEOPORTINFO lpVBIInfo;
  LPDDVIDEOPORTINFO lpVideoInfo;
  DWORD dwVBIProcessID;
  LPDDRAWI_DDVIDEOPORT_INT lpVPNotify;
} DDRAWI_DDVIDEOPORT_LCL;

typedef struct _DDRAWI_DDVIDEOPORT_INT {
  LPVOID lpVtbl;
  LPDDRAWI_DDVIDEOPORT_LCL lpLcl;
  LPDDRAWI_DDVIDEOPORT_INT lpLink;
  DWORD dwIntRefCnt;
  DWORD dwFlags;
} DDRAWI_DDVIDEOPORT_INT;

typedef struct _DDRAWI_DDRAWCLIPPER_LCL {
  DWORD lpClipMore;
  LPDDRAWI_DDRAWCLIPPER_GBL lpGbl;
  LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl;
  DWORD dwLocalRefCnt;
#ifndef _NO_COM
  IUnknown *pUnkOuter;
#else
  PVOID pUnkOuter;
#endif
  LPDDRAWI_DIRECTDRAW_INT lpDD_int;
  ULONG_PTR dwReserved1;
#ifndef _NO_COM
  IUnknown *pAddrefedThisOwner;
#else
  PVOID pAddrefedThisOwner;
#endif
} DDRAWI_DDRAWCLIPPER_LCL;

typedef struct _DDRAWI_DDRAWCLIPPER_GBL {
  DWORD dwRefCnt;
  DWORD dwFlags;
  LPDDRAWI_DIRECTDRAW_GBL lpDD;
  DWORD dwProcessId;
  ULONG_PTR dwReserved1;
  ULONG_PTR hWnd;
  LPRGNDATA lpStaticClipList;
} DDRAWI_DDRAWCLIPPER_GBL;

typedef BOOL (PASCAL *LPDDHEL_INIT)(LPDDRAWI_DIRECTDRAW_GBL,BOOL);

extern HRESULT DDAPI
LateAllocateSurfaceMem(
  LPDIRECTDRAWSURFACE lpSurface,
  DWORD dwPleaseAllocType,
  DWORD dwWidthInBytesOrSize,
  DWORD dwHeight);

LPDIRECTDRAWSURFACE GetNextMipMap(
  LPDIRECTDRAWSURFACE lpLevel);

typedef struct IDirectDrawClipperVtbl DIRECTDRAWCLIPPERCALLBACKS;
typedef struct IDirectDrawPaletteVtbl DIRECTDRAWPALETTECALLBACKS;
typedef struct IDirectDrawSurfaceVtbl DIRECTDRAWSURFACECALLBACKS;
typedef struct IDirectDrawSurface2Vtbl DIRECTDRAWSURFACE2CALLBACKS;
typedef struct IDirectDrawSurface3Vtbl DIRECTDRAWSURFACE3CALLBACKS;
typedef struct IDirectDrawSurface4Vtbl DIRECTDRAWSURFACE4CALLBACKS;
typedef struct IDirectDrawSurface7Vtbl DIRECTDRAWSURFACE7CALLBACKS;
typedef struct IDirectDrawColorControlVtbl DIRECTDRAWCOLORCONTROLCALLBACKS;
typedef struct IDirectDrawVtbl DIRECTDRAWCALLBACKS;
typedef struct IDirectDraw2Vtbl DIRECTDRAW2CALLBACKS;
typedef struct IDirectDraw4Vtbl DIRECTDRAW4CALLBACKS;
typedef struct IDirectDraw7Vtbl DIRECTDRAW7CALLBACKS;
typedef struct IDirectDrawKernelVtbl DIRECTDRAWKERNELCALLBACKS;
typedef struct IDirectDrawSurfaceKernelVtbl DIRECTDRAWSURFACEKERNELCALLBACKS;
typedef struct IDirectDrawGammaControlVtbl DIRECTDRAWGAMMACONTROLCALLBACKS;

typedef DIRECTDRAWCLIPPERCALLBACKS  *LPDIRECTDRAWCLIPPERCALLBACKS;
typedef DIRECTDRAWPALETTECALLBACKS  *LPDIRECTDRAWPALETTECALLBACKS;
typedef DIRECTDRAWSURFACECALLBACKS  *LPDIRECTDRAWSURFACECALLBACKS;
typedef DIRECTDRAWCALLBACKS  *LPDIRECTDRAWCALLBACKS;

HRESULT CALLBACK
D3DParseUnknownCommand (
  LPVOID lpvCommands,
  LPVOID *lplpvReturnedCommand);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __DDRAWI_INCLUDED__ */