DirectDraw Object struct DDRAWI_DIRECTDRAW_INT it is the the return pointer from ddraw.dll to the program DDRAWI_DIRECTDRAW_LCL It is the program own private data DDRAWI_DIRECTDRAW_GBL This struct is gboal for whole ddraw.dll for all program it is static in ddraw if it change it change for all program The struct from http://msdn2.microsoft.com/en-us/library/ms898267.aspx it was not document for windows 2000/xp/2003 but ms did document it for windows ce 5.0 the link are to windows ce 5.0 arch typedef struct _DDRAWI_DIRECTDRAW_INT { LPVOID lpVtbl; LPDDRAWI_DIRECTDRAW_LCL lpLcl; LPDDRAWI_DIRECTDRAW_INT lpLink; DWORD dwIntRefCnt; } DDRAWI_DIRECTDRAW_INT; Rest of the struct are from msdn for windows 2000/xp/2003 typedef struct _DDRAWI_DIRECTDRAW_LCL { DWORD lpDDMore; LPDDRAWI_DIRECTDRAW_GBL lpGbl; // fill it from function Create_DirectDraw with static pointer ddgbl DWORD dwUnused0; DWORD dwLocalFlags; DWORD dwLocalRefCnt; DWORD dwProcessId; IUnknown FAR *pUnkOuter; DWORD dwObsolete1; ULONG_PTR hWnd; ULONG_PTR hDC; // create HDC and save it to this pointer DWORD dwErrorMode; LPDDRAWI_DDRAWSURFACE_INT lpPrimary; // The primary surface LPDDRAWI_DDRAWSURFACE_INT lpCB; DWORD dwPreferredMode; HINSTANCE hD3DInstance; IUnknown FAR *pD3DIUnknown; LPDDHAL_CALLBACKS lpDDCB; // same memory pointer as DDRAWI_DIRECTDRAW_GBL->lpDDCBtmp, setup by function StartDirectDraw ULONG_PTR hDDVxd; DWORD dwAppHackFlags; ULONG_PTR hFocusWnd; DWORD dwHotTracking; DWORD dwIMEState; ULONG_PTR hWndPopup; ULONG_PTR hDD; // from Gdientry1 copy the _DDRAWI_DIRECTDRAW_GBL hDD after startup then copy this back each time we need hDD ULONG_PTR hGammaCalibrator; LPDDGAMMACALIBRATORPROC lpGammaCalibrator; } DDRAWI_DIRECTDRAW_LCL; 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; // list of all created directdraw surface, it is a pointer list LPDDRAWI_DDRAWPALETTE_INT palList; LPDDRAWI_DDRAWCLIPPER_INT clipperList; LPDDRAWI_DIRECTDRAW_GBL lp16DD; // pointer to it self (DDRAWI_DIRECTDRAW_GBL) DWORD dwMaxOverlays; DWORD dwCurrOverlays; DWORD dwMonitorFrequency; // current mointor freq, (nivida always set this to 0, it is a bug in nvida drv) DDCORECAPS ddHELCaps; DWORD dwUnused2[50]; DDCOLORKEY ddckCKDestOverlay; DDCOLORKEY ddckCKSrcOverlay; VIDMEMINFO vmiData; LPVOID lpDriverHandle; LPDDRAWI_DIRECTDRAW_LCL lpExclusiveOwner; // which local directdraw comobject is in Exclusive mode and own this DWORD dwModeIndex; DWORD dwModeIndexOrig; DWORD dwNumFourCC; DWORD FAR *lpdwFourCC; DWORD dwNumModes; LPDDHALMODEINFO lpModeInfo; PROCESS_LIST plProcessList; DWORD dwSurfaceLockCount; DWORD dwAliasedLockCnt; ULONG_PTR dwReserved3; ULONG_PTR hDD; // GdiEntry1 are filling this pointer char cObsolete[12]; DWORD dwReserved1; DWORD dwReserved2; DBLNODE dbnOverlayRoot; volatile LPWORD lpwPDeviceFlags; DWORD dwPDevice; DWORD dwWin16LockCnt; DWORD dwUnused3; DWORD hInstance; DWORD dwEvent16; DWORD dwSaveNumModes; ULONG_PTR lpD3DGlobalDriverData; ULONG_PTR lpD3DHALCallbacks; DDCORECAPS ddBothCaps; 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; DWORD dwDOSBoxEvent; RECT rectDesktop; char cDriverName[MAX_DRIVER_NAME]; // driver name, if we send in CreateDirectDraw(NULL, ...) this will be fill in the name "display" ULONG_PTR lpD3DHALCallbacks3; DWORD dwNumZPixelFormats; LPDDPIXELFORMAT lpZPixelFormats; LPDDRAWI_DDMOTIONCOMP_INT mcList; DWORD hDDVxd; DDSCAPSEX ddsCapsMore; } DDRAWI_DIRECTDRAW_GBL; Clipper Object struct DDRAWI_DDRAWCLIPPER_INT It is the the return pointer from ddraw.dll to the program DDRAWI_DDRAWCLIPPER_LCL It is the program own private data DDRAWI_DDRAWCLIPPER_GBL This struct is gboal for whole ddraw.dll for all program it is static in ddraw if it change it change for all program The struct typedef struct _DDRAWI_DDRAWCLIPPER_INT { LPVOID lpVtbl; LPDDRAWI_DDRAWCLIPPER_LCL lpLcl; LPDDRAWI_DDRAWCLIPPER_INT lpLink; DWORD dwIntRefCnt; } DDRAWI_DDRAWCLIPPER_INT; typedef struct _DDRAWI_DDRAWCLIPPER_LCL { DWORD lpClipMore; LPDDRAWI_DDRAWCLIPPER_GBL lpGbl; LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl; DWORD dwLocalRefCnt; IUnknown FAR *pUnkOuter; LPDDRAWI_DIRECTDRAW_INT lpDD_int; ULONG_PTR dwReserved1; IUnknown *pAddrefedThisOwner; } 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 struct _DDRAWI_DDRAWPALETTE_INT { LPVOID lpVtbl; LPDDRAWI_DDRAWPALETTE_LCL lpLcl; LPDDRAWI_DDRAWPALETTE_INT lpLink; DWORD dwIntRefCnt; } DDRAWI_DDRAWPALETTE_INT; typedef struct _DDRAWI_DDRAWPALETTE_LCL { DWORD lpPalMore; LPDDRAWI_DDRAWPALETTE_GBL lpGbl; ULONG_PTR dwUnused0; DWORD dwLocalRefCnt; IUnknown FAR *pUnkOuter; LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl; ULONG_PTR dwReserved1; ULONG_PTR dwDDRAWReserved1; ULONG_PTR dwDDRAWReserved2; ULONG_PTR dwDDRAWReserved3; } DDRAWI_DDRAWPALETTE_LCL; typedef struct _DDRAWI_DDRAWPALETTE_GBL { DWORD dwRefCnt; DWORD dwFlags; LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl; DWORD dwProcessId; LPPALETTEENTRY lpColorTable; union { ULONG_PTR dwReserved1; HPALETTE hHELGDIPalette; }; DWORD dwDriverReserved; DWORD dwContentsStamp; DWORD dwSaveStamp; DWORD dwHandle; } DDRAWI_DDRAWPALETTE_GBL; 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_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; } DDRAWI_DDVIDEOPORT_LCL; Surface: typedef struct _DDRAWI_DDRAWSURFACE_GBL { DWORD dwRefCnt; DWORD dwGlobalFlags; union { LPACCESSRECTLIST lpRectList; DWORD dwBlockSizeY; }; union { LPVMEMHEAP lpVidMemHeap; DWORD dwBlockSizeX; }; union { LPDDRAWI_DIRECTDRAW_GBL lpDD; LPVOID lpDDHandle; }; FLATPTR fpVidMem; union { LONG lPitch; DWORD dwLinearSize; }; WORD wHeight; WORD wWidth; DWORD dwUsageCount; ULONG_PTR dwReserved1; DDPIXELFORMAT ddpfSurface; } DDRAWI_DDRAWSURFACE_GBL; The following informations might be incorrectly I am using logic thinking since the info does not exists in MSDN so I am drawing clue how previews stuffs works that are document in MSDN/DDK follow struct should exists ??? DDRAWI_DDVIDEOPORT_GBL DDRAWI_DDGAMMACONTROL_INT DDRAWI_DDGAMMACONTROL_LCL DDRAWI_DDGAMMACONTROL_GBL DDRAWI_DDCOLORCONTROL_INT DDRAWI_DDCOLORCONTROL_LCL DDRAWI_DDCOLORCONTROL_GBL DDRAWI_KERNEL_INT DDRAWI_KERNEL_LCL DDRAWI_KERNEL_GBL DDRAWI_DDKERNELSURFACE_INT DDRAWI_DDKERNELSURFACE_LCL DDRAWI_DDKERNELSURFACE_GBL follow struct can be easy create DDRAWI_DDGAMMACONTROL_INT DDRAWI_DDCOLORCONTROL_INT DDRAWI_KERNEL_INT the DDRAWI_DDGAMMACONTROL_INT should looking like this typedef struct _DDRAWI_DDGAMMACONTROL_INT { LPVOID lpVtbl; LPDDRAWI_DDGAMMACONTROL_LCL lpLcl; LPDDRAWI_DDGAMMACONTROL_INT lpLink; DWORD dwIntRefCnt; } DDRAWI_DDGAMMACONTROL_INT, *LPDDRAWI_DDGAMMACONTROL_INT how did I got this struct I looked at all other INT struct how they where build. But it is not 100% sure this one is right untill I/we known how the DDRAWI_DDGAMMACONTROL_LCL works and DDRAWI_DDCOLORCONTROL_GBL our internal struct will look like this typedef struct _DDRAWI_DDGAMMACONTROL_INT { LPVOID lpVtbl; LPVOID lpLcl; LPVOID lpLink; DWORD dwIntRefCnt; } DDRAWI_DDGAMMACONTROL_INT, *LPDDRAWI_DDGAMMACONTROL_INT same goes for DDRAWI_DDCOLORCONTROL_INT typedef struct DDRAWI_DDCOLORCONTROL_INT { LPVOID lpVtbl; LPVOID lpLcl; LPVOID lpLink; DWORD dwIntRefCnt; } DDRAWI_DDCOLORCONTROL_INT, *LPDDRAWI_DDCOLORCONTROL_INT