* Made it possible to include both d3d9types.h and ddrawgdi.h at the same time
[reactos.git] / reactos / dll / directx / ddraw / startup.c
index 753bd89..ef660ef 100644 (file)
  * COPYRIGHT:            See COPYING in the top level directory
  * PROJECT:              ReactOS kernel
  * FILE:                 lib/ddraw/ddraw.c
- * PURPOSE:              DirectDraw Library 
+ * PURPOSE:              DirectDraw Library
  * PROGRAMMER:           Magnus Olsen (greatlrd)
  *
  */
 
-#include <windows.h>
 #include "rosdraw.h"
-#include "d3dhal.h"
 
+DDRAWI_DIRECTDRAW_GBL ddgbl;
+DDRAWI_DDRAWSURFACE_GBL ddSurfGbl;
 
-HRESULT WINAPI 
-StartDirectDraw(LPDIRECTDRAW* iface)
+WCHAR classname[128];
+WNDCLASSW wnd_class;
+
+
+HRESULT WINAPI
+Create_DirectDraw (LPGUID pGUID, LPDIRECTDRAW* pIface,
+                   REFIID id, BOOL reenable)
 {
-       IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-    DWORD hal_ret;
-    DWORD hel_ret;
-    DEVMODE devmode;
-    HBITMAP hbmp;
-    const UINT bmiSize = sizeof(BITMAPINFOHEADER) + 0x10;
-    UCHAR *pbmiData;
-    BITMAPINFO *pbmi;    
-    DWORD *pMasks;
-       DWORD Flags;
-    
+    LPDDRAWI_DIRECTDRAW_INT This;
+
     DX_WINDBG_trace();
-         
-       RtlZeroMemory(&This->mDDrawGlobal, sizeof(DDRAWI_DIRECTDRAW_GBL));
-       
-       /* cObsolete is undoc in msdn it being use in CreateDCA */
-       RtlCopyMemory(&This->mDDrawGlobal.cObsolete,&"DISPLAY",7);
-       RtlCopyMemory(&This->mDDrawGlobal.cDriverName,&"DISPLAY",7);
-       
-    /* Same for HEL and HAL */
-    This->mcModeInfos = 1;
-    This->mpModeInfos = (DDHALMODEINFO*) DxHeapMemAlloc(This->mcModeInfos * sizeof(DDHALMODEINFO));  
-   
-    if (This->mpModeInfos == NULL)
+
+    if ((IsBadReadPtr(pIface,sizeof(LPDIRECTDRAW))) ||
+       (IsBadWritePtr(pIface,sizeof(LPDIRECTDRAW))))
     {
-          DX_STUB_str("DD_FALSE");
-       return DD_FALSE;
+        return DDERR_INVALIDPARAMS;
     }
 
-    EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    This = (LPDDRAWI_DIRECTDRAW_INT)*pIface;
+
+    /* fixme linking too second link when we shall not doing it */
+    if (IsBadReadPtr(This,sizeof(LPDIRECTDRAW)))
+    {
+        /* We do not have a DirectDraw interface, we need alloc it*/
+        LPDDRAWI_DIRECTDRAW_INT memThis;
 
-    This->mpModeInfos[0].dwWidth      = devmode.dmPelsWidth;
-    This->mpModeInfos[0].dwHeight     = devmode.dmPelsHeight;
-    This->mpModeInfos[0].dwBPP        = devmode.dmBitsPerPel;
-    This->mpModeInfos[0].lPitch       = (devmode.dmPelsWidth*devmode.dmBitsPerPel)/8;
-    This->mpModeInfos[0].wRefreshRate = (WORD)devmode.dmDisplayFrequency;
-   
-    This->hdc = CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL);    
+        DX_STUB_str("1. no linking\n");
 
-    if (This->hdc == NULL)
+        DxHeapMemAlloc(memThis, sizeof(DDRAWI_DIRECTDRAW_INT));
+        if (memThis == NULL)
+        {
+            return DDERR_OUTOFMEMORY;
+        }
+
+        This = memThis;
+
+        /* Fixme release memory alloc if we fail */
+
+        DxHeapMemAlloc(This->lpLcl, sizeof(DDRAWI_DIRECTDRAW_LCL));
+        if (This->lpLcl == NULL)
+        {
+            return DDERR_OUTOFMEMORY;
+        }
+    }
+    else
     {
-          DX_STUB_str("DDERR_OUTOFMEMORY");
-       return DDERR_OUTOFMEMORY ;
+        /* We got the DirectDraw interface alloc and we need create the link */
+        LPDDRAWI_DIRECTDRAW_INT  newThis;
+
+        DX_STUB_str("2.linking\n");
+
+        /* step 1.Alloc the new  DDRAWI_DIRECTDRAW_INT for the lnking */
+        DxHeapMemAlloc(newThis, sizeof(DDRAWI_DIRECTDRAW_INT));
+        if (newThis == NULL)
+        {
+            return DDERR_OUTOFMEMORY;
+        }
+
+        /* step 2 check if it not DDCREATE_HARDWAREONLY we got if so we fail */
+        if ((pGUID) && (pGUID != (LPGUID)DDCREATE_HARDWAREONLY))
+        {
+            if (pGUID !=NULL)
+            {
+                This = newThis;
+                return DDERR_INVALIDDIRECTDRAWGUID;
+            }
+        }
+
+        /* step 3 do the link the old interface are store in the new one */
+        newThis->lpLink = This;
+
+        /* step 4 we need create new local directdraw struct for the new linked interface */
+        DxHeapMemAlloc(newThis->lpLcl, sizeof(DDRAWI_DIRECTDRAW_LCL));
+        if (newThis->lpLcl == NULL)
+        {
+            This = newThis;
+            return DDERR_OUTOFMEMORY;
+        }
+
+        This = newThis;
     }
 
