]> git.cworth.org Git - apitrace/blobdiff - specs/ddraw.py
Move all API specs to a separate dir.
[apitrace] / specs / ddraw.py
diff --git a/specs/ddraw.py b/specs/ddraw.py
new file mode 100644 (file)
index 0000000..eb5a072
--- /dev/null
@@ -0,0 +1,1664 @@
+##########################################################################
+#
+# Copyright 2008-2009 VMware, Inc.
+# All Rights Reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+##########################################################################/
+
+"""ddraw.h"""
+
+from winapi import *
+
+DirectDrawOptSurfaceDescFlags = Flags(DWORD, [
+    "DDOSD_GUID",
+    "DDOSD_COMPRESSION_RATIO",
+    "DDOSD_SCAPS",
+    "DDOSD_OSCAPS",
+    "DDOSD_ALL",
+])
+
+DirectDrawOptSurfaceDescCapsFlags = Flags(DWORD, [
+    "DDOSDCAPS_OPTCOMPRESSED",
+    "DDOSDCAPS_OPTREORDERED",
+    "DDOSDCAPS_MONOLITHICMIPMAP",
+])
+
+DirectDrawGetDeviceIdentifierFlags = Flags(DWORD, [
+    "DDGDI_GETHOSTIDENTIFIER",
+])
+
+IDirectDraw = Interface("IDirectDraw", IUnknown)
+IDirectDraw2 = Interface("IDirectDraw2", IUnknown)
+IDirectDraw4 = Interface("IDirectDraw4", IUnknown)
+IDirectDraw7 = Interface("IDirectDraw7", IUnknown)
+IDirectDrawPalette = Interface("IDirectDrawPalette", IUnknown)
+IDirectDrawClipper = Interface("IDirectDrawClipper", IUnknown)
+IDirectDrawSurface = Interface("IDirectDrawSurface", IUnknown)
+IDirectDrawSurface2 = Interface("IDirectDrawSurface2", IUnknown)
+IDirectDrawSurface3 = Interface("IDirectDrawSurface3", IUnknown)
+IDirectDrawSurface4 = Interface("IDirectDrawSurface4", IUnknown)
+IDirectDrawSurface7 = Interface("IDirectDrawSurface7", IUnknown)
+IDirectDrawColorControl = Interface("IDirectDrawColorControl", IUnknown)
+IDirectDrawGammaControl = Interface("IDirectDrawGammaControl", IUnknown)
+
+LPDIRECTDRAW = Pointer(IDirectDraw)
+LPDIRECTDRAW2 = Pointer(IDirectDraw2)
+LPDIRECTDRAW4 = Pointer(IDirectDraw4)
+LPDIRECTDRAW7 = Pointer(IDirectDraw7)
+LPDIRECTDRAWSURFACE = Pointer(IDirectDrawSurface)
+LPDIRECTDRAWSURFACE2 = Pointer(IDirectDrawSurface2)
+LPDIRECTDRAWSURFACE3 = Pointer(IDirectDrawSurface3)
+LPDIRECTDRAWSURFACE4 = Pointer(IDirectDrawSurface4)
+LPDIRECTDRAWSURFACE7 = Pointer(IDirectDrawSurface7)
+LPDIRECTDRAWPALETTE = Pointer(IDirectDrawPalette)
+LPDIRECTDRAWCLIPPER = Pointer(IDirectDrawClipper)
+LPDIRECTDRAWCOLORCONTROL = Pointer(IDirectDrawColorControl)
+LPDIRECTDRAWGAMMACONTROL = Pointer(IDirectDrawGammaControl)
+
+DDARGB = Struct("DDARGB", [
+    (BYTE, "blue"),
+    (BYTE, "green"),
+    (BYTE, "red"),
+    (BYTE, "alpha"),
+])
+
+LPDDARGB = Pointer(DDARGB)
+
+DDRGBA = Struct("DDRGBA", [
+    (BYTE, "red"),
+    (BYTE, "green"),
+    (BYTE, "blue"),
+    (BYTE, "alpha"),
+])
+LPDDRGBA = Pointer(DDRGBA)
+
+DDCOLORKEY = Struct("DDCOLORKEY", [
+    (DWORD, "dwColorSpaceLowValue"),
+    (DWORD, "dwColorSpaceHighValue"),
+])
+LPDDCOLORKEY = Pointer(DDCOLORKEY)
+
+DDBLTFX = Struct("DDBLTFX", [
+    (DWORD, "dwSize"),
+    (DWORD, "dwDDFX"),
+    (DWORD, "dwROP"),
+    (DWORD, "dwDDROP"),
+    (DWORD, "dwRotationAngle"),
+    (DWORD, "dwZBufferOpCode"),
+    (DWORD, "dwZBufferLow"),
+    (DWORD, "dwZBufferHigh"),
+    (DWORD, "dwZBufferBaseDest"),
+    (DWORD, "dwZDestConstBitDepth"),
+    (DWORD, "dwZDestConst"),
+    (LPDIRECTDRAWSURFACE, "lpDDSZBufferDest"),
+    (DWORD, "dwZSrcConstBitDepth"),
+    (DWORD, "dwZSrcConst"),
+    (LPDIRECTDRAWSURFACE, "lpDDSZBufferSrc"),
+    (DWORD, "dwAlphaEdgeBlendBitDepth"),
+    (DWORD, "dwAlphaEdgeBlend"),
+    (DWORD, "dwReserved"),
+    (DWORD, "dwAlphaDestConstBitDepth"),
+    (DWORD, "dwAlphaDestConst"),
+    (LPDIRECTDRAWSURFACE, "lpDDSAlphaDest"),
+    (DWORD, "dwAlphaSrcConstBitDepth"),
+    (DWORD, "dwAlphaSrcConst"),
+    (LPDIRECTDRAWSURFACE, "lpDDSAlphaSrc"),
+    (DWORD, "dwFillColor"),
+    (DWORD, "dwFillDepth"),
+    (DWORD, "dwFillPixel"),
+    (LPDIRECTDRAWSURFACE, "lpDDSPattern"),
+    (DDCOLORKEY, "ddckDestColorkey"),
+    (DDCOLORKEY, "ddckSrcColorkey"),
+])
+LPDDBLTFX = Pointer(DDBLTFX)
+
+DDSCAPS = Struct("DDSCAPS", [
+    (DWORD, "dwCaps"),
+])
+LPDDSCAPS = Pointer(DDSCAPS)
+
+DDOSCAPS = Struct("DDOSCAPS", [
+    (DWORD, "dwCaps"),
+])
+LPDDOSCAPS = Pointer(DDOSCAPS)
+
+DDSCAPSEX = Struct("DDSCAPSEX", [
+    (DWORD, "dwCaps2"),
+    (DWORD, "dwCaps3"),
+    (DWORD, "dwCaps4"),
+])
+
+DDSCAPS2 = Struct("DDSCAPS2", [
+    (DWORD, "dwCaps"),
+    (DWORD, "dwCaps2"),
+    (DWORD, "dwCaps3"),
+    (DWORD, "dwCaps4"),
+])
+LPDDSCAPS2 = Pointer(DDSCAPS2)
+
+DDCAPS_DX1 = Struct("DDCAPS_DX1", [
+    (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"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
+    (DDSCAPS, "ddsCaps"),
+    (DWORD, "dwMinOverlayStretch"),
+    (DWORD, "dwMaxOverlayStretch"),
+    (DWORD, "dwMinLiveVideoStretch"),
+    (DWORD, "dwMaxLiveVideoStretch"),
+    (DWORD, "dwMinHwCodecStretch"),
+    (DWORD, "dwMaxHwCodecStretch"),
+    (DWORD, "dwReserved1"),
+    (DWORD, "dwReserved2"),
+    (DWORD, "dwReserved3"),
+])
+LPDDCAPS_DX1 = Pointer(DDCAPS_DX1)
+
+DDCAPS_DX3 = Struct("DDCAPS_DX3", [
+    (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"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
+    (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"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
+    (DWORD, "dwVSBCaps"),
+    (DWORD, "dwVSBCKeyCaps"),
+    (DWORD, "dwVSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
+    (DWORD, "dwSSBCaps"),
+    (DWORD, "dwSSBCKeyCaps"),
+    (DWORD, "dwSSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
+    (DWORD, "dwReserved4"),
+    (DWORD, "dwReserved5"),
+    (DWORD, "dwReserved6"),
+])
+LPDDCAPS_DX3 = Pointer(DDCAPS_DX3)
+
+DDCAPS_DX5 = Struct("DDCAPS_DX5", [
+    (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"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
+    (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"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
+    (DWORD, "dwVSBCaps"),
+    (DWORD, "dwVSBCKeyCaps"),
+    (DWORD, "dwVSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
+    (DWORD, "dwSSBCaps"),
+    (DWORD, "dwSSBCKeyCaps"),
+    (DWORD, "dwSSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
+    (DWORD, "dwMaxVideoPorts"),
+    (DWORD, "dwCurrVideoPorts"),
+    (DWORD, "dwSVBCaps2"),
+    (DWORD, "dwNLVBCaps"),
+    (DWORD, "dwNLVBCaps2"),
+    (DWORD, "dwNLVBCKeyCaps"),
+    (DWORD, "dwNLVBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwNLVBRops"),
+])
+LPDDCAPS_DX5 = Pointer(DDCAPS_DX5)
+
+DDCAPS_DX6 = Struct("DDCAPS_DX6", [
+    (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"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
+    (DDSCAPS, "ddsOldCaps"),
+    (DWORD, "dwMinOverlayStretch"),
+    (DWORD, "dwMaxOverlayStretch"),
+    (DWORD, "dwMinLiveVideoStretch"),
+    (DWORD, "dwMaxLiveVideoStretch"),
+    (DWORD, "dwMinHwCodecStretch"),
+    (DWORD, "dwMaxHwCodecStretch"),
+    (DWORD, "dwReserved1"),
+    (DWORD, "dwReserved2"),
+    (DWORD, "dwReserved3"),
+    (DWORD, "dwSVBCaps"),
+    (DWORD, "dwSVBCKeyCaps"),
+    (DWORD, "dwSVBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
+    (DWORD, "dwVSBCaps"),
+    (DWORD, "dwVSBCKeyCaps"),
+    (DWORD, "dwVSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
+    (DWORD, "dwSSBCaps"),
+    (DWORD, "dwSSBCKeyCaps"),
+    (DWORD, "dwSSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
+    (DWORD, "dwMaxVideoPorts"),
+    (DWORD, "dwCurrVideoPorts"),
+    (DWORD, "dwSVBCaps2"),
+    (DWORD, "dwNLVBCaps"),
+    (DWORD, "dwNLVBCaps2"),
+    (DWORD, "dwNLVBCKeyCaps"),
+    (DWORD, "dwNLVBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwNLVBRops"),
+    (DDSCAPS2, "ddsCaps"),
+])
+LPDDCAPS_DX6 = Pointer(DDCAPS_DX6)
+
+DDCAPS_DX7 = Struct("DDCAPS_DX7", [
+    (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"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
+    (DDSCAPS, "ddsOldCaps"),
+    (DWORD, "dwMinOverlayStretch"),
+    (DWORD, "dwMaxOverlayStretch"),
+    (DWORD, "dwMinLiveVideoStretch"),
+    (DWORD, "dwMaxLiveVideoStretch"),
+    (DWORD, "dwMinHwCodecStretch"),
+    (DWORD, "dwMaxHwCodecStretch"),
+    (DWORD, "dwReserved1"),
+    (DWORD, "dwReserved2"),
+    (DWORD, "dwReserved3"),
+    (DWORD, "dwSVBCaps"),
+    (DWORD, "dwSVBCKeyCaps"),
+    (DWORD, "dwSVBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
+    (DWORD, "dwVSBCaps"),
+    (DWORD, "dwVSBCKeyCaps"),
+    (DWORD, "dwVSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
+    (DWORD, "dwSSBCaps"),
+    (DWORD, "dwSSBCKeyCaps"),
+    (DWORD, "dwSSBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
+    (DWORD, "dwMaxVideoPorts"),
+    (DWORD, "dwCurrVideoPorts"),
+    (DWORD, "dwSVBCaps2"),
+    (DWORD, "dwNLVBCaps"),
+    (DWORD, "dwNLVBCaps2"),
+    (DWORD, "dwNLVBCKeyCaps"),
+    (DWORD, "dwNLVBFXCaps"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwNLVBRops"),
+    (DDSCAPS2, "ddsCaps"),
+])
+LPDDCAPS_DX7 = Pointer(DDCAPS_DX7)
+DDCAPS = DDCAPS_DX7
+LPDDCAPS = Pointer(DDCAPS)
+
+DDPIXELFORMAT = Struct("DDPIXELFORMAT", [
+    (DWORD, "dwSize"),
+    (DWORD, "dwFlags"),
+    (DWORD, "dwFourCC"),
+    (DWORD, "dwRGBBitCount"),
+    (DWORD, "dwYUVBitCount"),
+    (DWORD, "dwZBufferBitDepth"),
+    (DWORD, "dwAlphaBitDepth"),
+    (DWORD, "dwLuminanceBitCount"),
+    (DWORD, "dwBumpBitCount"),
+    (DWORD, "dwPrivateFormatBitCount"),
+    (DWORD, "dwRBitMask"),
+    (DWORD, "dwYBitMask"),
+    (DWORD, "dwStencilBitDepth"),
+    (DWORD, "dwLuminanceBitMask"),
+    (DWORD, "dwBumpDuBitMask"),
+    (DWORD, "dwOperations"),
+    (DWORD, "dwGBitMask"),
+    (DWORD, "dwUBitMask"),
+    (DWORD, "dwZBitMask"),
+    (DWORD, "dwBumpDvBitMask"),
+    (WORD, "MultiSampleCaps.wFlipMSTypes"),
+    (WORD, "MultiSampleCaps.wBltMSTypes"),
+    (DWORD, "dwBBitMask"),
+    (DWORD, "dwVBitMask"),
+    (DWORD, "dwStencilBitMask"),
+    (DWORD, "dwBumpLuminanceBitMask"),
+    (DWORD, "dwRGBAlphaBitMask"),
+    (DWORD, "dwYUVAlphaBitMask"),
+    (DWORD, "dwLuminanceAlphaBitMask"),
+    (DWORD, "dwRGBZBitMask"),
+    (DWORD, "dwYUVZBitMask"),
+])
+LPDDPIXELFORMAT = Pointer(DDPIXELFORMAT)
+
+DDOVERLAYFX = Struct("DDOVERLAYFX", [
+    (DWORD, "dwSize"),
+    (DWORD, "dwAlphaEdgeBlendBitDepth"),
+    (DWORD, "dwAlphaEdgeBlend"),
+    (DWORD, "dwReserved"),
+    (DWORD, "dwAlphaDestConstBitDepth"),
+    (DWORD, "dwAlphaDestConst"),
+    (LPDIRECTDRAWSURFACE, "lpDDSAlphaDest"),
+    (DWORD, "dwAlphaSrcConstBitDepth"),
+    (DWORD, "dwAlphaSrcConst"),
+    (LPDIRECTDRAWSURFACE, "lpDDSAlphaSrc"),
+    (DDCOLORKEY, "dckDestColorkey"),
+    (DDCOLORKEY, "dckSrcColorkey"),
+    (DWORD, "dwDDFX"),
+    (DWORD, "dwFlags"),
+])
+LPDDOVERLAYFX = Pointer(DDOVERLAYFX)
+
+DDBLTBATCH = Struct("DDBLTBATCH", [
+    (LPRECT, "lprDest"),
+    (LPDIRECTDRAWSURFACE, "lpDDSSrc"),
+    (LPRECT, "lprSrc"),
+    (DWORD, "dwFlags"),
+    (LPDDBLTFX, "lpDDBltFx"),
+])
+LPDDBLTBATCH = Pointer(DDBLTBATCH)
+
+DDGAMMARAMP = Struct("DDGAMMARAMP", [
+    (Array(WORD, "256"), "red"),
+    (Array(WORD, "256"), "green"),
+    (Array(WORD, "256"), "blue"),
+])
+LPDDGAMMARAMP = Pointer(DDGAMMARAMP)
+
+DDDEVICEIDENTIFIER = Struct("DDDEVICEIDENTIFIER", [
+    (CString, "szDriver"),
+    (CString, "szDescription"),
+    (LARGE_INTEGER, "liDriverVersion"),
+    (DWORD, "dwVendorId"),
+    (DWORD, "dwDeviceId"),
+    (DWORD, "dwSubSysId"),
+    (DWORD, "dwRevision"),
+    (GUID, "guidDeviceIdentifier"),
+])
+LPDDDEVICEIDENTIFIER = Pointer(DDDEVICEIDENTIFIER)
+
+DDDEVICEIDENTIFIER2 = Struct("DDDEVICEIDENTIFIER2", [
+    (CString, "szDriver"),
+    (CString, "szDescription"),
+    (LARGE_INTEGER, "liDriverVersion"),
+    (DWORD, "dwVendorId"),
+    (DWORD, "dwDeviceId"),
+    (DWORD, "dwSubSysId"),
+    (DWORD, "dwRevision"),
+    (GUID, "guidDeviceIdentifier"),
+    (DWORD, "dwWHQLLevel"),
+])
+LPDDDEVICEIDENTIFIER2 = Pointer(DDDEVICEIDENTIFIER2)
+
+LPCLIPPERCALLBACK = FunctionPointer(DWORD, "LPCLIPPERCALLBACK", [(LPDIRECTDRAWCLIPPER, "lpDDClipper"), (HWND, "hWnd"), (DWORD, "code"), (LPVOID, "lpContext")])
+LPSURFACESTREAMINGCALLBACK = FunctionPointer(DWORD, "LPSURFACESTREAMINGCALLBACK", [DWORD])
+
+DDSURFACEDESC = Struct("DDSURFACEDESC", [
+    (DWORD, "dwSize"),
+    (DWORD, "dwFlags"),
+    (DWORD, "dwHeight"),
+    (DWORD, "dwWidth"),
+    (LONG, "lPitch"),
+    (DWORD, "dwLinearSize"),
+    (DWORD, "dwBackBufferCount"),
+    (DWORD, "dwMipMapCount"),
+    (DWORD, "dwZBufferBitDepth"),
+    (DWORD, "dwRefreshRate"),
+    (DWORD, "dwAlphaBitDepth"),
+    (DWORD, "dwReserved"),
+    (LPVOID, "lpSurface"),
+    (DDCOLORKEY, "ddckCKDestOverlay"),
+    (DDCOLORKEY, "ddckCKDestBlt"),
+    (DDCOLORKEY, "ddckCKSrcOverlay"),
+    (DDCOLORKEY, "ddckCKSrcBlt"),
+    (DDPIXELFORMAT, "ddpfPixelFormat"),
+    (DDSCAPS, "ddsCaps"),
+])
+LPDDSURFACEDESC = Pointer(DDSURFACEDESC)
+
+DDSURFACEDESC2 = Struct("DDSURFACEDESC2", [
+    (DWORD, "dwSize"),
+    (DWORD, "dwFlags"),
+    (DWORD, "dwHeight"),
+    (DWORD, "dwWidth"),
+    (LONG, "lPitch"),
+    (DWORD, "dwLinearSize"),
+    (DWORD, "dwBackBufferCount"),
+    (DWORD, "dwDepth"),
+    (DWORD, "dwMipMapCount"),
+    (DWORD, "dwRefreshRate"),
+    (DWORD, "dwSrcVBHandle"),
+    (DWORD, "dwAlphaBitDepth"),
+    (DWORD, "dwReserved"),
+    (LPVOID, "lpSurface"),
+    (DDCOLORKEY, "ddckCKDestOverlay"),
+    (DWORD, "dwEmptyFaceColor"),
+    (DDCOLORKEY, "ddckCKDestBlt"),
+    (DDCOLORKEY, "ddckCKSrcOverlay"),
+    (DDCOLORKEY, "ddckCKSrcBlt"),
+    (DDPIXELFORMAT, "ddpfPixelFormat"),
+    (DWORD, "dwFVF"),
+    (DDSCAPS2, "ddsCaps"),
+    (DWORD, "dwTextureStage"),
+])
+LPDDSURFACEDESC2 = Pointer(DDSURFACEDESC2)
+
+DirectDrawSurfaceDescFlags = Flags(DWORD, [
+    "DDSD_CAPS",
+    "DDSD_HEIGHT",
+    "DDSD_WIDTH",
+    "DDSD_PITCH",
+    "DDSD_BACKBUFFERCOUNT",
+    "DDSD_ZBUFFERBITDEPTH",
+    "DDSD_ALPHABITDEPTH",
+    "DDSD_LPSURFACE",
+    "DDSD_PIXELFORMAT",
+    "DDSD_CKDESTOVERLAY",
+    "DDSD_CKDESTBLT",
+    "DDSD_CKSRCOVERLAY",
+    "DDSD_CKSRCBLT",
+    "DDSD_MIPMAPCOUNT",
+    "DDSD_REFRESHRATE",
+    "DDSD_LINEARSIZE",
+    "DDSD_TEXTURESTAGE",
+    "DDSD_FVF",
+    "DDSD_SRCVBHANDLE",
+    "DDSD_DEPTH",
+    "DDSD_ALL",
+])
+
+DDOPTSURFACEDESC = Struct("DDOPTSURFACEDESC", [
+    (DWORD, "dwSize"),
+    (DWORD, "dwFlags"),
+    (DDSCAPS2, "ddSCaps"),
+    (DDOSCAPS, "ddOSCaps"),
+    (GUID, "guid"),
+    (DWORD, "dwCompressionRatio"),
+])
+
+DDSD = Flags(DWORD, [
+    "DDOSD_GUID",
+    "DDOSD_COMPRESSION_RATIO",
+    "DDOSD_SCAPS",
+    "DDOSD_OSCAPS",
+    "DDOSD_ALL",
+])
+
+DDOSDCAPS = Flags(DWORD, [
+    "DDOSDCAPS_OPTCOMPRESSED",
+    "DDOSDCAPS_OPTREORDERED",
+    "DDOSDCAPS_MONOLITHICMIPMAP",
+    "DDOSDCAPS_VALIDSCAPS",
+    "DDOSDCAPS_VALIDOSCAPS",
+])
+
+DDCOLORCONTROL = Struct("DDCOLORCONTROL", [
+    (DWORD, "dwSize"),
+    (DWORD, "dwFlags"),
+    (LONG, "lBrightness"),
+    (LONG, "lContrast"),
+    (LONG, "lHue"),
+    (LONG, "lSaturation"),
+    (LONG, "lSharpness"),
+    (LONG, "lGamma"),
+    (LONG, "lColorEnable"),
+    (DWORD, "dwReserved1"),
+])
+LPDDCOLORCONTROL = Pointer(DDCOLORCONTROL)
+
+DirectDrawEnumerateExFlags = Flags(DWORD, [
+    "DDENUM_ATTACHEDSECONDARYDEVICES",
+    "DDENUM_DETACHEDSECONDARYDEVICES",
+    "DDENUM_NONDISPLAYDEVICES",
+])
+
+DirectDrawCreateFlags = FakeEnum(DWORD, [
+    "DDCREATE_HARDWAREONLY",
+    "DDCREATE_EMULATIONONLY",
+])
+
+DirectDrawColorControlFlags = Flags(DWORD, [
+    "DDCOLOR_BRIGHTNESS",
+    "DDCOLOR_CONTRAST",
+    "DDCOLOR_HUE",
+    "DDCOLOR_SATURATION",
+    "DDCOLOR_SHARPNESS",
+    "DDCOLOR_GAMMA",
+    "DDCOLOR_COLORENABLE",
+])
+
+DirectDrawCapsFlags = Flags(DWORD, [
+    "DDSCAPS_RESERVED1",
+    "DDSCAPS_ALPHA",
+    "DDSCAPS_BACKBUFFER",
+    "DDSCAPS_COMPLEX",
+    "DDSCAPS_FLIP",
+    "DDSCAPS_FRONTBUFFER",
+    "DDSCAPS_OFFSCREENPLAIN",
+    "DDSCAPS_OVERLAY",
+    "DDSCAPS_PALETTE",
+    "DDSCAPS_PRIMARYSURFACE",
+    "DDSCAPS_RESERVED3",
+    "DDSCAPS_PRIMARYSURFACELEFT",
+    "DDSCAPS_SYSTEMMEMORY",
+    "DDSCAPS_TEXTURE",
+    "DDSCAPS_3DDEVICE",
+    "DDSCAPS_VIDEOMEMORY",
+    "DDSCAPS_VISIBLE",
+    "DDSCAPS_WRITEONLY",
+    "DDSCAPS_ZBUFFER",
+    "DDSCAPS_OWNDC",
+    "DDSCAPS_LIVEVIDEO",
+    "DDSCAPS_HWCODEC",
+    "DDSCAPS_MODEX",
+    "DDSCAPS_MIPMAP",
+    "DDSCAPS_RESERVED2",
+    "DDSCAPS_ALLOCONLOAD",
+    "DDSCAPS_VIDEOPORT",
+    "DDSCAPS_LOCALVIDMEM",
+    "DDSCAPS_NONLOCALVIDMEM",
+    "DDSCAPS_STANDARDVGAMODE",
+    "DDSCAPS_OPTIMIZED",
+])
+
+DirectDrawCapabilityFlags2 = Flags(DWORD, [
+    "DDSCAPS2_RESERVED4",
+    "DDSCAPS2_HARDWAREDEINTERLACE",
+    "DDSCAPS2_HINTDYNAMIC",
+    "DDSCAPS2_HINTSTATIC",
+    "DDSCAPS2_TEXTUREMANAGE",
+    "DDSCAPS2_RESERVED1",
+    "DDSCAPS2_RESERVED2",
+    "DDSCAPS2_OPAQUE",
+    "DDSCAPS2_HINTANTIALIASING",
+    "DDSCAPS2_CUBEMAP",
+    "DDSCAPS2_CUBEMAP_ALLFACES",
+    "DDSCAPS2_CUBEMAP_POSITIVEX",
+    "DDSCAPS2_CUBEMAP_NEGATIVEX",
+    "DDSCAPS2_CUBEMAP_POSITIVEY",
+    "DDSCAPS2_CUBEMAP_NEGATIVEY",
+    "DDSCAPS2_CUBEMAP_POSITIVEZ",
+    "DDSCAPS2_CUBEMAP_NEGATIVEZ",
+    "DDSCAPS2_MIPMAPSUBLEVEL",
+    "DDSCAPS2_D3DTEXTUREMANAGE",
+    "DDSCAPS2_DONOTPERSIST",
+    "DDSCAPS2_STEREOSURFACELEFT",
+    "DDSCAPS2_VOLUME",
+    "DDSCAPS2_NOTUSERLOCKABLE",
+    "DDSCAPS2_POINTS",
+    "DDSCAPS2_RTPATCHES",
+    "DDSCAPS2_NPATCHES",
+    "DDSCAPS2_RESERVED3",
+    "DDSCAPS2_DISCARDBACKBUFFER",
+    "DDSCAPS2_ENABLEALPHACHANNEL",
+    "DDSCAPS2_EXTENDEDFORMATPRIMARY",
+    "DDSCAPS2_ADDITIONALPRIMARY",
+])
+DDSCAPS3 = Flags(DWORD, [
+    "DDSCAPS3_MULTISAMPLE_MASK",
+    "DDSCAPS3_MULTISAMPLE_QUALITY_MASK",
+    "DDSCAPS3_MULTISAMPLE_QUALITY_SHIFT",
+    "DDSCAPS3_RESERVED1",
+    "DDSCAPS3_RESERVED2",
+    "DDSCAPS3_LIGHTWEIGHTMIPMAP",
+    "DDSCAPS3_AUTOGENMIPMAP",
+    "DDSCAPS3_DMAP",
+    "DDSCAPS3_CREATESHAREDRESOURCE",
+    "DDSCAPS3_READONLYRESOURCE",
+    "DDSCAPS3_OPENSHAREDRESOURCE",
+])
+
+DirectDrawDriverCapsFlags = Flags(DWORD, [
+    "DDCAPS_3D",
+    "DDCAPS_ALIGNBOUNDARYDEST",
+    "DDCAPS_ALIGNSIZEDEST",
+    "DDCAPS_ALIGNBOUNDARYSRC",
+    "DDCAPS_ALIGNSIZESRC",
+    "DDCAPS_ALIGNSTRIDE",
+    "DDCAPS_BLT",
+    "DDCAPS_BLTQUEUE",
+    "DDCAPS_BLTFOURCC",
+    "DDCAPS_BLTSTRETCH",
+    "DDCAPS_GDI",
+    "DDCAPS_OVERLAY",
+    "DDCAPS_OVERLAYCANTCLIP",
+    "DDCAPS_OVERLAYFOURCC",
+    "DDCAPS_OVERLAYSTRETCH",
+    "DDCAPS_PALETTE",
+    "DDCAPS_PALETTEVSYNC",
+    "DDCAPS_READSCANLINE",
+    "DDCAPS_RESERVED1",
+    "DDCAPS_VBI",
+    "DDCAPS_ZBLTS",
+    "DDCAPS_ZOVERLAYS",
+    "DDCAPS_COLORKEY",
+    "DDCAPS_ALPHA",
+    "DDCAPS_COLORKEYHWASSIST",
+    "DDCAPS_NOHARDWARE",
+    "DDCAPS_BLTCOLORFILL",
+    "DDCAPS_BANKSWITCHED",
+    "DDCAPS_BLTDEPTHFILL",
+    "DDCAPS_CANCLIP",
+    "DDCAPS_CANCLIPSTRETCHED",
+    "DDCAPS_CANBLTSYSMEM",
+])
+
+DirectDrawDriverCapsFlags2 = Flags(DWORD, [
+    "DDCAPS2_CERTIFIED",
+    "DDCAPS2_NO2DDURING3DSCENE",
+    "DDCAPS2_VIDEOPORT",
+    "DDCAPS2_AUTOFLIPOVERLAY",
+    "DDCAPS2_CANBOBINTERLEAVED",
+    "DDCAPS2_CANBOBNONINTERLEAVED",
+    "DDCAPS2_COLORCONTROLOVERLAY",
+    "DDCAPS2_COLORCONTROLPRIMARY",
+    "DDCAPS2_CANDROPZ16BIT",
+    "DDCAPS2_NONLOCALVIDMEM",
+    "DDCAPS2_NONLOCALVIDMEMCAPS",
+    "DDCAPS2_NOPAGELOCKREQUIRED",
+    "DDCAPS2_WIDESURFACES",
+    "DDCAPS2_CANFLIPODDEVEN",
+    "DDCAPS2_CANBOBHARDWARE",
+    "DDCAPS2_COPYFOURCC",
+    "DDCAPS2_PRIMARYGAMMA",
+    "DDCAPS2_CANRENDERWINDOWED",
+    "DDCAPS2_CANCALIBRATEGAMMA",
+    "DDCAPS2_FLIPINTERVAL",
+    "DDCAPS2_FLIPNOVSYNC",
+    "DDCAPS2_CANMANAGETEXTURE",
+    "DDCAPS2_TEXMANINNONLOCALVIDMEM",
+    "DDCAPS2_STEREO",
+    "DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL",
+    "DDCAPS2_RESERVED1",
+    "DDCAPS2_CANMANAGERESOURCE",
+    "DDCAPS2_DYNAMICTEXTURES",
+    "DDCAPS2_CANAUTOGENMIPMAP",
+    "DDCAPS2_CANSHARERESOURCE",
+])
+
+DirectDrawFxAlphaCapsFlags = Flags(DWORD, [
+    "DDFXALPHACAPS_BLTALPHAEDGEBLEND",
+    "DDFXALPHACAPS_BLTALPHAPIXELS",
+    "DDFXALPHACAPS_BLTALPHAPIXELSNEG",
+    "DDFXALPHACAPS_BLTALPHASURFACES",
+    "DDFXALPHACAPS_BLTALPHASURFACESNEG",
+    "DDFXALPHACAPS_OVERLAYALPHAEDGEBLEND",
+    "DDFXALPHACAPS_OVERLAYALPHAPIXELS",
+    "DDFXALPHACAPS_OVERLAYALPHAPIXELSNEG",
+    "DDFXALPHACAPS_OVERLAYALPHASURFACES",
+    "DDFXALPHACAPS_OVERLAYALPHASURFACESNEG",
+])
+
+DirectDrawFxCapsFlags = Flags(DWORD, [
+    "DDFXCAPS_BLTARITHSTRETCHY",
+    "DDFXCAPS_BLTARITHSTRETCHYN",
+    "DDFXCAPS_BLTMIRRORLEFTRIGHT",
+    "DDFXCAPS_BLTMIRRORUPDOWN",
+    "DDFXCAPS_BLTROTATION",
+    "DDFXCAPS_BLTROTATION90",
+    "DDFXCAPS_BLTSHRINKX",
+    "DDFXCAPS_BLTSHRINKXN",
+    "DDFXCAPS_BLTSHRINKY",
+    "DDFXCAPS_BLTSHRINKYN",
+    "DDFXCAPS_BLTSTRETCHX",
+    "DDFXCAPS_BLTSTRETCHXN",
+    "DDFXCAPS_BLTSTRETCHY",
+    "DDFXCAPS_BLTSTRETCHYN",
+    "DDFXCAPS_OVERLAYARITHSTRETCHY",
+    "DDFXCAPS_OVERLAYARITHSTRETCHYN",
+    "DDFXCAPS_OVERLAYSHRINKX",
+    "DDFXCAPS_OVERLAYSHRINKXN",
+    "DDFXCAPS_OVERLAYSHRINKY",
+    "DDFXCAPS_OVERLAYSHRINKYN",
+    "DDFXCAPS_OVERLAYSTRETCHX",
+    "DDFXCAPS_OVERLAYSTRETCHXN",
+    "DDFXCAPS_OVERLAYSTRETCHY",
+    "DDFXCAPS_OVERLAYSTRETCHYN",
+    "DDFXCAPS_OVERLAYMIRRORLEFTRIGHT",
+    "DDFXCAPS_OVERLAYMIRRORUPDOWN",
+    "DDFXCAPS_OVERLAYDEINTERLACE",
+    "DDFXCAPS_BLTALPHA",
+    "DDFXCAPS_BLTFILTER",
+    "DDFXCAPS_OVERLAYALPHA",
+    "DDFXCAPS_OVERLAYFILTER",
+])
+
+DirectDrawStereoViewCapsFlags = Flags(DWORD, [
+    "DDSVCAPS_RESERVED1",
+    "DDSVCAPS_RESERVED2",
+    "DDSVCAPS_RESERVED3",
+    "DDSVCAPS_RESERVED4",
+    "DDSVCAPS_STEREOSEQUENTIAL",
+])
+
+DirectDrawPaletteCapsFlags = Flags(DWORD, [
+    "DDPCAPS_4BIT",
+    "DDPCAPS_8BITENTRIES",
+    "DDPCAPS_8BIT",
+    "DDPCAPS_INITIALIZE",
+    "DDPCAPS_PRIMARYSURFACE",
+    "DDPCAPS_PRIMARYSURFACELEFT",
+    "DDPCAPS_ALLOW256",
+    "DDPCAPS_VSYNC",
+    "DDPCAPS_1BIT",
+    "DDPCAPS_2BIT",
+    "DDPCAPS_ALPHA",
+])
+
+DirectDrawSurfaceSetPrivateDataConstants = FakeEnum(DWORD, [
+    "DDSPD_IUNKNOWNPOINTER",
+    "DDSPD_VOLATILE",
+])
+
+DirectDrawSurfaceSetPaletteConstants = FakeEnum(DWORD, [
+    "DDBD_1",
+    "DDBD_2",
+    "DDBD_4",
+    "DDBD_8",
+    "DDBD_16",
+    "DDBD_24",
+    "DDBD_32",
+])
+
+DirectDrawSurfaceSetGetColorKeyFlags = Flags(DWORD, [
+    "DDCKEY_COLORSPACE",
+    "DDCKEY_DESTBLT",
+    "DDCKEY_DESTOVERLAY",
+    "DDCKEY_SRCBLT",
+    "DDCKEY_SRCOVERLAY",
+])
+
+DirectDrawColorKeyCapsFlags = Flags(DWORD, [
+    "DDCKEYCAPS_DESTBLT",
+    "DDCKEYCAPS_DESTBLTCLRSPACE",
+    "DDCKEYCAPS_DESTBLTCLRSPACEYUV",
+    "DDCKEYCAPS_DESTBLTYUV",
+    "DDCKEYCAPS_DESTOVERLAY",
+    "DDCKEYCAPS_DESTOVERLAYCLRSPACE",
+    "DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV",
+    "DDCKEYCAPS_DESTOVERLAYONEACTIVE",
+    "DDCKEYCAPS_DESTOVERLAYYUV",
+    "DDCKEYCAPS_SRCBLT",
+    "DDCKEYCAPS_SRCBLTCLRSPACE",
+    "DDCKEYCAPS_SRCBLTCLRSPACEYUV",
+    "DDCKEYCAPS_SRCBLTYUV",
+    "DDCKEYCAPS_SRCOVERLAY",
+    "DDCKEYCAPS_SRCOVERLAYCLRSPACE",
+    "DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV",
+    "DDCKEYCAPS_SRCOVERLAYONEACTIVE",
+    "DDCKEYCAPS_SRCOVERLAYYUV",
+    "DDCKEYCAPS_NOCOSTOVERLAY",
+])
+
+DirectDrawPixelFormatFlags = Flags(DWORD, [
+    "DDPF_ALPHAPIXELS",
+    "DDPF_ALPHA",
+    "DDPF_FOURCC",
+    "DDPF_PALETTEINDEXED4",
+    "DDPF_PALETTEINDEXEDTO8",
+    "DDPF_PALETTEINDEXED8",
+    "DDPF_RGB",
+    "DDPF_COMPRESSED",
+    "DDPF_RGBTOYUV",
+    "DDPF_YUV",
+    "DDPF_ZBUFFER",
+    "DDPF_PALETTEINDEXED1",
+    "DDPF_PALETTEINDEXED2",
+    "DDPF_ZPIXELS",
+    "DDPF_STENCILBUFFER",
+    "DDPF_ALPHAPREMULT",
+    "DDPF_LUMINANCE",
+    "DDPF_BUMPLUMINANCE",
+    "DDPF_BUMPDUDV",
+])
+
+DirectDrawEnumSurfacesFlags = Flags(DWORD, [
+    "DDENUMSURFACES_ALL",
+    "DDENUMSURFACES_MATCH",
+    "DDENUMSURFACES_NOMATCH",
+    "DDENUMSURFACES_CANBECREATED",
+    "DDENUMSURFACES_DOESEXIST",
+])
+
+DirectDrawSetDisplayModeFlags = Flags(DWORD, [
+    "DDSDM_STANDARDVGAMODE",
+])
+
+DirectDrawEnumDisplayModesFlags = Flags(DWORD, [
+    "DDEDM_REFRESHRATES",
+    "DDEDM_STANDARDVGAMODES",
+])
+
+DirectDrawSetCooperativeLevelFlags = Flags(DWORD, [
+    "DDSCL_FULLSCREEN",
+    "DDSCL_ALLOWREBOOT",
+    "DDSCL_NOWINDOWCHANGES",
+    "DDSCL_NORMAL",
+    "DDSCL_EXCLUSIVE",
+    "DDSCL_ALLOWMODEX",
+    "DDSCL_SETFOCUSWINDOW",
+    "DDSCL_SETDEVICEWINDOW",
+    "DDSCL_CREATEDEVICEWINDOW",
+    "DDSCL_MULTITHREADED",
+    "DDSCL_FPUSETUP",
+    "DDSCL_FPUPRESERVE",
+])
+
+DirectDrawBltFlags = Flags(DWORD, [
+    "DDBLT_ALPHADEST",
+    "DDBLT_ALPHADESTCONSTOVERRIDE",
+    "DDBLT_ALPHADESTNEG",
+    "DDBLT_ALPHADESTSURFACEOVERRIDE",
+    "DDBLT_ALPHAEDGEBLEND",
+    "DDBLT_ALPHASRC",
+    "DDBLT_ALPHASRCCONSTOVERRIDE",
+    "DDBLT_ALPHASRCNEG",
+    "DDBLT_ALPHASRCSURFACEOVERRIDE",
+    "DDBLT_ASYNC",
+    "DDBLT_COLORFILL",
+    "DDBLT_DDFX",
+    "DDBLT_DDROPS",
+    "DDBLT_KEYDEST",
+    "DDBLT_KEYDESTOVERRIDE",
+    "DDBLT_KEYSRC",
+    "DDBLT_KEYSRCOVERRIDE",
+    "DDBLT_ROP",
+    "DDBLT_ROTATIONANGLE",
+    "DDBLT_ZBUFFER",
+    "DDBLT_ZBUFFERDESTCONSTOVERRIDE",
+    "DDBLT_ZBUFFERDESTOVERRIDE",
+    "DDBLT_ZBUFFERSRCCONSTOVERRIDE",
+    "DDBLT_ZBUFFERSRCOVERRIDE",
+    "DDBLT_WAIT",
+    "DDBLT_DEPTHFILL",
+    "DDBLT_DONOTWAIT",
+    "DDBLT_PRESENTATION",
+    "DDBLT_LAST_PRESENTATION",
+    "DDBLT_EXTENDED_FLAGS",
+    "DDBLT_EXTENDED_LINEAR_CONTENT",
+])
+
+DirectDrawBltFastFlags = Flags(DWORD, [
+    "DDBLTFAST_NOCOLORKEY",
+    "DDBLTFAST_SRCCOLORKEY",
+    "DDBLTFAST_DESTCOLORKEY",
+    "DDBLTFAST_WAIT",
+    "DDBLTFAST_DONOTWAIT",
+])
+
+DirectDrawFlipFlags = Flags(DWORD, [
+    "DDFLIP_WAIT",
+    "DDFLIP_EVEN",
+    "DDFLIP_ODD",
+    "DDFLIP_NOVSYNC",
+    "DDFLIP_INTERVAL2",
+    "DDFLIP_INTERVAL3",
+    "DDFLIP_INTERVAL4",
+    "DDFLIP_STEREO",
+    "DDFLIP_DONOTWAIT",
+])
+
+DirectDrawSurfaceOverlayFlags = Flags(DWORD, [
+    "DDOVER_ALPHADEST",
+    "DDOVER_ALPHADESTCONSTOVERRIDE",
+    "DDOVER_ALPHADESTNEG",
+    "DDOVER_ALPHADESTSURFACEOVERRIDE",
+    "DDOVER_ALPHAEDGEBLEND",
+    "DDOVER_ALPHASRC",
+    "DDOVER_ALPHASRCCONSTOVERRIDE",
+    "DDOVER_ALPHASRCNEG",
+    "DDOVER_ALPHASRCSURFACEOVERRIDE",
+    "DDOVER_HIDE",
+    "DDOVER_KEYDEST",
+    "DDOVER_KEYDESTOVERRIDE",
+    "DDOVER_KEYSRC",
+    "DDOVER_KEYSRCOVERRIDE",
+    "DDOVER_SHOW",
+    "DDOVER_ADDDIRTYRECT",
+    "DDOVER_REFRESHDIRTYRECTS",
+    "DDOVER_REFRESHALL",
+    "DDOVER_DDFX",
+    "DDOVER_AUTOFLIP",
+    "DDOVER_BOB",
+    "DDOVER_OVERRIDEBOBWEAVE",
+    "DDOVER_INTERLEAVED",
+    "DDOVER_BOBHARDWARE",
+    "DDOVER_ARGBSCALEFACTORS",
+    "DDOVER_DEGRADEARGBSCALING",
+])
+
+DDSETSURFACEDESC = Flags(DWORD, [
+    #"DDSETSURFACEDESC_RECREATEDC",
+    #"DDSETSURFACEDESC_PRESERVEDC",
+])
+
+DirectDrawSurfaceLockFlags = Flags(DWORD, [
+    "DDLOCK_SURFACEMEMORYPTR",
+    "DDLOCK_WAIT",
+    "DDLOCK_EVENT",
+    "DDLOCK_READONLY",
+    "DDLOCK_WRITEONLY",
+    "DDLOCK_NOSYSLOCK",
+    "DDLOCK_NOOVERWRITE",
+    "DDLOCK_DISCARDCONTENTS",
+    "DDLOCK_OKTOSWAP",
+    "DDLOCK_DONOTWAIT",
+    "DDLOCK_HASVOLUMETEXTUREBOXRECT",
+    "DDLOCK_NODIRTYUPDATE",
+])
+
+DirectDrawSurfaceBltFxFlags = Flags(DWORD, [
+    "DDBLTFX_ARITHSTRETCHY",
+    "DDBLTFX_MIRRORLEFTRIGHT",
+    "DDBLTFX_MIRRORUPDOWN",
+    "DDBLTFX_NOTEARING",
+    "DDBLTFX_ROTATE180",
+    "DDBLTFX_ROTATE270",
+    "DDBLTFX_ROTATE90",
+    "DDBLTFX_ZBUFFERRANGE",
+    "DDBLTFX_ZBUFFERBASEDEST",
+])
+
+DirectDrawOverlayFxFlags = Flags(DWORD, [
+    "DDOVERFX_ARITHSTRETCHY",
+    "DDOVERFX_MIRRORLEFTRIGHT",
+    "DDOVERFX_MIRRORUPDOWN",
+    "DDOVERFX_DEINTERLACE",
+])
+
+DirectDrawWaitForVerticalBlankFlags = Flags(DWORD, [
+    "DDWAITVB_BLOCKBEGIN",
+    "DDWAITVB_BLOCKBEGINEVENT",
+    "DDWAITVB_BLOCKEND",
+])
+
+DirectDrawGetFlipStatusFlags = Flags(DWORD, [
+    "DDGFS_CANFLIP",
+    "DDGFS_ISFLIPDONE",
+])
+
+DirectDrawGetBltStatusFlags = Flags(DWORD, [
+    "DDGBS_CANBLT",
+    "DDGBS_ISBLTDONE",
+])
+
+DirectDrawEnumOverlayZOrderFlags = Flags(DWORD, [
+    "DDENUMOVERLAYZ_BACKTOFRONT",
+    "DDENUMOVERLAYZ_FRONTTOBACK",
+])
+
+DirectDrawUpdateOverlayZOrderFlags = Flags(DWORD, [
+    "DDOVERZ_SENDTOFRONT",
+    "DDOVERZ_SENDTOBACK",
+    "DDOVERZ_MOVEFORWARD",
+    "DDOVERZ_MOVEBACKWARD",
+    "DDOVERZ_INSERTINFRONTOF",
+    "DDOVERZ_INSERTINBACKOF",
+])
+
+DirectDrawSetGammaRampFlags = Flags(DWORD, [
+    "DDSGR_CALIBRATE",
+])
+
+DirectDrawStartModeTestFlags = Flags(DWORD, [
+    "DDSMT_ISTESTREQUIRED",
+])
+
+DirectDrawEvaluateModeFlags = Flags(DWORD, [
+    "DDEM_MODEPASSED",
+    "DDEM_MODEFAILED",
+])
+
+DDRESULT = FakeEnum(HRESULT, [
+    "DD_OK",
+    "DD_FALSE",
+    "DDERR_ALREADYINITIALIZED",
+    "DDERR_CANNOTATTACHSURFACE",
+    "DDERR_CANNOTDETACHSURFACE",
+    "DDERR_CURRENTLYNOTAVAIL",
+    "DDERR_EXCEPTION",
+    "DDERR_GENERIC",
+    "DDERR_HEIGHTALIGN",
+    "DDERR_INCOMPATIBLEPRIMARY",
+    "DDERR_INVALIDCAPS",
+    "DDERR_INVALIDCLIPLIST",
+    "DDERR_INVALIDMODE",
+    "DDERR_INVALIDOBJECT",
+    "DDERR_INVALIDPARAMS",
+    "DDERR_INVALIDPIXELFORMAT",
+    "DDERR_INVALIDRECT",
+    "DDERR_LOCKEDSURFACES",
+    "DDERR_NO3D",
+    "DDERR_NOALPHAHW",
+    "DDERR_NOSTEREOHARDWARE",
+    "DDERR_NOSURFACELEFT",
+    "DDERR_NOCLIPLIST",
+    "DDERR_NOCOLORCONVHW",
+    "DDERR_NOCOOPERATIVELEVELSET",
+    "DDERR_NOCOLORKEY",
+    "DDERR_NOCOLORKEYHW",
+    "DDERR_NODIRECTDRAWSUPPORT",
+    "DDERR_NOEXCLUSIVEMODE",
+    "DDERR_NOFLIPHW",
+    "DDERR_NOGDI",
+    "DDERR_NOMIRRORHW",
+    "DDERR_NOTFOUND",
+    "DDERR_NOOVERLAYHW",
+    "DDERR_OVERLAPPINGRECTS",
+    "DDERR_NORASTEROPHW",
+    "DDERR_NOROTATIONHW",
+    "DDERR_NOSTRETCHHW",
+    "DDERR_NOT4BITCOLOR",
+    "DDERR_NOT4BITCOLORINDEX",
+    "DDERR_NOT8BITCOLOR",
+    "DDERR_NOTEXTUREHW",
+    "DDERR_NOVSYNCHW",
+    "DDERR_NOZBUFFERHW",
+    "DDERR_NOZOVERLAYHW",
+    "DDERR_OUTOFCAPS",
+    "DDERR_OUTOFMEMORY",
+    "DDERR_OUTOFVIDEOMEMORY",
+    "DDERR_OVERLAYCANTCLIP",
+    "DDERR_OVERLAYCOLORKEYONLYONEACTIVE",
+    "DDERR_PALETTEBUSY",
+    "DDERR_COLORKEYNOTSET",
+    "DDERR_SURFACEALREADYATTACHED",
+    "DDERR_SURFACEALREADYDEPENDENT",
+    "DDERR_SURFACEBUSY",
+    "DDERR_CANTLOCKSURFACE",
+    "DDERR_SURFACEISOBSCURED",
+    "DDERR_SURFACELOST",
+    "DDERR_SURFACENOTATTACHED",
+    "DDERR_TOOBIGHEIGHT",
+    "DDERR_TOOBIGSIZE",
+    "DDERR_TOOBIGWIDTH",
+    "DDERR_UNSUPPORTED",
+    "DDERR_UNSUPPORTEDFORMAT",
+    "DDERR_UNSUPPORTEDMASK",
+    "DDERR_INVALIDSTREAM",
+    "DDERR_VERTICALBLANKINPROGRESS",
+    "DDERR_WASSTILLDRAWING",
+    "DDERR_DDSCAPSCOMPLEXREQUIRED",
+    "DDERR_XALIGN",
+    "DDERR_INVALIDDIRECTDRAWGUID",
+    "DDERR_DIRECTDRAWALREADYCREATED",
+    "DDERR_NODIRECTDRAWHW",
+    "DDERR_PRIMARYSURFACEALREADYEXISTS",
+    "DDERR_NOEMULATION",
+    "DDERR_REGIONTOOSMALL",
+    "DDERR_CLIPPERISUSINGHWND",
+    "DDERR_NOCLIPPERATTACHED",
+    "DDERR_NOHWND",
+    "DDERR_HWNDSUBCLASSED",
+    "DDERR_HWNDALREADYSET",
+    "DDERR_NOPALETTEATTACHED",
+    "DDERR_NOPALETTEHW",
+    "DDERR_BLTFASTCANTCLIP",
+    "DDERR_NOBLTHW",
+    "DDERR_NODDROPSHW",
+    "DDERR_OVERLAYNOTVISIBLE",
+    "DDERR_NOOVERLAYDEST",
+    "DDERR_INVALIDPOSITION",
+    "DDERR_NOTAOVERLAYSURFACE",
+    "DDERR_EXCLUSIVEMODEALREADYSET",
+    "DDERR_NOTFLIPPABLE",
+    "DDERR_CANTDUPLICATE",
+    "DDERR_NOTLOCKED",
+    "DDERR_CANTCREATEDC",
+    "DDERR_NODC",
+    "DDERR_WRONGMODE",
+    "DDERR_IMPLICITLYCREATED",
+    "DDERR_NOTPALETTIZED",
+    "DDERR_UNSUPPORTEDMODE",
+    "DDERR_NOMIPMAPHW",
+    "DDERR_INVALIDSURFACETYPE",
+    "DDERR_NOOPTIMIZEHW",
+    "DDERR_NOTLOADED",
+    "DDERR_NOFOCUSWINDOW",
+    "DDERR_NOTONMIPMAPSUBLEVEL",
+    "DDERR_DCALREADYCREATED",
+    "DDERR_NONONLOCALVIDMEM",
+    "DDERR_CANTPAGELOCK",
+    "DDERR_CANTPAGEUNLOCK",
+    "DDERR_NOTPAGELOCKED",
+    "DDERR_MOREDATA",
+    "DDERR_EXPIRED",
+    "DDERR_TESTFINISHED",
+    "DDERR_NEWMODE",
+    "DDERR_D3DNOTINITIALIZED",
+    "DDERR_VIDEONOTACTIVE",
+    "DDERR_NOMONITORINFORMATION",
+    "DDERR_NODRIVERSUPPORT",
+    "DDERR_DEVICEDOESNTOWNSURFACE",
+    "DDERR_NOTINITIALIZED",
+])
+
+LPDDENUMMODESCALLBACK     = FunctionPointer(HRESULT, "LPDDENUMMODESCALLBACK", [LPDDSURFACEDESC, LPVOID])
+LPDDENUMMODESCALLBACK2    = FunctionPointer(HRESULT, "LPDDENUMMODESCALLBACK2", [LPDDSURFACEDESC2, LPVOID])
+LPDDENUMSURFACESCALLBACK  = FunctionPointer(HRESULT, "LPDDENUMSURFACESCALLBACK", [LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, LPVOID])
+LPDDENUMSURFACESCALLBACK2 = FunctionPointer(HRESULT, "LPDDENUMSURFACESCALLBACK2", [LPDIRECTDRAWSURFACE4, LPDDSURFACEDESC2, LPVOID])
+LPDDENUMSURFACESCALLBACK7 = FunctionPointer(HRESULT, "LPDDENUMSURFACESCALLBACK7", [LPDIRECTDRAWSURFACE7, LPDDSURFACEDESC2, LPVOID])
+
+IDirectDraw.methods += [
+    Method(DDRESULT, "Compact", []),
+    Method(DDRESULT, "CreateClipper", [(DWORD, "dwFlags"), Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreatePalette", [(DirectDrawPaletteCapsFlags, "dwFlags"), (LPPALETTEENTRY, "lpDDColorArray"), Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreateSurface", [(LPDDSURFACEDESC, "lpDDSurfaceDesc"), Out(Pointer(LPDIRECTDRAWSURFACE), "lplpDDSurface"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "DuplicateSurface", [(LPDIRECTDRAWSURFACE, "lpDDSurface"), Out(Pointer(LPDIRECTDRAWSURFACE), "lplpDupDDSurface")]),
+    Method(DDRESULT, "EnumDisplayModes", [(DirectDrawEnumDisplayModesFlags, "dwFlags"), (LPDDSURFACEDESC, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMMODESCALLBACK, "lpEnumModesCallback")]),
+    Method(DDRESULT, "EnumSurfaces", [(DirectDrawEnumSurfacesFlags, "dwFlags"), (LPDDSURFACEDESC, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "FlipToGDISurface", []),
+    Method(DDRESULT, "GetCaps", [Out(LPDDCAPS, "lpDDDriverCaps"), Out(LPDDCAPS, "lpDDHELCaps")]),
+    Method(DDRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "GetFourCCCodes", [Out(LPDWORD, "lpNumCodes"), Out(LPDWORD, "lpCodes")]),
+    Method(DDRESULT, "GetGDISurface", [Out(Pointer(LPDIRECTDRAWSURFACE), "lplpGDIDDSSurface")]),
+    Method(DDRESULT, "GetMonitorFrequency", [Out(LPDWORD, "lpdwFrequency")]),
+    Method(DDRESULT, "GetScanLine", [Out(LPDWORD, "lpdwScanLine")]),
+    Method(DDRESULT, "GetVerticalBlankStatus", [Out(LPBOOL, "lpbIsInVB")]),
+    Method(DDRESULT, "Initialize", [(Pointer(GUID), "lpGUID")]),
+    Method(DDRESULT, "RestoreDisplayMode", []),
+    Method(DDRESULT, "SetCooperativeLevel", [(HWND, "hWnd"), (DirectDrawSetCooperativeLevelFlags, "dwFlags")]),
+    Method(DDRESULT, "SetDisplayMode", [(DWORD, "dwWidth"), (DWORD, "dwHeight"), (DWORD, "dwBPP")]),
+    Method(DDRESULT, "WaitForVerticalBlank", [(DirectDrawWaitForVerticalBlankFlags, "dwFlags"), (HANDLE, "hEvent")]),
+]
+
+IDirectDraw2.methods += [
+    Method(DDRESULT, "Compact", []),
+    Method(DDRESULT, "CreateClipper", [(DWORD, "dwFlags"), Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreatePalette", [(DirectDrawPaletteCapsFlags, "dwFlags"), (LPPALETTEENTRY, "lpDDColorArray"), Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreateSurface", [(LPDDSURFACEDESC, "lpDDSurfaceDesc"), Out(Pointer(LPDIRECTDRAWSURFACE), "lplpDDSurface"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "DuplicateSurface", [(LPDIRECTDRAWSURFACE, "lpDDSurface"), Out(Pointer(LPDIRECTDRAWSURFACE), "lplpDupDDSurface")]),
+    Method(DDRESULT, "EnumDisplayModes", [(DirectDrawEnumDisplayModesFlags, "dwFlags"), (LPDDSURFACEDESC, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMMODESCALLBACK, "lpEnumModesCallback")]),
+    Method(DDRESULT, "EnumSurfaces", [(DirectDrawEnumSurfacesFlags, "dwFlags"), (LPDDSURFACEDESC, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "FlipToGDISurface", []),
+    Method(DDRESULT, "GetCaps", [Out(LPDDCAPS, "lpDDDriverCaps"), Out(LPDDCAPS, "lpDDHELCaps")]),
+    Method(DDRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "GetFourCCCodes", [Out(LPDWORD, "lpNumCodes"), Out(LPDWORD, "lpCodes")]),
+    Method(DDRESULT, "GetGDISurface", [Out(Pointer(LPDIRECTDRAWSURFACE), "lplpGDIDDSSurface")]),
+    Method(DDRESULT, "GetMonitorFrequency", [Out(LPDWORD, "lpdwFrequency")]),
+    Method(DDRESULT, "GetScanLine", [Out(LPDWORD, "lpdwScanLine")]),
+    Method(DDRESULT, "GetVerticalBlankStatus", [Out(LPBOOL, "lpbIsInVB")]),
+    Method(DDRESULT, "Initialize", [(Pointer(GUID), "lpGUID")]),
+    Method(DDRESULT, "RestoreDisplayMode", []),
+    Method(DDRESULT, "SetCooperativeLevel", [(HWND, "hWnd"), (DirectDrawSetCooperativeLevelFlags, "dwFlags")]),
+    Method(DDRESULT, "SetDisplayMode", [(DWORD, "dwWidth"), (DWORD, "dwHeight"), (DWORD, "dwBPP"), (DWORD, "dwRefreshRate"), (DirectDrawSetDisplayModeFlags, "dwFlags")]),
+    Method(DDRESULT, "WaitForVerticalBlank", [(DirectDrawWaitForVerticalBlankFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "GetAvailableVidMem", [(LPDDSCAPS, "lpDDSCaps"), Out(LPDWORD, "lpdwTotal"), Out(LPDWORD, "lpdwFree")]),
+]
+
+IDirectDraw4.methods += [
+    Method(DDRESULT, "Compact", []),
+    Method(DDRESULT, "CreateClipper", [(DWORD, "dwFlags"), Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreatePalette", [(DirectDrawPaletteCapsFlags, "dwFlags"), (LPPALETTEENTRY, "lpDDColorArray"), Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreateSurface", [(LPDDSURFACEDESC2, "lpDDSurfaceDesc"), Out(Pointer(LPDIRECTDRAWSURFACE4), "lplpDDSurface"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "DuplicateSurface", [(LPDIRECTDRAWSURFACE4, "lpDDSurface"), Out(Pointer(LPDIRECTDRAWSURFACE4), "lplpDupDDSurface")]),
+    Method(DDRESULT, "EnumDisplayModes", [(DirectDrawEnumDisplayModesFlags, "dwFlags"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMMODESCALLBACK2, "lpEnumModesCallback")]),
+    Method(DDRESULT, "EnumSurfaces", [(DirectDrawEnumSurfacesFlags, "dwFlags"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK2, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "FlipToGDISurface", []),
+    Method(DDRESULT, "GetCaps", [Out(LPDDCAPS, "lpDDDriverCaps"), Out(LPDDCAPS, "lpDDHELCaps")]),
+    Method(DDRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "GetFourCCCodes", [Out(LPDWORD, "lpNumCodes"), Out(LPDWORD, "lpCodes")]),
+    Method(DDRESULT, "GetGDISurface", [Out(Pointer(LPDIRECTDRAWSURFACE4), "lplpGDIDDSSurface")]),
+    Method(DDRESULT, "GetMonitorFrequency", [Out(LPDWORD, "lpdwFrequency")]),
+    Method(DDRESULT, "GetScanLine", [Out(LPDWORD, "lpdwScanLine")]),
+    Method(DDRESULT, "GetVerticalBlankStatus", [Out(LPBOOL, "lpbIsInVB")]),
+    Method(DDRESULT, "Initialize", [(Pointer(GUID), "lpGUID")]),
+    Method(DDRESULT, "RestoreDisplayMode", []),
+    Method(DDRESULT, "SetCooperativeLevel", [(HWND, "hWnd"), (DirectDrawSetCooperativeLevelFlags, "dwFlags")]),
+    Method(DDRESULT, "SetDisplayMode", [(DWORD, "dwWidth"), (DWORD, "dwHeight"), (DWORD, "dwBPP"), (DWORD, "dwRefreshRate"), (DirectDrawSetDisplayModeFlags, "dwFlags")]),
+    Method(DDRESULT, "WaitForVerticalBlank", [(DirectDrawWaitForVerticalBlankFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "GetAvailableVidMem", [(LPDDSCAPS2, "lpDDSCaps"), Out(LPDWORD, "lpdwTotal"), Out(LPDWORD, "lpdwFree")]),
+    Method(DDRESULT, "GetSurfaceFromDC", [(HDC, "hdc"), Out(Pointer(LPDIRECTDRAWSURFACE4), "lpDDSurface")]),
+    Method(DDRESULT, "RestoreAllSurfaces", []),
+    Method(DDRESULT, "TestCooperativeLevel", []),
+    Method(DDRESULT, "GetDeviceIdentifier", [Out(LPDDDEVICEIDENTIFIER, "lpDDDI"), (DirectDrawGetDeviceIdentifierFlags, "dwFlags")]),
+]
+
+IDirectDraw7.methods += [
+    Method(DDRESULT, "Compact", []),
+    Method(DDRESULT, "CreateClipper", [(DWORD, "dwFlags"), Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreatePalette", [(DirectDrawPaletteCapsFlags, "dwFlags"), (LPPALETTEENTRY, "lpDDColorArray"), Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "CreateSurface", [(LPDDSURFACEDESC2, "lpDDSurfaceDesc"), Out(Pointer(LPDIRECTDRAWSURFACE7), "lplpDDSurface"), (Pointer(IUnknown), "pUnkOuter")]),
+    Method(DDRESULT, "DuplicateSurface", [(LPDIRECTDRAWSURFACE7, "lpDDSurface"), Out(Pointer(LPDIRECTDRAWSURFACE7), "lplpDupDDSurface")]),
+    Method(DDRESULT, "EnumDisplayModes", [(DirectDrawEnumDisplayModesFlags, "dwFlags"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMMODESCALLBACK2, "lpEnumModesCallback")]),
+    Method(DDRESULT, "EnumSurfaces", [(DirectDrawEnumSurfacesFlags, "dwFlags"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK7, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "FlipToGDISurface", []),
+    Method(DDRESULT, "GetCaps", [Out(LPDDCAPS, "lpDDDriverCaps"), Out(LPDDCAPS, "lpDDHELCaps")]),
+    Method(DDRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "GetFourCCCodes", [Out(LPDWORD, "lpNumCodes"), Out(LPDWORD, "lpCodes")]),
+    Method(DDRESULT, "GetGDISurface", [Out(Pointer(LPDIRECTDRAWSURFACE7), "lplpGDIDDSSurface")]),
+    Method(DDRESULT, "GetMonitorFrequency", [Out(LPDWORD, "lpdwFrequency")]),
+    Method(DDRESULT, "GetScanLine", [Out(LPDWORD, "lpdwScanLine")]),
+    Method(DDRESULT, "GetVerticalBlankStatus", [Out(LPBOOL, "lpbIsInVB")]),
+    Method(DDRESULT, "Initialize", [(Pointer(GUID), "lpGUID")]),
+    Method(DDRESULT, "RestoreDisplayMode", []),
+    Method(DDRESULT, "SetCooperativeLevel", [(HWND, "hWnd"), (DirectDrawSetCooperativeLevelFlags, "dwFlags")]),
+    Method(DDRESULT, "SetDisplayMode", [(DWORD, "dwWidth"), (DWORD, "dwHeight"), (DWORD, "dwBPP"), (DWORD, "dwRefreshRate"), (DirectDrawSetDisplayModeFlags, "dwFlags")]),
+    Method(DDRESULT, "WaitForVerticalBlank", [(DirectDrawWaitForVerticalBlankFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "GetAvailableVidMem", [(LPDDSCAPS2, "lpDDSCaps"), Out(LPDWORD, "lpdwTotal"), Out(LPDWORD, "lpdwFree")]),
+    Method(DDRESULT, "GetSurfaceFromDC", [(HDC, "hdc"), Out(Pointer(LPDIRECTDRAWSURFACE7), "lpDDSurface")]),
+    Method(DDRESULT, "RestoreAllSurfaces", []),
+    Method(DDRESULT, "TestCooperativeLevel", []),
+    Method(DDRESULT, "GetDeviceIdentifier", [Out(LPDDDEVICEIDENTIFIER2, "lpDDDI"), (DirectDrawGetDeviceIdentifierFlags, "dwFlags")]),
+    Method(DDRESULT, "StartModeTest", [(LPSIZE, "lpModesToTest"), (DWORD, "dwNumEntries"), (DirectDrawStartModeTestFlags, "dwFlags")]),
+    Method(DDRESULT, "EvaluateMode", [(DirectDrawEvaluateModeFlags, "dwFlags"), Out(Pointer(DWORD), "pSecondsUntilTimeout")]),
+]
+
+IDirectDrawPalette.methods += [
+    Method(DDRESULT, "GetCaps", [Out(Pointer(DirectDrawPaletteCapsFlags), "lpdwCaps")]),
+    Method(DDRESULT, "GetEntries", [(DWORD, "dwFlags"), (DWORD, "dwBase"), (DWORD, "dwNumEntries"), Out(LPPALETTEENTRY, "lpEntries")]),
+    Method(DDRESULT, "Initialize", [(LPDIRECTDRAW, "lpDD"), (DWORD, "dwFlags"), (LPPALETTEENTRY, "lpDDColorTable")]),
+    Method(DDRESULT, "SetEntries", [(DWORD, "dwFlags"), (DWORD, "dwStartingEntry"), (DWORD, "dwCount"), (LPPALETTEENTRY, "lpEntries")]),
+]
+
+IDirectDrawClipper.methods += [
+    Method(DDRESULT, "GetClipList", [(LPRECT, "lpRect"), (LPRGNDATA, "lpClipList"), Out(LPDWORD, "lpdwSize")]),
+    Method(DDRESULT, "GetHWnd", [Out(Pointer(HWND), "hWnd")]),
+    Method(DDRESULT, "Initialize", [(LPDIRECTDRAW, "lpDD"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "IsClipListChanged", [Out(Pointer(BOOL), "lpbChanged")]),
+    Method(DDRESULT, "SetClipList", [(LPRGNDATA, "lpClipList"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "SetHWnd", [(DWORD, "dwFlags"), (HWND, "hWnd")]),
+]
+
+
+IDirectDrawSurface.methods += [
+    Method(DDRESULT, "AddAttachedSurface", [(LPDIRECTDRAWSURFACE, "lpDDSAttachedSurface")]),
+    Method(DDRESULT, "AddOverlayDirtyRect", [(LPRECT, "lpRect")]),
+    Method(DDRESULT, "Blt", [(LPRECT, "lpDestRect"), (LPDIRECTDRAWSURFACE, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DirectDrawBltFlags, "dwFlags"), (LPDDBLTFX, "lpDDBltFx")]),
+    Method(DDRESULT, "BltBatch", [(LPDDBLTBATCH, "lpDDBltBatch"), (DWORD, "dwCount"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "BltFast", [(DWORD, "dwX"), (DWORD, "dwY"), (LPDIRECTDRAWSURFACE, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DWORD, "dwTrans")]),
+    Method(DDRESULT, "DeleteAttachedSurface", [(DWORD, "dwFlags"), (LPDIRECTDRAWSURFACE, "lpDDSurface")]),
+    Method(DDRESULT, "EnumAttachedSurfaces", [(LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "EnumOverlayZOrders", [(DirectDrawEnumOverlayZOrderFlags, "dwFlags"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpfnCallback")]),
+    Method(DDRESULT, "Flip", [(LPDIRECTDRAWSURFACE, "lpDDSurfaceTargetOverride"), (DirectDrawFlipFlags, "dwFlags")]),
+    Method(DDRESULT, "GetAttachedSurface", [(LPDDSCAPS, "lpDDSCaps"), Out(Pointer(LPDIRECTDRAWSURFACE), "lplpDDAttachedSurface")]),
+    Method(DDRESULT, "GetBltStatus", [(DirectDrawGetBltStatusFlags, "dwFlags")]),
+    Method(DDRESULT, "GetCaps", [Out(LPDDSCAPS, "lpDDSCaps")]),
+    Method(DDRESULT, "GetClipper", [Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper")]),
+    Method(DDRESULT, "GetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "GetDC", [Out(Pointer(HDC), "phDC")]),
+    Method(DDRESULT, "GetFlipStatus", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "GetOverlayPosition", [Out(LPLONG, "lplX"), Out(LPLONG, "lplY")]),
+    Method(DDRESULT, "GetPalette", [Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette")]),
+    Method(DDRESULT, "GetPixelFormat", [Out(LPDDPIXELFORMAT, "lpDDPixelFormat")]),
+    Method(DDRESULT, "GetSurfaceDesc", [Out(LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "Initialize", [(LPDIRECTDRAW, "lpDD"), (LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "IsLost", []),
+    Method(DDRESULT, "Lock", [(LPRECT, "lpDestRect"), (LPDDSURFACEDESC, "lpDDSurfaceDesc"), (DirectDrawSurfaceLockFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "ReleaseDC", [(HDC, "hDC")]),
+    Method(DDRESULT, "Restore", []),
+    Method(DDRESULT, "SetClipper", [(LPDIRECTDRAWCLIPPER, "lpDDClipper")]),
+    Method(DDRESULT, "SetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "SetOverlayPosition", [(LONG, "lX"), (LONG, "lY")]),
+    Method(DDRESULT, "SetPalette", [(LPDIRECTDRAWPALETTE, "lpDDPalette")]),
+    Method(DDRESULT, "Unlock", [(LPVOID, "lp")]),
+    Method(DDRESULT, "UpdateOverlay", [(LPRECT, "lpSrcRect"), (LPDIRECTDRAWSURFACE, "lpDDDestSurface"), (LPRECT, "lpDestRect"), (DirectDrawSurfaceOverlayFlags, "dwFlags"), (LPDDOVERLAYFX, "lpDDOverlayFx")]),
+    Method(DDRESULT, "UpdateOverlayDisplay", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "UpdateOverlayZOrder", [(DirectDrawUpdateOverlayZOrderFlags, "dwFlags"), (LPDIRECTDRAWSURFACE, "lpDDSReference")]),
+]
+
+IDirectDrawSurface2.methods += [
+    Method(DDRESULT, "AddAttachedSurface", [(LPDIRECTDRAWSURFACE2, "lpDDSAttachedSurface")]),
+    Method(DDRESULT, "AddOverlayDirtyRect", [(LPRECT, "lpRect")]),
+    Method(DDRESULT, "Blt", [(LPRECT, "lpDestRect"), (LPDIRECTDRAWSURFACE2, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DirectDrawBltFlags, "dwFlags"), (LPDDBLTFX, "lpDDBltFx")]),
+    Method(DDRESULT, "BltBatch", [(LPDDBLTBATCH, "lpDDBltBatch"), (DWORD, "dwCount"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "BltFast", [(DWORD, "dwX"), (DWORD, "dwY"), (LPDIRECTDRAWSURFACE2, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DWORD, "dwTrans")]),
+    Method(DDRESULT, "DeleteAttachedSurface", [(DWORD, "dwFlags"), (LPDIRECTDRAWSURFACE2, "lpDDSurface")]),
+    Method(DDRESULT, "EnumAttachedSurfaces", [(LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "EnumOverlayZOrders", [(DirectDrawEnumOverlayZOrderFlags, "dwFlags"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpfnCallback")]),
+    Method(DDRESULT, "Flip", [(LPDIRECTDRAWSURFACE2, "lpDDSurfaceTargetOverride"), (DirectDrawFlipFlags, "dwFlags")]),
+    Method(DDRESULT, "GetAttachedSurface", [(LPDDSCAPS, "lpDDSCaps"), Out(Pointer(LPDIRECTDRAWSURFACE2), "lplpDDAttachedSurface")]),
+    Method(DDRESULT, "GetBltStatus", [(DirectDrawGetBltStatusFlags, "dwFlags")]),
+    Method(DDRESULT, "GetCaps", [Out(LPDDSCAPS, "lpDDSCaps")]),
+    Method(DDRESULT, "GetClipper", [Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper")]),
+    Method(DDRESULT, "GetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "GetDC", [Out(Pointer(HDC), "phDC")]),
+    Method(DDRESULT, "GetFlipStatus", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "GetOverlayPosition", [Out(LPLONG, "lplX"), Out(LPLONG, "lplY")]),
+    Method(DDRESULT, "GetPalette", [Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette")]),
+    Method(DDRESULT, "GetPixelFormat", [Out(LPDDPIXELFORMAT, "lpDDPixelFormat")]),
+    Method(DDRESULT, "GetSurfaceDesc", [Out(LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "Initialize", [(LPDIRECTDRAW, "lpDD"), (LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "IsLost", []),
+    Method(DDRESULT, "Lock", [(LPRECT, "lpDestRect"), (LPDDSURFACEDESC, "lpDDSurfaceDesc"), (DirectDrawSurfaceLockFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "ReleaseDC", [(HDC, "hDC")]),
+    Method(DDRESULT, "Restore", []),
+    Method(DDRESULT, "SetClipper", [(LPDIRECTDRAWCLIPPER, "lpDDClipper")]),
+    Method(DDRESULT, "SetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "SetOverlayPosition", [(LONG, "lX"), (LONG, "lY")]),
+    Method(DDRESULT, "SetPalette", [(LPDIRECTDRAWPALETTE, "lpDDPalette")]),
+    Method(DDRESULT, "Unlock", [(LPVOID, "lp")]),
+    Method(DDRESULT, "UpdateOverlay", [(LPRECT, "lpSrcRect"), (LPDIRECTDRAWSURFACE2, "lpDDDestSurface"), (LPRECT, "lpDestRect"), (DirectDrawSurfaceOverlayFlags, "dwFlags"), (LPDDOVERLAYFX, "lpDDOverlayFx")]),
+    Method(DDRESULT, "UpdateOverlayDisplay", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "UpdateOverlayZOrder", [(DirectDrawUpdateOverlayZOrderFlags, "dwFlags"), (LPDIRECTDRAWSURFACE2, "lpDDSReference")]),
+    Method(DDRESULT, "GetDDInterface", [Out(Pointer(IUnknown), "lplpDD")]),
+    Method(DDRESULT, "PageLock", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "PageUnlock", [(DWORD, "dwFlags")]),
+]
+
+IDirectDrawSurface3.methods += [
+    Method(DDRESULT, "AddAttachedSurface", [(LPDIRECTDRAWSURFACE3, "lpDDSAttachedSurface")]),
+    Method(DDRESULT, "AddOverlayDirtyRect", [(LPRECT, "lpRect")]),
+    Method(DDRESULT, "Blt", [(LPRECT, "lpDestRect"), (LPDIRECTDRAWSURFACE3, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DirectDrawBltFlags, "dwFlags"), (LPDDBLTFX, "lpDDBltFx")]),
+    Method(DDRESULT, "BltBatch", [(LPDDBLTBATCH, "lpDDBltBatch"), (DWORD, "dwCount"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "BltFast", [(DWORD, "dwX"), (DWORD, "dwY"), (LPDIRECTDRAWSURFACE3, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DWORD, "dwTrans")]),
+    Method(DDRESULT, "DeleteAttachedSurface", [(DWORD, "dwFlags"), (LPDIRECTDRAWSURFACE3, "lpDDSurface")]),
+    Method(DDRESULT, "EnumAttachedSurfaces", [(LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "EnumOverlayZOrders", [(DirectDrawEnumOverlayZOrderFlags, "dwFlags"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK, "lpfnCallback")]),
+    Method(DDRESULT, "Flip", [(LPDIRECTDRAWSURFACE3, "lpDDSurfaceTargetOverride"), (DirectDrawFlipFlags, "dwFlags")]),
+    Method(DDRESULT, "GetAttachedSurface", [(LPDDSCAPS, "lpDDSCaps"), Out(Pointer(LPDIRECTDRAWSURFACE3), "lplpDDAttachedSurface")]),
+    Method(DDRESULT, "GetBltStatus", [(DirectDrawGetBltStatusFlags, "dwFlags")]),
+    Method(DDRESULT, "GetCaps", [Out(LPDDSCAPS, "lpDDSCaps")]),
+    Method(DDRESULT, "GetClipper", [Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper")]),
+    Method(DDRESULT, "GetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "GetDC", [Out(Pointer(HDC), "phDC")]),
+    Method(DDRESULT, "GetFlipStatus", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "GetOverlayPosition", [Out(LPLONG, "lplX"), Out(LPLONG, "lplY")]),
+    Method(DDRESULT, "GetPalette", [Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette")]),
+    Method(DDRESULT, "GetPixelFormat", [Out(LPDDPIXELFORMAT, "lpDDPixelFormat")]),
+    Method(DDRESULT, "GetSurfaceDesc", [Out(LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "Initialize", [(LPDIRECTDRAW, "lpDD"), (LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "IsLost", []),
+    Method(DDRESULT, "Lock", [(LPRECT, "lpDestRect"), (LPDDSURFACEDESC, "lpDDSurfaceDesc"), (DirectDrawSurfaceLockFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "ReleaseDC", [(HDC, "hDC")]),
+    Method(DDRESULT, "Restore", []),
+    Method(DDRESULT, "SetClipper", [(LPDIRECTDRAWCLIPPER, "lpDDClipper")]),
+    Method(DDRESULT, "SetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "SetOverlayPosition", [(LONG, "lX"), (LONG, "lY")]),
+    Method(DDRESULT, "SetPalette", [(LPDIRECTDRAWPALETTE, "lpDDPalette")]),
+    Method(DDRESULT, "Unlock", [(LPVOID, "lp")]),
+    Method(DDRESULT, "UpdateOverlay", [(LPRECT, "lpSrcRect"), (LPDIRECTDRAWSURFACE3, "lpDDDestSurface"), (LPRECT, "lpDestRect"), (DirectDrawSurfaceOverlayFlags, "dwFlags"), (LPDDOVERLAYFX, "lpDDOverlayFx")]),
+    Method(DDRESULT, "UpdateOverlayDisplay", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "UpdateOverlayZOrder", [(DirectDrawUpdateOverlayZOrderFlags, "dwFlags"), (LPDIRECTDRAWSURFACE3, "lpDDSReference")]),
+    Method(DDRESULT, "GetDDInterface", [Out(Pointer(IUnknown), "lplpDD")]),
+    Method(DDRESULT, "PageLock", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "PageUnlock", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "SetSurfaceDesc", [(LPDDSURFACEDESC, "lpDDSD"), (DWORD, "dwFlags")]),
+]
+
+IDirectDrawSurface4.methods += [
+    Method(DDRESULT, "AddAttachedSurface", [(LPDIRECTDRAWSURFACE4, "lpDDSAttachedSurface")]),
+    Method(DDRESULT, "AddOverlayDirtyRect", [(LPRECT, "lpRect")]),
+    Method(DDRESULT, "Blt", [(LPRECT, "lpDestRect"), (LPDIRECTDRAWSURFACE4, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DirectDrawBltFlags, "dwFlags"), (LPDDBLTFX, "lpDDBltFx")]),
+    Method(DDRESULT, "BltBatch", [(LPDDBLTBATCH, "lpDDBltBatch"), (DWORD, "dwCount"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "BltFast", [(DWORD, "dwX"), (DWORD, "dwY"), (LPDIRECTDRAWSURFACE4, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DWORD, "dwTrans")]),
+    Method(DDRESULT, "DeleteAttachedSurface", [(DWORD, "dwFlags"), (LPDIRECTDRAWSURFACE4, "lpDDSurface")]),
+    Method(DDRESULT, "EnumAttachedSurfaces", [(LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK2, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "EnumOverlayZOrders", [(DirectDrawEnumOverlayZOrderFlags, "dwFlags"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK2, "lpfnCallback")]),
+    Method(DDRESULT, "Flip", [(LPDIRECTDRAWSURFACE4, "lpDDSurfaceTargetOverride"), (DirectDrawFlipFlags, "dwFlags")]),
+    Method(DDRESULT, "GetAttachedSurface", [(LPDDSCAPS2, "lpDDSCaps"), Out(Pointer(LPDIRECTDRAWSURFACE4), "lplpDDAttachedSurface")]),
+    Method(DDRESULT, "GetBltStatus", [(DirectDrawGetBltStatusFlags, "dwFlags")]),
+    Method(DDRESULT, "GetCaps", [Out(LPDDSCAPS2, "lpDDSCaps")]),
+    Method(DDRESULT, "GetClipper", [Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper")]),
+    Method(DDRESULT, "GetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "GetDC", [Out(Pointer(HDC), "phDC")]),
+    Method(DDRESULT, "GetFlipStatus", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "GetOverlayPosition", [Out(LPLONG, "lplX"), Out(LPLONG, "lplY")]),
+    Method(DDRESULT, "GetPalette", [Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette")]),
+    Method(DDRESULT, "GetPixelFormat", [Out(LPDDPIXELFORMAT, "lpDDPixelFormat")]),
+    Method(DDRESULT, "GetSurfaceDesc", [Out(LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "Initialize", [(LPDIRECTDRAW, "lpDD"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "IsLost", []),
+    Method(DDRESULT, "Lock", [(LPRECT, "lpDestRect"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc"), (DirectDrawSurfaceLockFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "ReleaseDC", [(HDC, "hDC")]),
+    Method(DDRESULT, "Restore", []),
+    Method(DDRESULT, "SetClipper", [(LPDIRECTDRAWCLIPPER, "lpDDClipper")]),
+    Method(DDRESULT, "SetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "SetOverlayPosition", [(LONG, "lX"), (LONG, "lY")]),
+    Method(DDRESULT, "SetPalette", [(LPDIRECTDRAWPALETTE, "lpDDPalette")]),
+    Method(DDRESULT, "Unlock", [(LPRECT, "lpRect")]),
+    Method(DDRESULT, "UpdateOverlay", [(LPRECT, "lpSrcRect"), (LPDIRECTDRAWSURFACE4, "lpDDDestSurface"), (LPRECT, "lpDestRect"), (DirectDrawSurfaceOverlayFlags, "dwFlags"), (LPDDOVERLAYFX, "lpDDOverlayFx")]),
+    Method(DDRESULT, "UpdateOverlayDisplay", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "UpdateOverlayZOrder", [(DirectDrawUpdateOverlayZOrderFlags, "dwFlags"), (LPDIRECTDRAWSURFACE4, "lpDDSReference")]),
+    Method(DDRESULT, "GetDDInterface", [Out(Pointer(LPVOID), "lplpDD")]),
+    Method(DDRESULT, "PageLock", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "PageUnlock", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "SetSurfaceDesc", [(LPDDSURFACEDESC2, "lpDDSD"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "SetPrivateData", [(REFGUID, "guidTag"), (LPVOID, "lpData"), (DWORD, "cbSize"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "GetPrivateData", [(REFGUID, "guidTag"), (LPVOID, "lpData"), Out(LPDWORD, "lpcbBufferSize")]),
+    Method(DDRESULT, "FreePrivateData", [(REFGUID, "guidTag")]),
+    Method(DDRESULT, "GetUniquenessValue", [Out(LPDWORD, "lpValue")]),
+    Method(DDRESULT, "ChangeUniquenessValue", []),
+]
+
+IDirectDrawSurface7.methods += [
+    Method(DDRESULT, "AddAttachedSurface", [(LPDIRECTDRAWSURFACE7, "lpDDSAttachedSurface")]),
+    Method(DDRESULT, "AddOverlayDirtyRect", [(LPRECT, "lpRect")]),
+    Method(DDRESULT, "Blt", [(LPRECT, "lpDestRect"), (LPDIRECTDRAWSURFACE7, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DirectDrawBltFlags, "dwFlags"), (LPDDBLTFX, "lpDDBltFx")]),
+    Method(DDRESULT, "BltBatch", [(LPDDBLTBATCH, "lpDDBltBatch"), (DWORD, "dwCount"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "BltFast", [(DWORD, "dwX"), (DWORD, "dwY"), (LPDIRECTDRAWSURFACE7, "lpDDSrcSurface"), (LPRECT, "lpSrcRect"), (DWORD, "dwTrans")]),
+    Method(DDRESULT, "DeleteAttachedSurface", [(DWORD, "dwFlags"), (LPDIRECTDRAWSURFACE7, "lpDDSurface")]),
+    Method(DDRESULT, "EnumAttachedSurfaces", [(LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK7, "lpEnumSurfacesCallback")]),
+    Method(DDRESULT, "EnumOverlayZOrders", [(DirectDrawEnumOverlayZOrderFlags, "dwFlags"), (LPVOID, "lpContext"), (LPDDENUMSURFACESCALLBACK7, "lpfnCallback")]),
+    Method(DDRESULT, "Flip", [(LPDIRECTDRAWSURFACE7, "lpDDSurfaceTargetOverride"), (DirectDrawFlipFlags, "dwFlags")]),
+    Method(DDRESULT, "GetAttachedSurface", [(LPDDSCAPS2, "lpDDSCaps"), Out(Pointer(LPDIRECTDRAWSURFACE7), "lplpDDAttachedSurface")]),
+    Method(DDRESULT, "GetBltStatus", [(DirectDrawGetBltStatusFlags, "dwFlags")]),
+    Method(DDRESULT, "GetCaps", [Out(LPDDSCAPS2, "lpDDSCaps")]),
+    Method(DDRESULT, "GetClipper", [Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper")]),
+    Method(DDRESULT, "GetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "GetDC", [Out(Pointer(HDC), "phDC")]),
+    Method(DDRESULT, "GetFlipStatus", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "GetOverlayPosition", [Out(LPLONG, "lplX"), Out(LPLONG, "lplY")]),
+    Method(DDRESULT, "GetPalette", [Out(Pointer(LPDIRECTDRAWPALETTE), "lplpDDPalette")]),
+    Method(DDRESULT, "GetPixelFormat", [Out(LPDDPIXELFORMAT, "lpDDPixelFormat")]),
+    Method(DDRESULT, "GetSurfaceDesc", [Out(LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "Initialize", [(LPDIRECTDRAW, "lpDD"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
+    Method(DDRESULT, "IsLost", []),
+    Method(DDRESULT, "Lock", [(LPRECT, "lpDestRect"), (LPDDSURFACEDESC2, "lpDDSurfaceDesc"), (DirectDrawSurfaceLockFlags, "dwFlags"), (HANDLE, "hEvent")]),
+    Method(DDRESULT, "ReleaseDC", [(HDC, "hDC")]),
+    Method(DDRESULT, "Restore", []),
+    Method(DDRESULT, "SetClipper", [(LPDIRECTDRAWCLIPPER, "lpDDClipper")]),
+    Method(DDRESULT, "SetColorKey", [(DirectDrawSurfaceSetGetColorKeyFlags, "dwFlags"), Out(LPDDCOLORKEY, "lpDDColorKey")]),
+    Method(DDRESULT, "SetOverlayPosition", [(LONG, "lX"), (LONG, "lY")]),
+    Method(DDRESULT, "SetPalette", [(LPDIRECTDRAWPALETTE, "lpDDPalette")]),
+    Method(DDRESULT, "Unlock", [(LPRECT, "lpRect")]),
+    Method(DDRESULT, "UpdateOverlay", [(LPRECT, "lpSrcRect"), (LPDIRECTDRAWSURFACE7, "lpDDDestSurface"), (LPRECT, "lpDestRect"), (DirectDrawSurfaceOverlayFlags, "dwFlags"), (LPDDOVERLAYFX, "lpDDOverlayFx")]),
+    Method(DDRESULT, "UpdateOverlayDisplay", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "UpdateOverlayZOrder", [(DirectDrawUpdateOverlayZOrderFlags, "dwFlags"), (LPDIRECTDRAWSURFACE7, "lpDDSReference")]),
+    Method(DDRESULT, "GetDDInterface", [Out(Pointer(LPVOID), "lplpDD")]),
+    Method(DDRESULT, "PageLock", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "PageUnlock", [(DWORD, "dwFlags")]),
+    Method(DDRESULT, "SetSurfaceDesc", [(LPDDSURFACEDESC2, "lpDDSD"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "SetPrivateData", [(REFGUID, "guidTag"), (LPVOID, "lpData"), (DWORD, "cbSize"), (DWORD, "dwFlags")]),
+    Method(DDRESULT, "GetPrivateData", [(REFGUID, "guidTag"), (LPVOID, "lpData"), Out(LPDWORD, "lpcbBufferSize")]),
+    Method(DDRESULT, "FreePrivateData", [(REFGUID, "guidTag")]),
+    Method(DDRESULT, "GetUniquenessValue", [Out(LPDWORD, "lpValue")]),
+    Method(DDRESULT, "ChangeUniquenessValue", []),
+    Method(DDRESULT, "SetPriority", [(DWORD, "dwPriority")]),
+    Method(DDRESULT, "GetPriority", [Out(LPDWORD, "lpdwPriority")]),
+    Method(DDRESULT, "SetLOD", [(DWORD, "dwMaxLOD")]),
+    Method(DDRESULT, "GetLOD", [Out(LPDWORD, "lpdwMaxLOD")]),
+]
+
+IDirectDrawColorControl.methods += [
+    Method(DDRESULT, "GetColorControls", [(LPDDCOLORCONTROL, "lpColorControl")]),
+    Method(DDRESULT, "SetColorControls", [(LPDDCOLORCONTROL, "lpColorControl")]),
+]
+
+IDirectDrawGammaControl.methods += [
+    Method(DDRESULT, "GetGammaRamp", [(DWORD, "dwFlags"), Out(LPDDGAMMARAMP, "lpRampData")]),
+    Method(DDRESULT, "SetGammaRamp", [(DirectDrawSetGammaRampFlags, "dwFlags"), (LPDDGAMMARAMP, "lpRampData")]),
+]
+
+LPDDENUMCALLBACKA   = FunctionPointer(BOOL, "LPDDENUMCALLBACKA", [Pointer(GUID), LPSTR, LPSTR, LPVOID])
+LPDDENUMCALLBACKW   = FunctionPointer(BOOL, "LPDDENUMCALLBACKW", [Pointer(GUID), LPWSTR, LPWSTR, LPVOID])
+LPDDENUMCALLBACKEXA = FunctionPointer(BOOL, "LPDDENUMCALLBACKEXA", [Pointer(GUID), LPSTR, LPSTR, LPVOID, HMONITOR])
+LPDDENUMCALLBACKEXW = FunctionPointer(BOOL, "LPDDENUMCALLBACKEXW", [Pointer(GUID), LPWSTR, LPWSTR, LPVOID, HMONITOR])
+
+DDENUM = Flags(DWORD, [
+    "DDENUM_ATTACHEDSECONDARYDEVICES",
+    "DDENUM_DETACHEDSECONDARYDEVICES",
+    "DDENUM_NONDISPLAYDEVICES",
+])
+
+DDCREATE = Flags(DWORD, [
+    "DDCREATE_HARDWAREONLY",
+    "DDCREATE_EMULATIONONLY",
+])
+
+ddraw = API("ddraw")
+ddraw.add_functions([
+    StdFunction(HRESULT, "DirectDrawEnumerateW", [(LPDDENUMCALLBACKW, "lpCallback"), (LPVOID, "lpContext")]),
+    StdFunction(HRESULT, "DirectDrawEnumerateA", [(LPDDENUMCALLBACKA, "lpCallback"), (LPVOID, "lpContext")]),
+    StdFunction(HRESULT, "DirectDrawEnumerateExW", [(LPDDENUMCALLBACKEXW, "lpCallback"), (LPVOID, "lpContext"), (DDENUM, "dwFlags")]),
+    StdFunction(HRESULT, "DirectDrawEnumerateExA", [(LPDDENUMCALLBACKEXA, "lpCallback"), (LPVOID, "lpContext"), (DDENUM, "dwFlags")]),
+    StdFunction(HRESULT, "DirectDrawCreate", [(Pointer(GUID), "lpGUID"), Out(Pointer(LPDIRECTDRAW), "lplpDD"), (Pointer(IUnknown), "pUnkOuter")]),
+    StdFunction(HRESULT, "DirectDrawCreateEx", [(Pointer(GUID), "lpGuid"), Out(Pointer(LPVOID), "lplpDD"), (REFIID, "iid"), (Pointer(IUnknown), "pUnkOuter")]),
+    StdFunction(HRESULT, "DirectDrawCreateClipper", [(DWORD, "dwFlags"), Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper"), (Pointer(IUnknown), "pUnkOuter")]),
+    StdFunction(Void, "AcquireDDThreadLock", []),
+    StdFunction(Void, "ReleaseDDThreadLock", []),
+    StdFunction(DWORD, "D3DParseUnknownCommand", [(LPVOID, "lpCmd"), Out(Pointer(LPVOID), "lpRetCmd")]),
+    StdFunction(HRESULT, "DllCanUnloadNow", []),
+    StdFunction(HRESULT, "DllGetClassObject", [(REFCLSID, "rclsid"), (REFIID, "riid"), Out(Pointer(OpaquePointer(Void)), "ppv")]),
+
+    # XXX
+    StdFunction(HRESULT, "CompleteCreateSysmemSurface", [Int, Int]),
+    StdFunction(HRESULT, "GetSurfaceFromDC", [Int, Int, Int]),
+    StdFunction(HRESULT, "DDInternalLock", [Int, Int]),
+    StdFunction(HRESULT, "DDInternalUnlock", [Int]),
+    StdFunction(HRESULT, "DSoundHelp", [HWND, Int, Int]),
+    StdFunction(HRESULT, "GetDDSurfaceLocal", [Int, Int, Int]),
+    StdFunction(HANDLE, "GetOLEThunkData", [Int]),
+    StdFunction(HRESULT, "RegisterSpecialCase", [Int, Int, Int, Int]),
+    StdFunction(HRESULT, "DDGetAttachedSurfaceLcl", [Int, Int, Int]),
+
+    # TODO: SetAppCompatData
+])
+