xref: /reactos/dll/directx/ddraw/startup.c (revision c2c66aff)
1 /*
2  * COPYRIGHT:            See COPYING in the top level directory
3  * PROJECT:              ReactOS kernel
4  * FILE:                 dll/directx/ddraw/startup.c
5  * PURPOSE:              DirectDraw Library
6  * PROGRAMMER:           Magnus Olsen (greatlrd)
7  *
8  */
9 
10 #include "rosdraw.h"
11 
12 DDRAWI_DIRECTDRAW_GBL ddgbl;
13 DDRAWI_DDRAWSURFACE_GBL ddSurfGbl;
14 
15 WCHAR classname[128];
16 WNDCLASSW wnd_class;
17 
18 
19 HRESULT WINAPI
Create_DirectDraw(LPGUID pGUID,LPDIRECTDRAW * pIface,REFIID id,BOOL reenable)20 Create_DirectDraw (LPGUID pGUID, LPDIRECTDRAW* pIface,
21                    REFIID id, BOOL reenable)
22 {
23     LPDDRAWI_DIRECTDRAW_INT This;
24 
25     DX_WINDBG_trace();
26     BOOL linking = FALSE;
27 
28     if (pIface == NULL)
29     {
30         return DDERR_INVALIDPARAMS;
31     }
32 
33     This = (LPDDRAWI_DIRECTDRAW_INT)*pIface;
34 
35     DX_STUB_str("Linking?\n")
36 
37     _SEH2_TRY
38     {
39         linking = This->lpLcl ? TRUE:FALSE;
40     }
41     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
42     {
43         linking = FALSE;
44     }
45     _SEH2_END;
46 
47     /* fixme linking too second link when we shall not doing it */
48     if (!linking)
49     {
50         /* We do not have a DirectDraw interface, we need alloc it*/
51         LPDDRAWI_DIRECTDRAW_INT memThis;
52 
53         DX_STUB_str("1. no linking\n");
54 
55         DxHeapMemAlloc(memThis, sizeof(DDRAWI_DIRECTDRAW_INT));
56         if (memThis == NULL)
57         {
58             return DDERR_OUTOFMEMORY;
59         }
60 
61         This = memThis;
62 
63         /* Fixme release memory alloc if we fail */
64 
65         DxHeapMemAlloc(This->lpLcl, sizeof(DDRAWI_DIRECTDRAW_LCL));
66         if (This->lpLcl == NULL)
67         {
68             return DDERR_OUTOFMEMORY;
69         }
70     }
71     else
72     {
73         /* We got the DirectDraw interface alloc and we need create the link */
74         LPDDRAWI_DIRECTDRAW_INT  newThis;
75 
76         DX_STUB_str("2.linking\n");
77 
78         /* step 1.Alloc the new  DDRAWI_DIRECTDRAW_INT for the link */
79         DxHeapMemAlloc(newThis, sizeof(DDRAWI_DIRECTDRAW_INT));
80         if (newThis == NULL)
81         {
82             return DDERR_OUTOFMEMORY;
83         }
84 
85         /* step 2 check if it not DDCREATE_HARDWAREONLY we got if so we fail */
86         if ((pGUID) && (pGUID != (LPGUID)DDCREATE_HARDWAREONLY))
87         {
88             if (pGUID !=NULL)
89             {
90                 This = newThis;
91                 return DDERR_INVALIDDIRECTDRAWGUID;
92             }
93         }
94 
95         /* step 3 do the link the old interface are store in the new one */
96         newThis->lpLink = This;
97 
98         /* step 4 we need create new local directdraw struct for the new linked interface */
99         DxHeapMemAlloc(newThis->lpLcl, sizeof(DDRAWI_DIRECTDRAW_LCL));
100         if (newThis->lpLcl == NULL)
101         {
102             This = newThis;
103             return DDERR_OUTOFMEMORY;
104         }
105 
106         This = newThis;
107     }
108 
109     This->lpLcl->lpGbl = &ddgbl;
110 
111     *pIface = (LPDIRECTDRAW)This;
112 
113     /* Get right interface we whant */
114 
115     This->lpVtbl = 0;
116     if (IsEqualGUID(&IID_IDirectDraw7, id))
117     {
118         /* DirectDraw7 Vtable */
119         This->lpVtbl = &DirectDraw7_Vtable;
120         This->lpLcl->dwLocalFlags = This->lpLcl->dwLocalFlags + DDRAWILCL_DIRECTDRAW7;
121         *pIface = (LPDIRECTDRAW)&This->lpVtbl;
122         Main_DirectDraw_AddRef(This);
123     }
124     else if (IsEqualGUID(&IID_IDirectDraw4, id))
125     {
126         /* DirectDraw4 Vtable */
127         This->lpVtbl = &DirectDraw4_Vtable;
128         *pIface = (LPDIRECTDRAW)&This->lpVtbl;
129         Main_DirectDraw_AddRef(This);
130     }
131     else if (IsEqualGUID(&IID_IDirectDraw2, id))
132     {
133         /* DirectDraw2 Vtable */
134         This->lpVtbl = &DirectDraw2_Vtable;
135         *pIface = (LPDIRECTDRAW)&This->lpVtbl;
136         Main_DirectDraw_AddRef(This);
137     }
138     else if (IsEqualGUID(&IID_IDirectDraw, id))
139     {
140         /* DirectDraw Vtable */
141         This->lpVtbl = &DirectDraw_Vtable;
142         *pIface = (LPDIRECTDRAW)&This->lpVtbl;
143         Main_DirectDraw_AddRef(This);
144     }
145 
146     if ( This->lpVtbl != 0)
147     {
148         DX_STUB_str("Got iface\n");
149 
150         if (StartDirectDraw((LPDIRECTDRAW)This, pGUID, FALSE) == DD_OK)
151         {
152             /*
153             RtlZeroMemory(&wnd_class, sizeof(wnd_class));
154             wnd_class.style = CS_HREDRAW | CS_VREDRAW;
155             wnd_class.lpfnWndProc = DefWindowProcW;
156             wnd_class.cbClsExtra = 0;
157             wnd_class.cbWndExtra = 0;
158             wnd_class.hInstance = GetModuleHandleW(0);
159             wnd_class.hIcon = 0;
160             wnd_class.hCursor = 0;
161             wnd_class.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
162             wnd_class.lpszMenuName = NULL;
163             wnd_class.lpszClassName = classname;
164             if(!RegisterClassW(&wnd_class))
165             {
166                 DX_STUB_str("DDERR_GENERIC");
167                 return DDERR_GENERIC;
168             }
169             */
170             This->lpLcl->hDD = ddgbl.hDD;
171             return DD_OK;
172         }
173     }
174 
175     return DDERR_INVALIDPARAMS;
176 }
177 
178 
179 HRESULT WINAPI
StartDirectDraw(LPDIRECTDRAW iface,LPGUID lpGuid,BOOL reenable)180 StartDirectDraw(LPDIRECTDRAW iface, LPGUID lpGuid, BOOL reenable)
181 {
182     LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
183     DWORD hal_ret = DD_FALSE;
184     DWORD hel_ret = DD_FALSE;
185     DWORD devicetypes = 0;
186     DWORD dwFlags = 0;
187 
188 
189     DX_WINDBG_trace();
190 
191 
192     /*
193      * ddgbl.dwPDevice  is not longer in use in windows 2000 and higher
194      * I am using it for device type
195      * devicetypes = 1 : both hal and hel are enable
196      * devicetypes = 2 : both hal are enable
197      * devicetypes = 3 : both hel are enable
198      * devicetypes = 4 :loading a guid drv from the register
199      */
200 
201     ddgbl.lpDriverHandle = &ddgbl;
202     ddgbl.hDDVxd = -1;
203 
204     if (reenable == FALSE)
205     {
206         if ((!IsBadReadPtr(This->lpLink,sizeof(LPDIRECTDRAW))) && (This->lpLink == NULL))
207         {
208             RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
209             This->lpLcl->lpGbl->dwRefCnt++;
210             if (ddgbl.lpDDCBtmp == NULL)
211             {
212                 // LPDDHAL_CALLBACKS
213                 DxHeapMemAlloc( ddgbl.lpDDCBtmp , sizeof(DDHAL_CALLBACKS));
214                 if (ddgbl.lpDDCBtmp == NULL)
215                 {
216                     DX_STUB_str("Out of memory\n");
217                     return DD_FALSE;
218                 }
219             }
220         }
221 
222         DxHeapMemAlloc(ddgbl.lpModeInfo, sizeof(DDHALMODEINFO));
223         if (!ddgbl.lpModeInfo)
224         {
225             return DDERR_OUTOFMEMORY;
226         }
227 
228     }
229     /* Windows handler are by set of SetCooperLevel
230      * so do not set it
231      */
232 
233     if (reenable == FALSE)
234     {
235         if (lpGuid == NULL)
236         {
237             devicetypes= 1;
238 
239             /* Create HDC for default, hal and hel driver */
240             // This->lpLcl->hWnd = (ULONG_PTR) GetActiveWindow();
241             This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
242 
243             /* cObsolete is undoc in msdn it being use in CreateDCA */
244             RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
245             RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
246             dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
247         }
248         else if (lpGuid == (LPGUID) DDCREATE_HARDWAREONLY)
249         {
250             devicetypes = 2;
251             /* Create HDC for default, hal driver */
252             // This->lpLcl->hWnd =(ULONG_PTR) GetActiveWindow();
253             This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
254 
255             /* cObsolete is undoc in msdn it being use in CreateDCA */
256             RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
257             RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
258             dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
259         }
260         else if (lpGuid == (LPGUID) DDCREATE_EMULATIONONLY)
261         {
262             devicetypes = 3;
263 
264             /* Create HDC for default, hal and hel driver */
265             //This->lpLcl->hWnd = (ULONG_PTR) GetActiveWindow();
266             This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
267 
268             /* cObsolete is undoc in msdn it being use in CreateDCA */
269             RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
270             RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
271 
272             dwFlags |= DDRAWI_DISPLAYDRV | DDRAWI_GDIDRV;
273         }
274         else
275         {
276             /* FIXME : need getting driver from the GUID that have been pass in from
277              * the register. we do not support that yet
278              */
279              devicetypes = 4;
280              //This->lpLcl->hDC = (ULONG_PTR) NULL ;
281              //This->lpLcl->hDC = (ULONG_PTR)CreateDCA("DISPLAY",NULL,NULL,NULL);
282         }
283 
284         /*
285         if ( (HDC)This->lpLcl->hDC == NULL)
286         {
287             DX_STUB_str("DDERR_OUTOFMEMORY\n");
288             return DDERR_OUTOFMEMORY ;
289         }
290         */
291     }
292 
293     This->lpLcl->lpDDCB = ddgbl.lpDDCBtmp;
294 
295     /* Startup HEL and HAL */
296     This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
297     This->lpLcl->dwProcessId = GetCurrentProcessId();
298     switch (devicetypes)
299     {
300             case 2:
301               hal_ret = StartDirectDrawHal(iface, reenable);
302               This->lpLcl->lpDDCB->HELDD.dwFlags = 0;
303               break;
304 
305             case 3:
306               hel_ret = StartDirectDrawHel(iface, reenable);
307               This->lpLcl->lpDDCB->HALDD.dwFlags = 0;
308               break;
309 
310             default:
311               hal_ret = StartDirectDrawHal(iface, reenable);
312               hel_ret = StartDirectDrawHel(iface, reenable);
313               break;
314     }
315 
316     if (hal_ret!=DD_OK)
317     {
318         if (hel_ret!=DD_OK)
319         {
320             DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT\n");
321             return DDERR_NODIRECTDRAWSUPPORT;
322         }
323         dwFlags |= DDRAWI_NOHARDWARE;
324         DX_STUB_str("No hardware support\n");
325     }
326 
327     if (hel_ret!=DD_OK)
328     {
329         dwFlags |= DDRAWI_NOEMULATION;
330 
331     }
332     else
333     {
334         dwFlags |= DDRAWI_EMULATIONINITIALIZED;
335     }
336 
337     /* Fill some basic info for Surface */
338     This->lpLcl->lpGbl->dwFlags =  This->lpLcl->lpGbl->dwFlags | dwFlags | DDRAWI_ATTACHEDTODESKTOP;
339     This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
340     This->lpLcl->hDD = ddgbl.hDD;
341 
342     ddgbl.rectDevice.top = 0;
343     ddgbl.rectDevice.left = 0;
344     ddgbl.rectDevice.right = ddgbl.vmiData.dwDisplayWidth;
345     ddgbl.rectDevice.bottom = ddgbl.vmiData.dwDisplayHeight;
346 
347     ddgbl.rectDesktop.top = 0;
348     ddgbl.rectDesktop.left = 0;
349     ddgbl.rectDesktop.right = ddgbl.vmiData.dwDisplayWidth;
350     ddgbl.rectDesktop.bottom = ddgbl.vmiData.dwDisplayHeight;
351 
352     ddgbl.dwMonitorFrequency = GetDeviceCaps(GetWindowDC(NULL),VREFRESH);
353     ddgbl.lpModeInfo->dwWidth      = ddgbl.vmiData.dwDisplayWidth;
354     ddgbl.lpModeInfo->dwHeight     = ddgbl.vmiData.dwDisplayHeight;
355     ddgbl.lpModeInfo->dwBPP        = ddgbl.vmiData.ddpfDisplay.dwRGBBitCount;
356     ddgbl.lpModeInfo->lPitch       = ddgbl.vmiData.lDisplayPitch;
357     ddgbl.lpModeInfo->wRefreshRate = ddgbl.dwMonitorFrequency;
358     ddgbl.lpModeInfo->dwRBitMask = ddgbl.vmiData.ddpfDisplay.dwRBitMask;
359     ddgbl.lpModeInfo->dwGBitMask = ddgbl.vmiData.ddpfDisplay.dwGBitMask;
360     ddgbl.lpModeInfo->dwBBitMask = ddgbl.vmiData.ddpfDisplay.dwBBitMask;
361     ddgbl.lpModeInfo->dwAlphaBitMask = ddgbl.vmiData.ddpfDisplay.dwRGBAlphaBitMask;
362 
363     return DD_OK;
364 }
365 
366 
367 HRESULT WINAPI
StartDirectDrawHel(LPDIRECTDRAW iface,BOOL reenable)368 StartDirectDrawHel(LPDIRECTDRAW iface, BOOL reenable)
369 {
370     LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
371 
372     if (reenable == FALSE)
373     {
374         if (ddgbl.lpDDCBtmp == NULL)
375         {
376             DxHeapMemAlloc(ddgbl.lpDDCBtmp, sizeof(DDHAL_CALLBACKS));
377             if ( ddgbl.lpDDCBtmp == NULL)
378             {
379                 return DD_FALSE;
380             }
381         }
382     }
383 
384     ddgbl.lpDDCBtmp->HELDD.CanCreateSurface     = HelDdCanCreateSurface;
385     ddgbl.lpDDCBtmp->HELDD.CreateSurface        = HelDdCreateSurface;
386     ddgbl.lpDDCBtmp->HELDD.CreatePalette        = HelDdCreatePalette;
387     ddgbl.lpDDCBtmp->HELDD.DestroyDriver        = HelDdDestroyDriver;
388     ddgbl.lpDDCBtmp->HELDD.FlipToGDISurface     = HelDdFlipToGDISurface;
389     ddgbl.lpDDCBtmp->HELDD.GetScanLine          = HelDdGetScanLine;
390     ddgbl.lpDDCBtmp->HELDD.SetColorKey          = HelDdSetColorKey;
391     ddgbl.lpDDCBtmp->HELDD.SetExclusiveMode     = HelDdSetExclusiveMode;
392     ddgbl.lpDDCBtmp->HELDD.SetMode              = HelDdSetMode;
393     ddgbl.lpDDCBtmp->HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank;
394 
395     ddgbl.lpDDCBtmp->HELDD.dwFlags =  DDHAL_CB32_CANCREATESURFACE     |
396                                           DDHAL_CB32_CREATESURFACE        |
397                                           DDHAL_CB32_CREATEPALETTE        |
398                                           DDHAL_CB32_DESTROYDRIVER        |
399                                           DDHAL_CB32_FLIPTOGDISURFACE     |
400                                           DDHAL_CB32_GETSCANLINE          |
401                                           DDHAL_CB32_SETCOLORKEY          |
402                                           DDHAL_CB32_SETEXCLUSIVEMODE     |
403                                           DDHAL_CB32_SETMODE              |
404                                           DDHAL_CB32_WAITFORVERTICALBLANK ;
405 
406     ddgbl.lpDDCBtmp->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD);
407 
408     ddgbl.lpDDCBtmp->HELDDSurface.AddAttachedSurface = HelDdSurfAddAttachedSurface;
409     ddgbl.lpDDCBtmp->HELDDSurface.Blt = HelDdSurfBlt;
410     ddgbl.lpDDCBtmp->HELDDSurface.DestroySurface = HelDdSurfDestroySurface;
411     ddgbl.lpDDCBtmp->HELDDSurface.Flip = HelDdSurfFlip;
412     ddgbl.lpDDCBtmp->HELDDSurface.GetBltStatus = HelDdSurfGetBltStatus;
413     ddgbl.lpDDCBtmp->HELDDSurface.GetFlipStatus = HelDdSurfGetFlipStatus;
414     ddgbl.lpDDCBtmp->HELDDSurface.Lock = HelDdSurfLock;
415     ddgbl.lpDDCBtmp->HELDDSurface.reserved4 = HelDdSurfreserved4;
416     ddgbl.lpDDCBtmp->HELDDSurface.SetClipList = HelDdSurfSetClipList;
417     ddgbl.lpDDCBtmp->HELDDSurface.SetColorKey = HelDdSurfSetColorKey;
418     ddgbl.lpDDCBtmp->HELDDSurface.SetOverlayPosition = HelDdSurfSetOverlayPosition;
419     ddgbl.lpDDCBtmp->HELDDSurface.SetPalette = HelDdSurfSetPalette;
420     ddgbl.lpDDCBtmp->HELDDSurface.Unlock = HelDdSurfUnlock;
421     ddgbl.lpDDCBtmp->HELDDSurface.UpdateOverlay = HelDdSurfUpdateOverlay;
422     ddgbl.lpDDCBtmp->HELDDSurface.dwFlags = DDHAL_SURFCB32_ADDATTACHEDSURFACE |
423                                                 DDHAL_SURFCB32_BLT                |
424                                                 DDHAL_SURFCB32_DESTROYSURFACE     |
425                                                 DDHAL_SURFCB32_FLIP               |
426                                                 DDHAL_SURFCB32_GETBLTSTATUS       |
427                                                 DDHAL_SURFCB32_GETFLIPSTATUS      |
428                                                 DDHAL_SURFCB32_LOCK               |
429                                                 DDHAL_SURFCB32_RESERVED4          |
430                                                 DDHAL_SURFCB32_SETCLIPLIST        |
431                                                 DDHAL_SURFCB32_SETCOLORKEY        |
432                                                 DDHAL_SURFCB32_SETOVERLAYPOSITION |
433                                                 DDHAL_SURFCB32_SETPALETTE         |
434                                                 DDHAL_SURFCB32_UNLOCK             |
435                                                 DDHAL_SURFCB32_UPDATEOVERLAY;
436 
437     ddgbl.lpDDCBtmp->HELDDSurface.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDSurface);
438 
439     /*
440     This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette  = HelDdPalDestroyPalette;
441     This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
442     This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
443     */
444 
445     /*
446     This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
447     This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
448     This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
449     This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
450     This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
451     */
452 
453     return DD_OK;
454 }
455 
456 
457 HRESULT WINAPI
StartDirectDrawHal(LPDIRECTDRAW iface,BOOL reenable)458 StartDirectDrawHal(LPDIRECTDRAW iface, BOOL reenable)
459 {
460     LPDWORD mpFourCC = NULL;
461     DDHALINFO mHALInfo;
462     BOOL newmode = FALSE;
463     LPDDSURFACEDESC mpTextures;
464     D3DHAL_CALLBACKS mD3dCallbacks;
465     D3DHAL_GLOBALDRIVERDATA mD3dDriverData;
466     DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks;
467     LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
468     DDHAL_GETDRIVERINFODATA DdGetDriverInfo = { 0 };
469 
470     DX_WINDBG_trace();
471 
472     RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO));
473     RtlZeroMemory(&mD3dCallbacks, sizeof(D3DHAL_CALLBACKS));
474     RtlZeroMemory(&mD3dDriverData, sizeof(D3DHAL_GLOBALDRIVERDATA));
475     RtlZeroMemory(&mD3dBufferCallbacks, sizeof(DDHAL_DDEXEBUFCALLBACKS));
476 
477     if (reenable == FALSE)
478     {
479         if (ddgbl.lpDDCBtmp == NULL)
480         {
481             DxHeapMemAlloc(ddgbl.lpDDCBtmp, sizeof(DDHAL_CALLBACKS));
482             if ( ddgbl.lpDDCBtmp == NULL)
483             {
484                 return DD_FALSE;
485             }
486         }
487     }
488     else
489     {
490         RtlZeroMemory(ddgbl.lpDDCBtmp,sizeof(DDHAL_CALLBACKS));
491     }
492 
493     /*
494      *  Startup DX HAL step one of three
495      */
496     if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC))
497     {
498        DxHeapMemFree(ddgbl.lpDDCBtmp);
499        return DD_FALSE;
500     }
501 
502     /* Some card disable the dx after it have been created so
503      * we are force reenabling it
504      */
505     if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode))
506     {
507       DxHeapMemFree(ddgbl.lpDDCBtmp);
508       return DD_FALSE;
509     }
510 
511     if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl,
512                                  &mHALInfo,
513                                  &ddgbl.lpDDCBtmp->HALDD,
514                                  &ddgbl.lpDDCBtmp->HALDDSurface,
515                                  &ddgbl.lpDDCBtmp->HALDDPalette,
516                                  &mD3dCallbacks,
517                                  &mD3dDriverData,
518                                  &mD3dBufferCallbacks,
519                                  NULL,
520                                  mpFourCC,
521                                  NULL))
522     {
523       DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
524       DxHeapMemFree(ddgbl.lpDDCBtmp);
525       // FIXME Close DX first and second call
526       return DD_FALSE;
527     }
528 
529     /* Alloc mpFourCC */
530     if (This->lpLcl->lpGbl->lpdwFourCC != NULL)
531     {
532         DxHeapMemFree(This->lpLcl->lpGbl->lpdwFourCC);
533     }
534 
535     if (mHALInfo.ddCaps.dwNumFourCCCodes > 0 )
536     {
537 
538         DxHeapMemAlloc(mpFourCC, sizeof(DWORD) * (mHALInfo.ddCaps.dwNumFourCCCodes + 2));
539 
540         if (mpFourCC == NULL)
541         {
542             DxHeapMemFree(ddgbl.lpDDCBtmp);
543             // FIXME Close DX first and second call
544             return DD_FALSE;
545         }
546     }
547 
548     /* Alloc mpTextures */
549 #if 0
550     DX_STUB_str("1 Here\n");
551 
552     if (This->lpLcl->lpGbl->texture != NULL)
553     {
554         DxHeapMemFree(This->lpLcl->lpGbl->texture;
555     }
556 
557     mpTextures = NULL;
558     if (mD3dDriverData.dwNumTextureFormats > 0)
559     {
560         mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mD3dDriverData.dwNumTextureFormats);
561         if (mpTextures == NULL)
562         {
563             DxHeapMemFree(mpFourCC);
564             DxHeapMemFree(ddgbl.lpDDCBtmp);
565             // FIXME Close DX first and second call
566         }
567     }
568 
569     DX_STUB_str("2 Here\n");
570 
571 #else
572       mpTextures = NULL;
573 #endif
574 
575 
576     /* Get all basic data from the driver */
577     if (!DdQueryDirectDrawObject(
578                                  This->lpLcl->lpGbl,
579                                  &mHALInfo,
580                                  &ddgbl.lpDDCBtmp->HALDD,
581                                  &ddgbl.lpDDCBtmp->HALDDSurface,
582                                  &ddgbl.lpDDCBtmp->HALDDPalette,
583                                  &mD3dCallbacks,
584                                  &mD3dDriverData,
585                                  &ddgbl.lpDDCBtmp->HALDDExeBuf,
586                                  (DDSURFACEDESC*)mpTextures,
587                                  mpFourCC,
588                                  NULL))
589     {
590         DxHeapMemFree(mpFourCC);
591         DxHeapMemFree(mpTextures);
592         DxHeapMemFree(ddgbl.lpDDCBtmp);
593         // FIXME Close DX first and second call
594         return DD_FALSE;
595     }
596 
597     memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO));
598 
599 
600     memcpy(&ddgbl.ddCaps,  &mHALInfo.ddCaps,sizeof(DDCORECAPS));
601 
602     This->lpLcl->lpGbl->dwNumFourCC        = mHALInfo.ddCaps.dwNumFourCCCodes;
603     This->lpLcl->lpGbl->lpdwFourCC         = mpFourCC;
604     // This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency;     // 0
605     This->lpLcl->lpGbl->dwModeIndex        = mHALInfo.dwModeIndex;
606     // This->lpLcl->lpGbl->dwNumModes         = mHALInfo.dwNumModes;
607     // This->lpLcl->lpGbl->lpModeInfo         = mHALInfo.lpModeInfo;
608 
609     /* FIXME convert mpTextures to DDHALMODEINFO */
610     // DxHeapMemFree( mpTextures);
611 
612     /* FIXME D3D setup mD3dCallbacks and mD3dDriverData */
613 
614 
615 
616 
617     if (mHALInfo.dwFlags & DDHALINFO_GETDRIVERINFOSET)
618     {
619         DdGetDriverInfo.dwSize = sizeof (DDHAL_GETDRIVERINFODATA);
620         DdGetDriverInfo.guidInfo = GUID_MiscellaneousCallbacks;
621         DdGetDriverInfo.lpvData = (PVOID)&ddgbl.lpDDCBtmp->HALDDMiscellaneous;
622         DdGetDriverInfo.dwExpectedSize = sizeof (DDHAL_DDMISCELLANEOUSCALLBACKS);
623 
624         if(mHALInfo.GetDriverInfo (&DdGetDriverInfo) == DDHAL_DRIVER_NOTHANDLED || DdGetDriverInfo.ddRVal != DD_OK)
625         {
626             DxHeapMemFree(mpFourCC);
627             DxHeapMemFree(mpTextures);
628             DxHeapMemFree(ddgbl.lpDDCBtmp);
629             // FIXME Close DX fristcall and second call
630             return DD_FALSE;
631         }
632 
633         RtlZeroMemory(&DdGetDriverInfo, sizeof(DDHAL_GETDRIVERINFODATA));
634         DdGetDriverInfo.dwSize = sizeof (DDHAL_GETDRIVERINFODATA);
635         DdGetDriverInfo.guidInfo = GUID_Miscellaneous2Callbacks;
636 
637         /* FIXME
638         DdGetDriverInfo.lpvData = (PVOID)&ddgbl.lpDDCBtmp->HALDDMiscellaneous;
639         DdGetDriverInfo.dwExpectedSize = sizeof (DDHAL_DDMISCELLANEOUS2CALLBACKS);
640 
641         if(mHALInfo.GetDriverInfo (&DdGetDriverInfo) == DDHAL_DRIVER_NOTHANDLED || DdGetDriverInfo.ddRVal != DD_OK)
642         {
643             DxHeapMemFree(mpFourCC);
644             DxHeapMemFree(mpTextures);
645             DxHeapMemFree(ddgbl.lpDDCBtmp);
646             // FIXME Close DX fristcall and second call
647             return DD_FALSE;
648         }
649         DD_MISCELLANEOUS2CALLBACKS
650         {
651             DWORD                dwSize;
652             DWORD                dwFlags;
653             PDD_ALPHABLT         AlphaBlt;  // unsuse according to msdn and always set to NULL
654             PDD_CREATESURFACEEX  CreateSurfaceEx;
655             PDD_GETDRIVERSTATE   GetDriverState;
656             PDD_DESTROYDDLOCAL   DestroyDDLocal;
657         }
658           DDHAL_MISC2CB32_CREATESURFACEEX
659           DDHAL_MISC2CB32_GETDRIVERSTATE
660           DDHAL_MISC2CB32_DESTROYDDLOCAL
661         */
662     }
663 
664     if (mHALInfo.dwFlags & DDHALINFO_GETDRIVERINFO2)
665     {
666         This->lpLcl->lpGbl->dwFlags = This->lpLcl->lpGbl->dwFlags | DDRAWI_DRIVERINFO2;
667     }
668 
669 
670     return DD_OK;
671 }
672