-    hbmp = CreateCompatibleBitmap(This->hdc, 1, 1);  
-    if (hbmp==NULL)
+    This->lpLcl->lpGbl = &ddgbl;
+
+    *pIface = (LPDIRECTDRAW)This;
+
+    /* Get right interface we whant */
+
+    This->lpVtbl = 0;
+    if (IsEqualGUID(&IID_IDirectDraw7, id))
+    {
+        /* DirectDraw7 Vtable */
+        This->lpVtbl = &DirectDraw7_Vtable;
+        This->lpLcl->dwLocalFlags = This->lpLcl->dwLocalFlags + DDRAWILCL_DIRECTDRAW7;
+        *pIface = (LPDIRECTDRAW)&This->lpVtbl;
+        Main_DirectDraw_AddRef(This);
+    }
+    else if (IsEqualGUID(&IID_IDirectDraw4, id))
+    {
+        /* DirectDraw4 Vtable */
+        This->lpVtbl = &DirectDraw4_Vtable;
+        *pIface = (LPDIRECTDRAW)&This->lpVtbl;
+        Main_DirectDraw_AddRef(This);
+    }
+    else if (IsEqualGUID(&IID_IDirectDraw2, id))
+    {
+        /* DirectDraw2 Vtable */
+        This->lpVtbl = &DirectDraw2_Vtable;
+        *pIface = (LPDIRECTDRAW)&This->lpVtbl;
+        Main_DirectDraw_AddRef(This);
+    }
+    else if (IsEqualGUID(&IID_IDirectDraw, id))
     {
-       DxHeapMemFree(This->mpModeInfos);
-       DeleteDC(This->hdc);
-          DX_STUB_str("DDERR_OUTOFMEMORY");
-       return DDERR_OUTOFMEMORY;
+        /* DirectDraw Vtable */
+        This->lpVtbl = &DirectDraw_Vtable;
+        *pIface = (LPDIRECTDRAW)&This->lpVtbl;
+        Main_DirectDraw_AddRef(This);
     }
-  
-    pbmiData = (UCHAR *) DxHeapMemAlloc(bmiSize);
-    pbmi = (BITMAPINFO*)pbmiData;
 
-    if (pbmiData==NULL)
+    if ( This->lpVtbl != 0)
     {
-       DxHeapMemFree(This->mpModeInfos);       
-       DeleteDC(This->hdc);
-       DeleteObject(hbmp);
-          DX_STUB_str("DDERR_OUTOFMEMORY");
-       return DDERR_OUTOFMEMORY;
+        DX_STUB_str("Got iface\n");
+
+        if (StartDirectDraw((LPDIRECTDRAW)This, pGUID, FALSE) == DD_OK);
+        {
+            /*
+            RtlZeroMemory(&wnd_class, sizeof(wnd_class));
+            wnd_class.style = CS_HREDRAW | CS_VREDRAW;
+            wnd_class.lpfnWndProc = DefWindowProcW;
+            wnd_class.cbClsExtra = 0;
+            wnd_class.cbWndExtra = 0;
+            wnd_class.hInstance = GetModuleHandleW(0);
+            wnd_class.hIcon = 0;
+            wnd_class.hCursor = 0;
+            wnd_class.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
+            wnd_class.lpszMenuName = NULL;
+            wnd_class.lpszClassName = classname;
+            if(!RegisterClassW(&wnd_class))
+            {
+                DX_STUB_str("DDERR_GENERIC");
+                return DDERR_GENERIC;
+            }
+            */
+            This->lpLcl->hDD = ddgbl.hDD;
+            return DD_OK;
+        }
     }
 
-    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-    pbmi->bmiHeader.biBitCount = (WORD)devmode.dmBitsPerPel;
-    pbmi->bmiHeader.biCompression = BI_BITFIELDS;
-    pbmi->bmiHeader.biWidth = 1;
-    pbmi->bmiHeader.biHeight = 1;
+    return DDERR_INVALIDPARAMS;
+}
+
+
+HRESULT WINAPI
+StartDirectDraw(LPDIRECTDRAW iface, LPGUID lpGuid, BOOL reenable)
+{
+    LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
+    DWORD hal_ret = DD_FALSE;
+    DWORD hel_ret = DD_FALSE;
+    DWORD devicetypes = 0;
+    DWORD dwFlags = 0;
 
-    GetDIBits(This->hdc, hbmp, 0, 0, NULL, pbmi, 0);
-    DeleteObject(hbmp);
 
-    pMasks = (DWORD*)(pbmiData + sizeof(BITMAPINFOHEADER));
-    This->mpModeInfos[0].dwRBitMask = pMasks[0];
-    This->mpModeInfos[0].dwGBitMask = pMasks[1];
-    This->mpModeInfos[0].dwBBitMask = pMasks[2];
-    This->mpModeInfos[0].dwAlphaBitMask = pMasks[3];
+    DX_WINDBG_trace();
 
-       DxHeapMemFree(pbmiData);
+
+    /*
+     * ddgbl.dwPDevice  is not longer in use in windows 2000 and higher
+     * I am using it for device type
+     * devicetypes = 1 : both hal and hel are enable
+     * devicetypes = 2 : both hal are enable
+     * devicetypes = 3 : both hel are enable
+     * devicetypes = 4 :loading a guid drv from the register
+     */
+
+    ddgbl.lpDriverHandle = &ddgbl;
+    ddgbl.hDDVxd = -1;
+
+
+
+
+    if (reenable == FALSE)
+    {
+        if ((!IsBadReadPtr(This->lpLink,sizeof(LPDIRECTDRAW))) && (This->lpLink == NULL))
+        {
+            RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
+            This->lpLcl->lpGbl->dwRefCnt++;
+            if (ddgbl.lpDDCBtmp == NULL)
+            {
+                // LPDDHAL_CALLBACKS
+                DxHeapMemAlloc( ddgbl.lpDDCBtmp , sizeof(DDHAL_CALLBACKS));
+                if (ddgbl.lpDDCBtmp == NULL)
+                {
+                    DX_STUB_str("Out of memmory\n");
+                    return DD_FALSE;
+                }
+            }
+        }
+
+        DxHeapMemAlloc(ddgbl.lpModeInfo, sizeof(DDHALMODEINFO));
+        if (!ddgbl.lpModeInfo)
+        {
+            return DDERR_OUTOFMEMORY;
+        }
+
+    }
+    /* Windows handler are by set of SetCooperLevel
+     * so do not set it
+     */
+
+    if (reenable == FALSE)
+    {
+        if (lpGuid == NULL)
+        {
+            devicetypes= 1;
+
+            /* Create HDC for default, hal and hel driver */
+            // This->lpLcl->hWnd = (ULONG_PTR) GetActiveWindow();
+            This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
+
+            /* cObsolete is undoc in msdn it being use in CreateDCA */
+            RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
+            RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
+            dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
+
+
+        }
+        else if (lpGuid == (LPGUID) DDCREATE_HARDWAREONLY)
+        {
+            devicetypes = 2;
+            /* Create HDC for default, hal driver */
+            // This->lpLcl->hWnd =(ULONG_PTR) GetActiveWindow();
+            This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
+
+            /* cObsolete is undoc in msdn it being use in CreateDCA */
+            RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
+            RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
+            dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
+        }
+        else if (lpGuid == (LPGUID) DDCREATE_EMULATIONONLY)
+        {
+            devicetypes = 3;
+
+            /* Create HDC for default, hal and hel driver */
+            //This->lpLcl->hWnd = (ULONG_PTR) GetActiveWindow();
+            This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
+
+            /* cObsolete is undoc in msdn it being use in CreateDCA */
+            RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
+            RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
+
+            dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
+        }
+        else
+        {
+            /* FIXME : need getting driver from the GUID that have been pass in from
+             * the register. we do not support that yet
+             */
+             devicetypes = 4;
+             //This->lpLcl->hDC = (ULONG_PTR) NULL ;
+             //This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
+        }
+
+        /*
+        if ( (HDC)This->lpLcl->hDC == NULL)
+        {
+            DX_STUB_str("DDERR_OUTOFMEMORY\n");
+            return DDERR_OUTOFMEMORY ;
+        }
+        */
+    }
+
+    This->lpLcl->lpDDCB = ddgbl.lpDDCBtmp;
 
     /* Startup HEL and HAL */
-    RtlZeroMemory(&This->mDDrawGlobal, sizeof(DDRAWI_DIRECTDRAW_GBL));
-    RtlZeroMemory(&This->mHALInfo, sizeof(DDHALINFO));
-    RtlZeroMemory(&This->mCallbacks, sizeof(DDHAL_CALLBACKS));
+    This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
+    This->lpLcl->dwProcessId = GetCurrentProcessId();
 
-    This->mDDrawLocal.lpDDCB = &This->mCallbacks;
-    This->mDDrawLocal.lpGbl = &This->mDDrawGlobal;
-    This->mDDrawLocal.dwProcessId = GetCurrentProcessId();
+    switch (devicetypes)
+    {
+            case 2:
+              hal_ret = StartDirectDrawHal(iface, reenable);
+              This->lpLcl->lpDDCB->HELDD.dwFlags = 0;
+              break;
+
+            case 3:
+              hel_ret = StartDirectDrawHel(iface, reenable);
+              This->lpLcl->lpDDCB->HALDD.dwFlags = 0;
+              break;
+
+            default:
+              hal_ret = StartDirectDrawHal(iface, reenable);
+              hel_ret = StartDirectDrawHel(iface, reenable);
+    }
+
+    if (hal_ret!=DD_OK)
+    {
+        if (hel_ret!=DD_OK)
+        {
+            DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT\n");
+            return DDERR_NODIRECTDRAWSUPPORT;
+        }
+        dwFlags |= DDRAWI_NOHARDWARE;
+    }
 
-    This->mDDrawGlobal.lpDDCBtmp = &This->mCallbacks;
-    This->mDDrawGlobal.lpExclusiveOwner = &This->mDDrawLocal;
+    if (hel_ret!=DD_OK)
+    {
+        dwFlags |= DDRAWI_NOEMULATION;
 
-    hal_ret = StartDirectDrawHal(iface);
-       hel_ret = StartDirectDrawHel(iface);    
-    if ((hal_ret!=DD_OK) &&  (hel_ret!=DD_OK))
+    }
+    else
     {
-               DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
-        return DDERR_NODIRECTDRAWSUPPORT; 
+        dwFlags |= DDRAWI_EMULATIONINITIALIZED;
     }
 
-    /* 
-       Setup HEL or HAL for DD_CALLBACKS 
-    */ 
-            
-    This->mDdCanCreateSurface.lpDD = &This->mDDrawGlobal;
-       This->mDdCreatePalette.lpDD = &This->mDDrawGlobal;
-       This->mDdCreateSurface.lpDD = &This->mDDrawGlobal;
-       This->mDdFlipToGDISurface.lpDD = &This->mDDrawGlobal;
-       This->mDdDestroyDriver.lpDD = &This->mDDrawGlobal;
-       This->mDdGetScanLine.lpDD = &This->mDDrawGlobal;
-    This->mDdSetExclusiveMode.lpDD = &This->mDDrawGlobal;
-       This->mDdSetMode.lpDD = &This->mDDrawGlobal;
-       This->mDdWaitForVerticalBlank.lpDD = &This->mDDrawGlobal;
-       This->mDdSetColorKey.lpDD = &This->mDDrawGlobal;
-       
-       if (This->devicetype!=1)
-       {
-               /* both or only hel */
-               This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface;   
-               This->mDdCreatePalette.CreatePalette = This->mCallbacks.HELDD.CreatePalette;    
-               This->mDdCreateSurface.CreateSurface = This->mCallbacks.HELDD.CreateSurface;    
-               This->mDdDestroyDriver.DestroyDriver = This->mCallbacks.HELDD.DestroyDriver;    
-               This->mDdFlipToGDISurface.FlipToGDISurface = This->mCallbacks.HELDD.FlipToGDISurface;           
-               This->mDdGetScanLine.GetScanLine = This->mCallbacks.HELDD.GetScanLine; 
-               This->mDdSetExclusiveMode.SetExclusiveMode = This->mCallbacks.HELDD.SetExclusiveMode;                   
-               This->mDdSetMode.SetMode = This->mCallbacks.HELDD.SetMode;              
-               This->mDdWaitForVerticalBlank.WaitForVerticalBlank = This->mCallbacks.HELDD.WaitForVerticalBlank;       
-               // This->mDdSetColorKey.SetColorKey = This->mCallbacks.HELDD.SetColorKey;  
-       }
-       
-    if (This->devicetype!=2)
-       {
-               Flags = This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags;    
-               if (Flags & DDHAL_CB32_CANCREATESURFACE) 
-               {
-                       This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface;  
-               }
-       
-               if (Flags & DDHAL_CB32_CREATEPALETTE) 
-               {
-                       This->mDdCreatePalette.CreatePalette = This->mCallbacks.HALDD.CreatePalette;  
-               }
-       
-               if (Flags & DDHAL_CB32_CREATESURFACE) 
-               {
-                       This->mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface;  
-               }
-       
-               if (Flags & DDHAL_CB32_DESTROYDRIVER) 
-               {
-                       This->mDdDestroyDriver.DestroyDriver = This->mCallbacks.HALDD.DestroyDriver;  
-               }
-       
-               if (Flags & DDHAL_CB32_FLIPTOGDISURFACE) 
-               {
-                       This->mDdFlipToGDISurface.FlipToGDISurface = This->mCallbacks.HALDD.FlipToGDISurface; 
-               }
-       
-               if (Flags & DDHAL_CB32_GETSCANLINE) 
-               {
-                       This->mDdGetScanLine.GetScanLine = This->mCallbacks.HALDD.GetScanLine; 
-               }
-       
-               if (Flags & DDHAL_CB32_SETEXCLUSIVEMODE) 
-               {
-                       This->mDdSetExclusiveMode.SetExclusiveMode = This->mCallbacks.HALDD.SetExclusiveMode; 
-               }
-       
-               if (Flags & DDHAL_CB32_SETMODE) 
-               {
-                       This->mDdSetMode.SetMode = This->mCallbacks.HALDD.SetMode; 
-               }
-       
-               if (Flags & DDHAL_CB32_WAITFORVERTICALBLANK) 
-               {
-                       This->mDdWaitForVerticalBlank.WaitForVerticalBlank = This->mCallbacks.HALDD.WaitForVerticalBlank;  
-               }
-
-               if (Flags & DDHAL_CB32_SETCOLORKEY) 
-               {
-                       // This->mDdSetColorKey.SetColorKey = This->mCallbacks.HALDD.SetColorKey;  
-               }
-       }
-
-       /* 
-       Setup HEL or HAL for SURFACE CALLBACK 
-    */ 
-
-       // FIXME
-    
-    /* Setup calback struct so we do not need refill same info again */
-    This->mDdCreateSurface.lpDD = &This->mDDrawGlobal;    
-    This->mDdCanCreateSurface.lpDD = &This->mDDrawGlobal;  
-                  
+    /* Fill some basic info for Surface */
+    This->lpLcl->lpGbl->dwFlags =  This->lpLcl->lpGbl->dwFlags | dwFlags | DDRAWI_ATTACHEDTODESKTOP;
+    This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
+    This->lpLcl->hDD = ddgbl.hDD;
+
+    ddgbl.rectDevice.top = 0;
+    ddgbl.rectDevice.left = 0;
+    ddgbl.rectDevice.right = ddgbl.vmiData.dwDisplayWidth;
+    ddgbl.rectDevice.bottom = ddgbl.vmiData.dwDisplayHeight;
+
+    ddgbl.rectDesktop.top = 0;
+    ddgbl.rectDesktop.left = 0;
+    ddgbl.rectDesktop.right = ddgbl.vmiData.dwDisplayWidth;
+    ddgbl.rectDesktop.bottom = ddgbl.vmiData.dwDisplayHeight;
+
+    ddgbl.dwMonitorFrequency = GetDeviceCaps(GetWindowDC(NULL),VREFRESH);
+    ddgbl.lpModeInfo->dwWidth      = ddgbl.vmiData.dwDisplayWidth;
+    ddgbl.lpModeInfo->dwHeight     = ddgbl.vmiData.dwDisplayHeight;
+    ddgbl.lpModeInfo->dwBPP        = ddgbl.vmiData.ddpfDisplay.dwRGBBitCount;
+    ddgbl.lpModeInfo->lPitch       = ddgbl.vmiData.lDisplayPitch;
+    ddgbl.lpModeInfo->wRefreshRate = ddgbl.dwMonitorFrequency;
+    ddgbl.lpModeInfo->dwRBitMask = ddgbl.vmiData.ddpfDisplay.dwRBitMask;
+    ddgbl.lpModeInfo->dwGBitMask = ddgbl.vmiData.ddpfDisplay.dwGBitMask;
+    ddgbl.lpModeInfo->dwBBitMask = ddgbl.vmiData.ddpfDisplay.dwBBitMask;
+    ddgbl.lpModeInfo->dwAlphaBitMask = ddgbl.vmiData.ddpfDisplay.dwRGBAlphaBitMask;
+
     return DD_OK;
 }
 
 
-HRESULT WINAPI 
-StartDirectDrawHal(LPDIRECTDRAW* iface)
+HRESULT WINAPI
+StartDirectDrawHel(LPDIRECTDRAW iface, BOOL reenable)
 {
-    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+    LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
+
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.CanCreateSurface     = HelDdCanCreateSurface;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.CreateSurface        = HelDdCreateSurface;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.CreatePalette        = HelDdCreatePalette;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.DestroyDriver        = HelDdDestroyDriver;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.FlipToGDISurface     = HelDdFlipToGDISurface;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.GetScanLine          = HelDdGetScanLine;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.SetColorKey          = HelDdSetColorKey;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.SetExclusiveMode     = HelDdSetExclusiveMode;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.SetMode              = HelDdSetMode;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank;
+
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.dwFlags =  DDHAL_CB32_CANCREATESURFACE     |
+                                          DDHAL_CB32_CREATESURFACE        |
+                                          DDHAL_CB32_CREATEPALETTE        |
+                                          DDHAL_CB32_DESTROYDRIVER        |
+                                          DDHAL_CB32_FLIPTOGDISURFACE     |
+                                          DDHAL_CB32_GETSCANLINE          |
+                                          DDHAL_CB32_SETCOLORKEY          |
+                                          DDHAL_CB32_SETEXCLUSIVEMODE     |
+                                          DDHAL_CB32_SETMODE              |
+                                          DDHAL_CB32_WAITFORVERTICALBLANK ;
+
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD);
+
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.AddAttachedSurface = HelDdSurfAddAttachedSurface;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Blt = HelDdSurfBlt;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.DestroySurface = HelDdSurfDestroySurface;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Flip = HelDdSurfFlip;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.GetBltStatus = HelDdSurfGetBltStatus;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.GetFlipStatus = HelDdSurfGetFlipStatus;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Lock = HelDdSurfLock;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.reserved4 = HelDdSurfreserved4;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetClipList = HelDdSurfSetClipList;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetColorKey = HelDdSurfSetColorKey;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetOverlayPosition = HelDdSurfSetOverlayPosition;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.SetPalette = HelDdSurfSetPalette;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.Unlock = HelDdSurfUnlock;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.UpdateOverlay = HelDdSurfUpdateOverlay;
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.dwFlags = DDHAL_SURFCB32_ADDATTACHEDSURFACE |
+                                                DDHAL_SURFCB32_BLT                |
+                                                DDHAL_SURFCB32_DESTROYSURFACE     |
+                                                DDHAL_SURFCB32_FLIP               |
+                                                DDHAL_SURFCB32_GETBLTSTATUS       |
+                                                DDHAL_SURFCB32_GETFLIPSTATUS      |
+                                                DDHAL_SURFCB32_LOCK               |
+                                                DDHAL_SURFCB32_RESERVED4          |
+                                                DDHAL_SURFCB32_SETCLIPLIST        |
+                                                DDHAL_SURFCB32_SETCOLORKEY        |
+                                                DDHAL_SURFCB32_SETOVERLAYPOSITION |
+                                                DDHAL_SURFCB32_SETPALETTE         |
+                                                DDHAL_SURFCB32_UNLOCK             |
+                                                DDHAL_SURFCB32_UPDATEOVERLAY;
+
+    This->lpLcl->lpGbl->lpDDCBtmp->HELDDSurface.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDSurface);
 
-       /* HAL Startup process */
-    BOOL newmode = FALSE;      
-               
+    /*
+    This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette  = HelDdPalDestroyPalette;
+    This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
+    This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
+    */
 
-    /* 
-      Startup DX HAL step one of three 
+    /*
+    This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
+    This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
+    This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
+    This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
+    This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
     */
-    if (!DdCreateDirectDrawObject(&This->mDDrawGlobal, This->hdc))
+
+    return DD_OK;
+}
+
+
+HRESULT WINAPI
+StartDirectDrawHal(LPDIRECTDRAW iface, BOOL reenable)
+{
+    LPDWORD mpFourCC = NULL;
+    DDHALINFO mHALInfo;
+    BOOL newmode = FALSE;
+    LPDDSURFACEDESC mpTextures;
+    D3DHAL_CALLBACKS mD3dCallbacks;
+    D3DHAL_GLOBALDRIVERDATA mD3dDriverData;
+    DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks;
+    LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
+    DDHAL_GETDRIVERINFODATA DdGetDriverInfo = { 0 };
+
+    DX_WINDBG_trace();
+
+    RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO));
+    RtlZeroMemory(&mD3dCallbacks, sizeof(D3DHAL_CALLBACKS));
+    RtlZeroMemory(&mD3dDriverData, sizeof(D3DHAL_GLOBALDRIVERDATA));
+    RtlZeroMemory(&mD3dBufferCallbacks, sizeof(DDHAL_DDEXEBUFCALLBACKS));
+
+    if (reenable == FALSE)
+    {
+        if (ddgbl.lpDDCBtmp == NULL)
+        {
+            DxHeapMemAlloc(ddgbl.lpDDCBtmp, sizeof(DDHAL_CALLBACKS));
+            if ( ddgbl.lpDDCBtmp == NULL)
+            {
+                return DD_FALSE;
+            }
+        }
+    }
+    else
+    {
+        RtlZeroMemory(ddgbl.lpDDCBtmp,sizeof(DDHAL_CALLBACKS));
+    }
+
+    /*
+     *  Startup DX HAL step one of three
+     */
+    if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC))
     {
-       DxHeapMemFree(This->mpModeInfos);          
-       DeleteDC(This->hdc);       
+       DxHeapMemFree(ddgbl.lpDDCBtmp);
        return DD_FALSE;
     }
-       
-    // Do not relase HDC it have been map in kernel mode 
-    // DeleteDC(hdc);
-      
-    if (!DdReenableDirectDrawObject(&This->mDDrawGlobal, &newmode))
+
+    /* Some card disable the dx after it have been created so
+     * we are force reanble it
+     */
+    if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode))
     {
-      DxHeapMemFree(This->mpModeInfos);
-      DeleteDC(This->hdc);      
+      DxHeapMemFree(ddgbl.lpDDCBtmp);
       return DD_FALSE;
     }
-           
-       
-    /*
-       Startup DX HAL step two of three 
-    */
 
-    if (!DdQueryDirectDrawObject(&This->mDDrawGlobal,
-                                 &This->mHALInfo,
-                                 &This->mCallbacks.HALDD,
-                                 &This->mCallbacks.HALDDSurface,
-                                 &This->mCallbacks.HALDDPalette, 
-                                 &This->mD3dCallbacks,
-                                 &This->mD3dDriverData,
-                                 &This->mD3dBufferCallbacks,
-                                 NULL,
+    if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl,
+                                 &mHALInfo,
+                                 &ddgbl.lpDDCBtmp->HALDD,
+                                 &ddgbl.lpDDCBtmp->HALDDSurface,
+                                 &ddgbl.lpDDCBtmp->HALDDPalette,
+                                 &mD3dCallbacks,
+                                 &mD3dDriverData,
+                                 &mD3dBufferCallbacks,
                                  NULL,
+                                 mpFourCC,
                                  NULL))
     {
-      DxHeapMemFree(This->mpModeInfos);
-      DeleteDC(This->hdc);      
-      // FIXME Close DX fristcall and second call
+      DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
+      DxHeapMemFree(ddgbl.lpDDCBtmp);
+      // FIXME Close DX first and second call
       return DD_FALSE;
     }
 
-    This->mcvmList = This->mHALInfo.vmiData.dwNumHeaps;
-    This->mpvmList = (VIDMEM*) DxHeapMemAlloc(sizeof(VIDMEM) * This->mcvmList);
-    if (This->mpvmList == NULL)
-    {      
-      DxHeapMemFree(This->mpModeInfos);
-      DeleteDC(This->hdc);      
-      // FIXME Close DX fristcall and second call
-      return DD_FALSE;
+    /* Alloc mpFourCC */
+    if (This->lpLcl->lpGbl->lpdwFourCC != NULL)
+    {
+        DxHeapMemFree(This->lpLcl->lpGbl->lpdwFourCC);
     }
 
-    This->mcFourCC = This->mHALInfo.ddCaps.dwNumFourCCCodes;
-    This->mpFourCC = (DWORD *) DxHeapMemAlloc(sizeof(DWORD) * This->mcFourCC);
-    if (This->mpFourCC == NULL)
+    if (mHALInfo.ddCaps.dwNumFourCCCodes > 0 )
     {
-      DxHeapMemFree(This->mpvmList);
-      DxHeapMemFree(This->mpModeInfos);
-      DeleteDC(This->hdc);      
-      // FIXME Close DX fristcall and second call
-      return DD_FALSE;
+
+        DxHeapMemAlloc(mpFourCC, sizeof(DWORD) * (mHALInfo.ddCaps.dwNumFourCCCodes + 2));
+
+        if (mpFourCC == NULL)
+        {
+            DxHeapMemFree(ddgbl.lpDDCBtmp);
+            // FIXME Close DX first and second call
+            return DD_FALSE;
+        }
     }
 
-    This->mcTextures = This->mD3dDriverData.dwNumTextureFormats;
-    This->mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * This->mcTextures);
-    if (This->mpTextures == NULL)
-    {      
-      DxHeapMemFree( This->mpFourCC);
-      DxHeapMemFree( This->mpvmList);
-      DxHeapMemFree( This->mpModeInfos);
-      DeleteDC(This->hdc);      
-      // FIXME Close DX fristcall and second call
-      return DD_FALSE;
+    /* Alloc mpTextures */
+#if 0
+    DX_STUB_str("1 Here\n");
+
+    if (This->lpLcl->lpGbl->texture != NULL)
+    {
+        DxHeapMemFree(This->lpLcl->lpGbl->texture;
+    }
+
+    mpTextures = NULL;
+    if (mD3dDriverData.dwNumTextureFormats > 0)
+    {
+        mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mD3dDriverData.dwNumTextureFormats);
+        if (mpTextures == NULL)
+        {
+            DxHeapMemFree(mpFourCC);
+            DxHeapMemFree(ddgbl.lpDDCBtmp);
+            // FIXME Close DX first and second call
+        }
     }
 
-    This->mHALInfo.vmiData.pvmList = This->mpvmList;
-    This->mHALInfo.lpdwFourCC = This->mpFourCC;
-    This->mD3dDriverData.lpTextureFormats = (DDSURFACEDESC*) This->mpTextures;
+    DX_STUB_str("2 Here\n");
 
+#else
+      mpTextures = NULL;
+#endif
+
+
+    /* Get all basic data from the driver */
     if (!DdQueryDirectDrawObject(
-                                    &This->mDDrawGlobal,
-                                    &This->mHALInfo,
-                                    &This->mCallbacks.HALDD,
-                                    &This->mCallbacks.HALDDSurface,
-                                    &This->mCallbacks.HALDDPalette, 
-                                    &This->mD3dCallbacks,
-                                    &This->mD3dDriverData,
-                                    &This->mCallbacks.HALDDExeBuf,
-                                    (DDSURFACEDESC*)This->mpTextures,
-                                    This->mpFourCC,
-                                    This->mpvmList))
-  
+                                 This->lpLcl->lpGbl,
+                                 &mHALInfo,
+                                 &ddgbl.lpDDCBtmp->HALDD,
+                                 &ddgbl.lpDDCBtmp->HALDDSurface,
+                                 &ddgbl.lpDDCBtmp->HALDDPalette,
+                                 &mD3dCallbacks,
+                                 &mD3dDriverData,
+                                 &ddgbl.lpDDCBtmp->HALDDExeBuf,
+                                 (DDSURFACEDESC*)mpTextures,
+                                 mpFourCC,
+                                 NULL))
     {
-      DxHeapMemFree(This->mpTextures);
-      DxHeapMemFree(This->mpFourCC);
-      DxHeapMemFree(This->mpvmList);
-      DxHeapMemFree(This->mpModeInfos);
-      DeleteDC(This->hdc);      
-         // FIXME Close DX fristcall and second call
-      return DD_FALSE;
+        DxHeapMemFree(mpFourCC);
+        DxHeapMemFree(mpTextures);
+        DxHeapMemFree(ddgbl.lpDDCBtmp);
+        // FIXME Close DX first and second call
+        return DD_FALSE;
     }
 
-   /*
-      Copy over from HalInfo to DirectDrawGlobal
-   */
-
-  // this is wrong, cDriverName need be in ASC code not UNICODE 
-  //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
-
-  memcpy(&This->mDDrawGlobal.vmiData, &This->mHALInfo.vmiData,sizeof(VIDMEMINFO));
-  memcpy(&This->mDDrawGlobal.ddCaps,  &This->mHALInfo.ddCaps,sizeof(DDCORECAPS));
-
-  This->mHALInfo.dwNumModes = This->mcModeInfos;
-  This->mHALInfo.lpModeInfo = This->mpModeInfos;
-  This->mHALInfo.dwMonitorFrequency = This->mpModeInfos[0].wRefreshRate;
-
-  This->mDDrawGlobal.dwMonitorFrequency = This->mHALInfo.dwMonitorFrequency;
-  This->mDDrawGlobal.dwModeIndex        = This->mHALInfo.dwModeIndex;
-  This->mDDrawGlobal.dwNumModes         = This->mHALInfo.dwNumModes;
-  This->mDDrawGlobal.lpModeInfo         = This->mHALInfo.lpModeInfo;
-  This->mDDrawGlobal.hInstance          = This->mHALInfo.hInstance;    
-  
-  This->mDDrawGlobal.lp16DD = &This->mDDrawGlobal;
-  
-  //DeleteDC(This->hdc);
-
-   DDHAL_GETDRIVERINFODATA DriverInfo;
-   memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA));
-   DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA);
-   DriverInfo.dwContext = This->mDDrawGlobal.hDD; 
-
-  /* Get the MiscellaneousCallbacks  */    
-  DriverInfo.guidInfo = GUID_MiscellaneousCallbacks;
-  DriverInfo.lpvData = &This->mDDrawGlobal.lpDDCBtmp->HALDDMiscellaneous;
-  DriverInfo.dwExpectedSize = sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS);
-  This->mHALInfo.GetDriverInfo(&DriverInfo);
-
-  if (This->mDDrawGlobal.lpDDCBtmp->HALDDMiscellaneous.dwFlags & DDHAL_MISCCB32_GETAVAILDRIVERMEMORY)
-  {
-     This->mDdGetDriverMemory.GetAvailDriverMemory = This->mDDrawGlobal.lpDDCBtmp->HALDDMiscellaneous.GetAvailDriverMemory;
-  }
-
-  /* Setup global surface */   
-  /*This->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE;
-  This->mPrimaryGlobal.lpDD       = &This->mDDrawGlobal;
-  This->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal;
-  This->mPrimaryGlobal.wWidth  = (WORD)This->mpModeInfos[0].dwWidth;
-  This->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight;
-  This->mPrimaryGlobal.lPitch  = This->mpModeInfos[0].lPitch;*/
-
-  /* FIXME free it in cleanup */
-  This->mDDrawGlobal.dsList = (LPDDRAWI_DDRAWSURFACE_INT)DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_INT)); 
-  return DD_OK;
-}
+    memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO));
 
-HRESULT WINAPI 
-StartDirectDrawHel(LPDIRECTDRAW* iface)
-{
-       IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-
-       This->HELMemoryAvilable = HEL_GRAPHIC_MEMORY_MAX;
-
-    This->mCallbacks.HELDD.dwFlags = DDHAL_CB32_DESTROYDRIVER;
-    This->mCallbacks.HELDD.DestroyDriver = HelDdDestroyDriver;
-    
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_CREATESURFACE; 
-    This->mCallbacks.HELDD.CreateSurface = HelDdCreateSurface;
-    
-    // DDHAL_CB32_
-    //This->mCallbacks.HELDD.SetColorKey = HelDdSetColorKey;
-   
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_SETMODE;
-    This->mCallbacks.HELDD.SetMode = HelDdSetMode;
-    
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_WAITFORVERTICALBLANK;     
-    This->mCallbacks.HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank;
-        
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_CANCREATESURFACE;
-    This->mCallbacks.HELDD.CanCreateSurface = HelDdCanCreateSurface;
-    
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_CREATEPALETTE;
-    This->mCallbacks.HELDD.CreatePalette = HelDdCreatePalette;
-    
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_GETSCANLINE;
-    This->mCallbacks.HELDD.GetScanLine = HelDdGetScanLine;
-    
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_SETEXCLUSIVEMODE;
-    This->mCallbacks.HELDD.SetExclusiveMode = HelDdSetExclusiveMode;
-
-    This->mCallbacks.HELDD.dwFlags += DDHAL_CB32_FLIPTOGDISURFACE;
-    This->mCallbacks.HELDD.FlipToGDISurface = HelDdFlipToGDISurface;
-          
-       return DD_OK;
-}
 
-HRESULT 
-WINAPI 
-Create_DirectDraw (LPGUID pGUID, 
-                                  LPDIRECTDRAW* pIface, 
-                                  REFIID id, 
-                                  BOOL ex)
-{   
-    IDirectDrawImpl* This = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl));
-
-       DX_WINDBG_trace();
-
-       if (This == NULL) 
-       {
-               return E_OUTOFMEMORY;
-       }
-
-       ZeroMemory(This,sizeof(IDirectDrawImpl));
-
-       This->lpVtbl = &DirectDraw7_Vtable;
-       This->lpVtbl_v1 = &DDRAW_IDirectDraw_VTable;
-       This->lpVtbl_v2 = &DDRAW_IDirectDraw2_VTable;
-       This->lpVtbl_v4 = &DDRAW_IDirectDraw4_VTable;
-       
-       *pIface = (LPDIRECTDRAW)This;
-
-       This->devicetype = 0;
-
-       if (pGUID == (LPGUID) DDCREATE_HARDWAREONLY)
-       {
-               This->devicetype = 1; /* hal only */
-       }
-
-       if (pGUID == (LPGUID) DDCREATE_EMULATIONONLY)
-       {
-           This->devicetype = 2; /* hel only */
-       }
-        
-       if(This->lpVtbl->QueryInterface ((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK)
-       {
-               return DDERR_INVALIDPARAMS;
-       }
-
-       if (StartDirectDraw((LPDIRECTDRAW*)This) == DD_OK);
+    memcpy(&ddgbl.ddCaps,  &mHALInfo.ddCaps,sizeof(DDCORECAPS));
+
+    This->lpLcl->lpGbl->dwNumFourCC        = mHALInfo.ddCaps.dwNumFourCCCodes;
+    This->lpLcl->lpGbl->lpdwFourCC         = mpFourCC;
+    // This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency;     // 0
+    This->lpLcl->lpGbl->dwModeIndex        = mHALInfo.dwModeIndex;
+    // This->lpLcl->lpGbl->dwNumModes         = mHALInfo.dwNumModes;
+    // This->lpLcl->lpGbl->lpModeInfo         = mHALInfo.lpModeInfo;
+
+    /* FIXME convert mpTextures to DDHALMODEINFO */
+    // DxHeapMemFree( mpTextures);
+
+    /* FIXME D3D setup mD3dCallbacks and mD3dDriverData */
+
+
+
+
+    if (mHALInfo.dwFlags & DDHALINFO_GETDRIVERINFOSET)
+    {
+        DdGetDriverInfo.dwSize = sizeof (DDHAL_GETDRIVERINFODATA);
+        DdGetDriverInfo.guidInfo = GUID_MiscellaneousCallbacks;
+        DdGetDriverInfo.lpvData = (PVOID)&ddgbl.lpDDCBtmp->HALDDMiscellaneous;
+        DdGetDriverInfo.dwExpectedSize = sizeof (DDHAL_DDMISCELLANEOUSCALLBACKS);
+
+        if(mHALInfo.GetDriverInfo (&DdGetDriverInfo) == DDHAL_DRIVER_NOTHANDLED || DdGetDriverInfo.ddRVal != DD_OK)
+        {
+            DxHeapMemFree(mpFourCC);
+            DxHeapMemFree(mpTextures);
+            DxHeapMemFree(ddgbl.lpDDCBtmp);
+            // FIXME Close DX fristcall and second call
+            return DD_FALSE;
+        }
+
+        RtlZeroMemory(&DdGetDriverInfo, sizeof(DDHAL_GETDRIVERINFODATA));
+        DdGetDriverInfo.dwSize = sizeof (DDHAL_GETDRIVERINFODATA);
+        DdGetDriverInfo.guidInfo = GUID_Miscellaneous2Callbacks;
+
+        /* FIXME
+        DdGetDriverInfo.lpvData = (PVOID)&ddgbl.lpDDCBtmp->HALDDMiscellaneous;
+        DdGetDriverInfo.dwExpectedSize = sizeof (DDHAL_DDMISCELLANEOUS2CALLBACKS);
+
+        if(mHALInfo.GetDriverInfo (&DdGetDriverInfo) == DDHAL_DRIVER_NOTHANDLED || DdGetDriverInfo.ddRVal != DD_OK)
+        {
+            DxHeapMemFree(mpFourCC);
+            DxHeapMemFree(mpTextures);
+            DxHeapMemFree(ddgbl.lpDDCBtmp);
+            // FIXME Close DX fristcall and second call
+            return DD_FALSE;
+        }
+        DD_MISCELLANEOUS2CALLBACKS
+        {
+            DWORD                dwSize;
+            DWORD                dwFlags;
+            PDD_ALPHABLT         AlphaBlt;  // unsuse acoding msdn and always set to NULL
+            PDD_CREATESURFACEEX  CreateSurfaceEx;
+            PDD_GETDRIVERSTATE   GetDriverState;
+            PDD_DESTROYDDLOCAL   DestroyDDLocal;
+        }
+          DDHAL_MISC2CB32_CREATESURFACEEX
+          DDHAL_MISC2CB32_GETDRIVERSTATE
+          DDHAL_MISC2CB32_DESTROYDDLOCAL
+        */
+    }
+
+    if (mHALInfo.dwFlags & DDHALINFO_GETDRIVERINFO2)
     {
-               return This->lpVtbl->Initialize ((LPDIRECTDRAW7)This, pGUID);
-       }
+        This->lpLcl->lpGbl->dwFlags = This->lpLcl->lpGbl->dwFlags | DDRAWI_DRIVERINFO2;
+    }
 
-       return DDERR_INVALIDPARAMS;
-}
 
+    return DD_OK;
+}