1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for NtGdiDdCreateDirectDrawObject
5  * PROGRAMMERS:
6  */
7 
8 #include "../win32nt.h"
9 
10 #include <ddrawi.h>
11 
12 /* Note : OsThunkDdQueryDirectDrawObject is the usermode name of NtGdiDdQueryDirectDrawObject
13  *        it lives in d3d8thk.dll and in windows 2000 it doing syscall direcly to win32k.sus
14  *        in windows xp and higher it call to gdi32.dll to DdEntry41 and it doing the syscall
15  */
16 START_TEST(NtGdiDdQueryDirectDrawObject)
17 {
18     HANDLE hDirectDraw;
19     DD_HALINFO *pHalInfo = NULL;
20     DWORD *pCallBackFlags = NULL;
21     LPD3DNTHAL_CALLBACKS puD3dCallbacks = NULL;
22     LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData = NULL;
23     PDD_D3DBUFCALLBACKS puD3dBufferCallbacks = NULL;
24     LPDDSURFACEDESC puD3dTextureFormats = NULL;
25     DWORD *puNumHeaps = NULL;
26     VIDEOMEMORY *puvmList = NULL;
27     DWORD *puNumFourCC = NULL;
28     DWORD *puFourCC = NULL;
29 
30     DD_HALINFO HalInfo;
31     DD_HALINFO oldHalInfo;
32     DWORD CallBackFlags[4];
33 
34     D3DNTHAL_CALLBACKS D3dCallbacks;
35     D3DNTHAL_CALLBACKS oldD3dCallbacks;
36 
37     D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;
38     D3DNTHAL_GLOBALDRIVERDATA oldD3dDriverData;
39 
40     DD_D3DBUFCALLBACKS D3dBufferCallbacks;
41     DD_D3DBUFCALLBACKS oldD3dBufferCallbacks;
42 
43     DDSURFACEDESC2 D3dTextureFormats[100];
44     DWORD NumHeaps = 0;
45     VIDEOMEMORY vmList;
46     //DWORD NumFourCC = 0;
47     //DWORD FourCC = 0;
48     DEVMODE devmode;
49     HDC hdc;
50 
51     DWORD dwTextureCounter = 0;
52     DDSURFACEDESC *myDesc = NULL;
53 
54     /* clear data */
55     memset(&vmList,0,sizeof(VIDEOMEMORY));
56     memset(&D3dTextureFormats,0,sizeof(DDSURFACEDESC));
57     memset(&D3dBufferCallbacks,0,sizeof(DD_D3DBUFCALLBACKS));
58     memset(&D3dDriverData,0,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
59     memset(&D3dCallbacks,0,sizeof(D3DNTHAL_CALLBACKS));
60     memset(&HalInfo,0,sizeof(DD_HALINFO));
61     memset(CallBackFlags,0,sizeof(DWORD)*3);
62 
63     /* Get current display mode */
64     EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devmode);
65 
66     /* Create hdc that we can use */
67     hdc = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
68     ASSERT(hdc != NULL);
69 
70 
71     hDirectDraw = NtGdiDdCreateDirectDrawObject(hdc);
72     RTEST(hDirectDraw != NULL);
73 
74     /* testing  OsThunkDdQueryDirectDrawObject( NULL, ....  */
75     RTEST(NtGdiDdQueryDirectDrawObject( NULL, pHalInfo,
76                                         pCallBackFlags, puD3dCallbacks,
77                                         puD3dDriverData, puD3dBufferCallbacks,
78                                         puD3dTextureFormats, puNumHeaps,
79                                         puvmList, puNumFourCC,
80                                         puFourCC) == FALSE);
81 
82     RTEST(pHalInfo == NULL);
83     RTEST(pCallBackFlags == NULL);
84     RTEST(puD3dCallbacks == NULL);
85     RTEST(puD3dDriverData == NULL);
86     RTEST(puD3dBufferCallbacks == NULL);
87     RTEST(puD3dTextureFormats == NULL);
88     RTEST(puNumFourCC == NULL);
89     RTEST(puFourCC == NULL);
90     RTEST(puNumHeaps == NULL);
91     RTEST(puvmList == NULL);
92 
93     if (hDirectDraw == NULL)
94     {
95         skip("No DirectDrawObject\n");
96         ok(DeleteDC(hdc) != 0, "DeleteDC() failed\n");
97         return;
98     }
99 
100     /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, NULL, ....  */
101     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
102                                         pCallBackFlags, puD3dCallbacks,
103                                         puD3dDriverData, puD3dBufferCallbacks,
104                                         puD3dTextureFormats, puNumHeaps,
105                                         puvmList, puNumFourCC,
106                                         puFourCC) == FALSE);
107 
108     RTEST(pHalInfo == NULL);
109     RTEST(pCallBackFlags == NULL);
110     RTEST(puD3dCallbacks == NULL);
111     RTEST(puD3dDriverData == NULL);
112     RTEST(puD3dBufferCallbacks == NULL);
113     RTEST(puD3dTextureFormats == NULL);
114     RTEST(puNumFourCC == NULL);
115     RTEST(puFourCC == NULL);
116     RTEST(puNumHeaps == NULL);
117     RTEST(puvmList == NULL);
118 
119     /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, NULL, ....  */
120     pHalInfo = &HalInfo;
121     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
122                                         pCallBackFlags, puD3dCallbacks,
123                                         puD3dDriverData, puD3dBufferCallbacks,
124                                         puD3dTextureFormats, puNumHeaps,
125                                         puvmList, puNumFourCC,
126                                         puFourCC)== FALSE);
127 
128     RTEST(pHalInfo != NULL);
129     ASSERT(pHalInfo != NULL);
130 
131     RTEST(pCallBackFlags == NULL);
132     RTEST(puD3dCallbacks == NULL);
133     RTEST(puD3dDriverData == NULL);
134     RTEST(puD3dBufferCallbacks == NULL);
135     RTEST(puD3dTextureFormats == NULL);
136     RTEST(puNumFourCC == NULL);
137     RTEST(puFourCC == NULL);
138     RTEST(puNumHeaps == NULL);
139     RTEST(puvmList == NULL);
140 
141     if ((pHalInfo->dwSize != sizeof(DD_HALINFO)) &&
142         (pHalInfo->dwSize != sizeof(DD_HALINFO_V4)))
143     {
144         RTEST(pHalInfo->dwSize != sizeof(DD_HALINFO));
145         ASSERT(pHalInfo->dwSize != sizeof(DD_HALINFO));
146     }
147 
148     if (pHalInfo->dwSize == sizeof(DD_HALINFO))
149     {
150         /*the offset, in bytes, to primary surface in the display memory  */
151         /* some graphic card like  sis 760 GX, Nvida GF7900GS does not set any offset at all */
152         // RTEST(pHalInfo->vmiData.fpPrimary != 0 );
153 
154         /* unsuse always 0 */
155         RTEST(pHalInfo->vmiData.dwFlags == 0 );
156 
157         /* Check the res */
158         RTEST(pHalInfo->vmiData.dwDisplayWidth == devmode.dmPelsWidth );
159         RTEST(pHalInfo->vmiData.dwDisplayHeight == devmode.dmPelsHeight );
160 
161         /*  This can never be test for it is who big the line is after it been align displayPitch */
162         RTEST(pHalInfo->vmiData.lDisplayPitch != 0);
163 
164         RTEST(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT) );
165         ASSERT(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT));
166 
167         /* We can not check if it DDPF_RGB flags been set for primary surface
168          * for it can be DDPF_PALETTEINDEXED1,DDPF_PALETTEINDEXED2,DDPF_PALETTEINDEXED4,DDPF_PALETTEINDEXED8, DDPF_PALETTEINDEXEDTO8, DDPF_RGB, DDPF_YUV
169          */
170         RTEST( (pHalInfo->vmiData.ddpfDisplay.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4 |
171                                                          DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8 | DDPF_RGB | DDPF_YUV)) != 0);
172 
173 
174         /* No fourcc are use on primary screen */
175         RTEST(pHalInfo->vmiData.ddpfDisplay.dwFourCC == 0 );
176 
177         /* Count RGB Bits 8/16/24/32 */
178         RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount == devmode.dmBitsPerPel );
179 
180         /* The rgb mask can not be detected in user mode, for it can be 15Bpp convert to 16Bpp mode, so we have no way detect correct mask
181          * But the mask can never be Zero
182          */
183         RTEST(pHalInfo->vmiData.ddpfDisplay.dwRBitMask  !=  0 );
184         RTEST(pHalInfo->vmiData.ddpfDisplay.dwGBitMask !=  0 );
185         RTEST(pHalInfo->vmiData.ddpfDisplay.dwBBitMask != 0 );
186 
187         /* primary never set the alpha blend mask */
188         RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBAlphaBitMask ==  0 );
189 
190         /* This can not be test at usermode it is each hardware drv that fill in it,
191          * only way to found them is to use this call  */
192         // pHalInfo->vmiData->dwOffscreenAlign
193         // pHalInfo->vmiData->dwOverlayAlign
194         // pHalInfo->vmiData->dwTextureAlign
195         // pHalInfo->vmiData->dwZBufferAlign
196         // pHalInfo->vmiData->dwAlphaAlign
197 
198         /* the primary display address */
199         RTEST( ( (DWORD_PTR)pHalInfo->vmiData.pvPrimary & (~0x80000000)) != 0 );
200 
201         /* test see if we got back the pvmList here
202          * acording msdn vmiData.dwNumHeaps and vmiData.pvmList
203          * exists for _VIDEOMEMORYINFO but they do not, it reviews
204          * in ddk and wdk and own testcase
205          */
206          // RTEST(pHalInfo->vmiData.dwNumHeaps  != 0 );
207          // RTEST(pHalInfo->vmiData.pvmList  != 0 );
208 
209         /* Test see if we got any hardware acclartions for 2d or 3d, this always fill in
210          * that mean we found a bugi drv and dx does not work on this drv
211          */
212 
213         /* the SIS 760 GX will never fill it in, it is a bugi drv */
214         RTEST(pHalInfo->ddCaps.dwSize == sizeof(DDCORECAPS));
215 
216         /* Testing see if we got any hw support for
217          * This test can fail on video card that does not support 2d/overlay/3d
218          */
219         //RTEST( pHalInfo->ddCaps.dwCaps != 0);
220         RTEST( pHalInfo->ddCaps.ddsCaps.dwCaps != 0);
221 
222         /* This flags is obsolete and should not be used by the driver */
223         RTEST( pHalInfo->ddCaps.dwFXAlphaCaps == 0);
224 
225 
226         /* basic dx 2 is found if this flags not set
227          * if this fail we do not have a dx driver install acodring ms, some version of windows it
228          * is okay this fail and drv does then only support basic dx
229          *
230          */
231         if (pHalInfo->dwFlags != 0)
232         {
233             RTEST( (pHalInfo->dwFlags & (DDHALINFO_GETDRIVERINFOSET | DDHALINFO_GETDRIVERINFO2)) != 0 );
234             RTEST( ( (DWORD_PTR)pHalInfo->GetDriverInfo & 0x80000000) != 0 );
235             ASSERT( ((DWORD_PTR)pHalInfo->GetDriverInfo & 0x80000000) != 0 );
236         }
237 
238         /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
239 
240 
241        /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
242         * this will be fill in of all drv, it is not only for 3d stuff, this always fill by win32k.sys or dxg.sys depns
243         * if it windows 2000 or windows xp/2003
244         *
245         * point to kmode direcly to the win32k.sys, win32k.sys is kmode and it is kmode address we getting back
246         */
247         //RTEST( ( (DWORD_PTR)pHalInfo->lpD3DGlobalDriverData & (~0x80000000)) != 0 );
248         //RTEST( ( (DWORD_PTR)pHalInfo->lpD3DHALCallbacks & (~0x80000000)) != 0 );
249         //RTEST( ( (DWORD_PTR)pHalInfo->lpD3DHALCallbacks & (~0x80000000)) != 0 );
250     }
251 
252     /* Backup DD_HALINFO so we do not need resting it */
253     RtlCopyMemory(&oldHalInfo, &HalInfo, sizeof(DD_HALINFO));
254 
255     /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, NULL, ....  */
256     pHalInfo = &HalInfo;
257     pCallBackFlags = CallBackFlags;
258     RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
259 
260     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
261                                         pCallBackFlags, puD3dCallbacks,
262                                         puD3dDriverData, puD3dBufferCallbacks,
263                                         puD3dTextureFormats, puNumHeaps,
264                                         puvmList, puNumFourCC,
265                                         puFourCC)== FALSE);
266     RTEST(pHalInfo != NULL);
267     ASSERT(pHalInfo != NULL);
268 
269     RTEST(pCallBackFlags != NULL);
270     ASSERT(pCallBackFlags != NULL);
271 
272     RTEST(puD3dCallbacks == NULL);
273     RTEST(puD3dDriverData == NULL);
274     RTEST(puD3dBufferCallbacks == NULL);
275     RTEST(puD3dTextureFormats == NULL);
276     RTEST(puNumFourCC == NULL);
277     RTEST(puFourCC == NULL);
278     RTEST(puNumHeaps == NULL);
279     RTEST(puvmList == NULL);
280 
281     /* We do not retesting DD_HALINFO, instead we compare it */
282     RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
283 
284     /* Rember on some nivida drv the pCallBackFlags will not be set even they api exists in the drv
285      * known workaround is to check if the drv really return a kmode pointer for the drv functions
286      * we want to use.
287      */
288     //RTEST(pCallBackFlags[0] != 0);
289     //RTEST(pCallBackFlags[1] != 0);
290     RTEST(pCallBackFlags[2] == 0);
291 
292     /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, D3dCallbacks, NULL, ....  */
293     pHalInfo = &HalInfo;
294     pCallBackFlags = CallBackFlags;
295     puD3dCallbacks = &D3dCallbacks;
296 
297     RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
298     RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
299 
300     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
301                                         pCallBackFlags, puD3dCallbacks,
302                                         puD3dDriverData, puD3dBufferCallbacks,
303                                         puD3dTextureFormats, puNumHeaps,
304                                         puvmList, puNumFourCC,
305                                         puFourCC)== FALSE);
306     RTEST(pHalInfo != NULL);
307     ASSERT(pHalInfo != NULL);
308 
309     RTEST(pCallBackFlags != NULL);
310     ASSERT(pCallBackFlags != NULL);
311 
312     /* rember puD3dCallbacks shall never return NULL */
313     RTEST(puD3dCallbacks != NULL);
314     ASSERT(puD3dCallbacks != NULL);
315 
316     /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,
317      * this will be fill in of all drv, it is not only for 3d stuff, this always fill by win32k.sys or dxg.sys depns
318      * if it windows 2000 or windows xp/2003
319      */
320     //RTEST(puD3dCallbacks->dwSize == sizeof(D3DNTHAL_CALLBACKS));
321 
322     /* Nivda like GF7900GS will not follow ms design rule here,
323      * ContextDestroyAll must alwyas be NULL for it is not longer inuse in windows 2000 and higher
324      */
325     RTEST(puD3dCallbacks->ContextDestroyAll == NULL);
326 
327     /* Nivda like GF7900GS will not follow ms design rule here,
328      * SceneCapture must alwyas be NULL for it is not longer inuse in windows 2000 and higher
329      */
330     RTEST(puD3dCallbacks->SceneCapture  == NULL);
331     RTEST(puD3dCallbacks->dwReserved10 == 0);
332     RTEST(puD3dCallbacks->dwReserved11 == 0);
333     RTEST(puD3dCallbacks->dwReserved22 == 0);
334     RTEST(puD3dCallbacks->dwReserved23 == 0);
335     RTEST(puD3dCallbacks->dwReserved == 0);
336     RTEST(puD3dCallbacks->TextureCreate  == NULL);
337     RTEST(puD3dCallbacks->TextureDestroy  == NULL);
338     RTEST(puD3dCallbacks->TextureSwap  == NULL);
339     RTEST(puD3dCallbacks->TextureGetSurf  == NULL);
340     RTEST(puD3dCallbacks->dwReserved12 == 0);
341     RTEST(puD3dCallbacks->dwReserved13 == 0);
342     RTEST(puD3dCallbacks->dwReserved14 == 0);
343     RTEST(puD3dCallbacks->dwReserved15 == 0);
344     RTEST(puD3dCallbacks->dwReserved16 == 0);
345     RTEST(puD3dCallbacks->dwReserved17 == 0);
346     RTEST(puD3dCallbacks->dwReserved18 == 0);
347     RTEST(puD3dCallbacks->dwReserved19 == 0);
348     RTEST(puD3dCallbacks->dwReserved20 == 0);
349     RTEST(puD3dCallbacks->dwReserved21 == 0);
350     RTEST(puD3dCallbacks->dwReserved24 == 0);
351     RTEST(puD3dCallbacks->dwReserved0 == 0);
352     RTEST(puD3dCallbacks->dwReserved1 == 0);
353     RTEST(puD3dCallbacks->dwReserved2 == 0);
354     RTEST(puD3dCallbacks->dwReserved3 == 0);
355     RTEST(puD3dCallbacks->dwReserved4 == 0);
356     RTEST(puD3dCallbacks->dwReserved5 == 0);
357     RTEST(puD3dCallbacks->dwReserved6 == 0);
358     RTEST(puD3dCallbacks->dwReserved7 == 0);
359     RTEST(puD3dCallbacks->dwReserved8 == 0);
360     RTEST(puD3dCallbacks->dwReserved9 == 0);
361 
362     /* how detect puD3dCallbacks->ContextCreate and puD3dCallbacks->ContextDestroy shall be set for bugi drv like nivda ? */
363     /* pointer direcly to the graphic drv, it is kmode pointer */
364     // RTEST( ( (DWORD)puD3dCallbacks->ContextCreate & (~0x80000000)) != 0 );
365     // RTEST( ( (DWORD)puD3dCallbacks->ContextDestroy & (~0x80000000)) != 0 );
366 
367     RTEST(puD3dDriverData == NULL);
368     RTEST(puD3dBufferCallbacks == NULL);
369     RTEST(puD3dTextureFormats == NULL);
370     RTEST(puNumFourCC == NULL);
371     RTEST(puFourCC == NULL);
372     RTEST(puNumHeaps == NULL);
373     RTEST(puvmList == NULL);
374 
375     /* We do not retesting DD_HALINFO, instead we compare it */
376     RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
377     //RTEST(pCallBackFlags[0] != 0);
378     //RTEST(pCallBackFlags[1] != 0);
379     RTEST(pCallBackFlags[2] == 0);
380 
381     /* Backup D3DNTHAL_CALLBACKS so we do not need resting it */
382     RtlCopyMemory(&oldD3dCallbacks, &D3dCallbacks, sizeof(D3DNTHAL_CALLBACKS));
383 
384 
385 /* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, NULL, */
386     pHalInfo = &HalInfo;
387     pCallBackFlags = CallBackFlags;
388     puD3dCallbacks = &D3dCallbacks;
389     puD3dDriverData = &D3dDriverData;
390 
391     RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
392     RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
393     RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
394 
395     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
396                                         pCallBackFlags, puD3dCallbacks,
397                                         puD3dDriverData, puD3dBufferCallbacks,
398                                         puD3dTextureFormats, puNumHeaps,
399                                         puvmList, puNumFourCC,
400                                         puFourCC)== FALSE);
401     RTEST(pHalInfo != NULL);
402     ASSERT(pHalInfo != NULL);
403 
404     RTEST(pCallBackFlags != NULL);
405     ASSERT(pCallBackFlags != NULL);
406 
407     RTEST(puD3dCallbacks != NULL);
408     ASSERT(puD3dCallbacks != NULL);
409 
410     RTEST(puD3dDriverData != NULL);
411     ASSERT(puD3dDriverData != NULL);
412 
413     RTEST(puD3dBufferCallbacks == NULL);
414     RTEST(puD3dTextureFormats == NULL);
415     RTEST(puNumFourCC == NULL);
416     RTEST(puFourCC == NULL);
417     RTEST(puNumHeaps == NULL);
418     RTEST(puvmList == NULL);
419 
420     /* We retesting pCallBackFlags  */
421     //RTEST(pCallBackFlags[0] != 0);
422     //RTEST(pCallBackFlags[1] != 0);
423     RTEST(pCallBackFlags[2] == 0);
424 
425     /* We do not retesting instead we compare it */
426     RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
427     RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
428 
429     /* start test of puD3dDriverData */
430 
431     //RTEST(puD3dDriverData->dwSize == sizeof(D3DNTHAL_GLOBALDRIVERDATA));
432     //RTEST(puD3dDriverData->hwCaps.dwSize == sizeof(D3DNTHALDEVICEDESC_V1));
433     //RTEST(puD3dDriverData->hwCaps.dtcTransformCaps.dwSize == sizeof(D3DTRANSFORMCAPS));
434     //RTEST(puD3dDriverData->hwCaps.dlcLightingCaps.dwSize == sizeof(D3DLIGHTINGCAPS));
435     //RTEST(puD3dDriverData->hwCaps.dpcLineCaps.dwSize == sizeof(D3DPRIMCAPS));
436     //RTEST(puD3dDriverData->hwCaps.dpcTriCaps.dwSize  == sizeof(D3DPRIMCAPS));
437     RTEST(puD3dDriverData->hwCaps.dwMaxBufferSize == 0);
438     RTEST(puD3dDriverData->hwCaps.dwMaxVertexCount == 0);
439 
440     /* Backup D3DHAL_GLOBALDRIVERDATA so we do not need resting it */
441     RtlCopyMemory(&oldD3dDriverData, &D3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
442 
443 /* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, NULL, */
444     pHalInfo = &HalInfo;
445     pCallBackFlags = CallBackFlags;
446     puD3dCallbacks = &D3dCallbacks;
447     puD3dDriverData = &D3dDriverData;
448     puD3dBufferCallbacks = &D3dBufferCallbacks;
449 
450     RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
451     RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
452     RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
453     RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
454 
455     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
456                                         pCallBackFlags, puD3dCallbacks,
457                                         puD3dDriverData, puD3dBufferCallbacks,
458                                         puD3dTextureFormats, puNumHeaps,
459                                         puvmList, puNumFourCC,
460                                         puFourCC)== FALSE);
461     RTEST(pHalInfo != NULL);
462     RTEST(pCallBackFlags != NULL);
463 
464     if (pHalInfo->ddCaps.ddsCaps.dwCaps  & DDSCAPS_3DDEVICE )
465     {
466         RTEST(puD3dCallbacks != NULL);
467         RTEST(puD3dDriverData != NULL);
468         RTEST(puD3dBufferCallbacks != NULL);
469     }
470 
471     RTEST(pHalInfo != NULL);
472     ASSERT(pHalInfo != NULL);
473 
474     RTEST(pCallBackFlags != NULL);
475     ASSERT(pCallBackFlags != NULL);
476 
477     RTEST(puD3dCallbacks != NULL);
478     ASSERT(puD3dCallbacks != NULL);
479 
480     RTEST(puD3dDriverData != NULL);
481     ASSERT(puD3dDriverData != NULL);
482 
483     RTEST(puD3dBufferCallbacks != NULL);
484     ASSERT(puD3dDriverData != NULL);
485 
486     RTEST(puD3dTextureFormats == NULL);
487     RTEST(puNumFourCC == NULL);
488     RTEST(puFourCC == NULL);
489     RTEST(puNumHeaps == NULL);
490     RTEST(puvmList == NULL);
491 
492     /* We retesting the flags */
493     //RTEST(pCallBackFlags[0] != 0);
494     //RTEST(pCallBackFlags[1] != 0);
495     RTEST(pCallBackFlags[2] == 0);
496 
497     /* We do not retesting instead we compare it */
498     RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
499     RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
500     RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
501 
502     /* start test of puD3dBufferCallbacks */
503     //RTEST(puD3dBufferCallbacks->dwSize == sizeof(DD_D3DBUFCALLBACKS));
504     if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_CANCREATED3DBUF)
505     {
506         /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
507         RTEST( ( (DWORD_PTR)puD3dBufferCallbacks->CanCreateD3DBuffer & (~0x80000000)) != 0 );
508     }
509     else
510     {
511         RTEST( puD3dBufferCallbacks->CanCreateD3DBuffer == NULL);
512     }
513 
514     if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_CREATED3DBUF)
515     {
516         /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
517         RTEST( ( (DWORD_PTR)puD3dBufferCallbacks->CreateD3DBuffer & (~0x80000000)) != 0 );
518     }
519     else
520     {
521         RTEST( puD3dBufferCallbacks->CreateD3DBuffer == NULL);
522     }
523 
524     if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_DESTROYD3DBUF)
525     {
526         /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
527         RTEST( ( (DWORD_PTR)puD3dBufferCallbacks->DestroyD3DBuffer & (~0x80000000)) != 0 );
528     }
529     else
530     {
531         RTEST( puD3dBufferCallbacks->DestroyD3DBuffer == NULL);
532     }
533 
534     if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_LOCKD3DBUF)
535     {
536         /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
537         RTEST( ( (DWORD_PTR)puD3dBufferCallbacks->LockD3DBuffer & (~0x80000000)) != 0 );
538     }
539     else
540     {
541         RTEST( puD3dBufferCallbacks->LockD3DBuffer == NULL);
542     }
543 
544     if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_UNLOCKD3DBUF)
545     {
546         /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/
547         RTEST( ( (DWORD_PTR)puD3dBufferCallbacks->UnlockD3DBuffer & (~0x80000000)) != 0 );
548     }
549     else
550     {
551         RTEST( puD3dBufferCallbacks->UnlockD3DBuffer == NULL);
552     }
553 
554     /* Backup DD_D3DBUFCALLBACKS so we do not need resting it */
555     RtlCopyMemory(&oldD3dBufferCallbacks, &D3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS));
556 
557 
558 /* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, NULL, */
559     pHalInfo = &HalInfo;
560     pCallBackFlags = CallBackFlags;
561     puD3dCallbacks = &D3dCallbacks;
562     puD3dDriverData = &D3dDriverData;
563     puD3dBufferCallbacks = &D3dBufferCallbacks;
564 
565     /* It is forbein to return a  DDSURFACEDESC2 it should always be DDSURFACEDESC
566         This is only for detected bad drivers that does not follow the rules, if they
567         does not follow tthe rules, not everthing being copy then in gdi32.dll
568         gdi32.dll always assume it is DDSURFACEDESC size
569     */
570     if (puD3dDriverData->dwNumTextureFormats != 0)
571     {
572         puD3dTextureFormats = malloc (puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));
573         ASSERT(puD3dTextureFormats != NULL);
574     }
575 
576     RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
577     RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
578     RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
579     RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
580     RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
581 
582     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
583                                         pCallBackFlags, puD3dCallbacks,
584                                         puD3dDriverData, puD3dBufferCallbacks,
585                                         puD3dTextureFormats, puNumHeaps,
586                                         puvmList, puNumFourCC,
587                                         puFourCC)== FALSE);
588 
589     RTEST(pHalInfo != NULL);
590     ASSERT(pHalInfo != NULL);
591 
592     RTEST(pCallBackFlags != NULL);
593     ASSERT(pCallBackFlags != NULL);
594 
595     RTEST(puD3dCallbacks != NULL);
596     ASSERT(puD3dCallbacks != NULL);
597 
598     RTEST(puD3dDriverData != NULL);
599     ASSERT(puD3dDriverData != NULL);
600 
601     RTEST(puD3dBufferCallbacks != NULL);
602     ASSERT(puD3dDriverData != NULL);
603 
604     RTEST(puNumFourCC == NULL);
605     RTEST(puFourCC == NULL);
606     RTEST(puNumHeaps == NULL);
607     RTEST(puvmList == NULL);
608 
609     /* We retesting the flags */
610     //RTEST(pCallBackFlags[0] != 0);
611     //RTEST(pCallBackFlags[1] != 0);
612     RTEST(pCallBackFlags[2] == 0);
613 
614     /* We do not retesting instead we compare it */
615     RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
616     RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
617     RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
618     RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);
619 
620     /* start test of dwNumTextureFormats */
621     if (puD3dDriverData->dwNumTextureFormats != 0)
622     {
623         myDesc = puD3dTextureFormats;
624         for (dwTextureCounter=0;dwTextureCounter<puD3dDriverData->dwNumTextureFormats;dwTextureCounter++)
625         {
626             RTEST(myDesc->dwSize == sizeof(DDSURFACEDESC));
627             ASSERT(myDesc->dwSize == sizeof(DDSURFACEDESC));
628 
629             RTEST( (myDesc->dwFlags & (~(DDSD_CAPS|DDSD_PIXELFORMAT))) == 0);
630             RTEST(myDesc->dwHeight == 0);
631             RTEST(myDesc->dwWidth == 0);
632             RTEST(myDesc->dwLinearSize == 0);
633             RTEST(myDesc->dwBackBufferCount == 0);
634             RTEST(myDesc->dwZBufferBitDepth == 0);
635             RTEST(myDesc->dwAlphaBitDepth == 0);
636             RTEST(myDesc->dwReserved == 0);
637             RTEST(myDesc->lpSurface == 0);
638             RTEST(myDesc->ddckCKDestOverlay.dwColorSpaceLowValue == 0);
639             RTEST(myDesc->ddckCKDestOverlay.dwColorSpaceHighValue == 0);
640             RTEST(myDesc->ddckCKDestBlt.dwColorSpaceLowValue == 0);
641             RTEST(myDesc->ddckCKDestBlt.dwColorSpaceHighValue == 0);
642             RTEST(myDesc->ddckCKSrcOverlay.dwColorSpaceLowValue == 0);
643             RTEST(myDesc->ddckCKSrcOverlay.dwColorSpaceHighValue == 0);
644             RTEST(myDesc->ddckCKSrcBlt.dwColorSpaceLowValue == 0);
645             RTEST(myDesc->ddckCKSrcBlt.dwColorSpaceHighValue == 0);
646             RTEST(myDesc->ddpfPixelFormat.dwSize == sizeof(DDPIXELFORMAT));
647             RTEST(myDesc->ddpfPixelFormat.dwFlags != 0);
648             if (myDesc->ddpfPixelFormat.dwFlags & DDPF_FOURCC)
649             {
650                 RTEST(myDesc->ddpfPixelFormat.dwFourCC != 0);
651             }
652             RTEST(myDesc->ddsCaps.dwCaps == DDSCAPS_TEXTURE);
653 
654             myDesc = (DDSURFACEDESC *) (((DWORD_PTR) myDesc) + sizeof(DDSURFACEDESC));
655         }
656     }
657 
658 
659     /* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, NULL, */
660     pHalInfo = &HalInfo;
661     pCallBackFlags = CallBackFlags;
662     puD3dCallbacks = &D3dCallbacks;
663     puD3dDriverData = &D3dDriverData;
664     puD3dBufferCallbacks = &D3dBufferCallbacks;
665     puNumHeaps = &NumHeaps;
666 
667     if (puD3dDriverData->dwNumTextureFormats != 0)
668     {
669         RtlZeroMemory(puD3dTextureFormats, puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));
670     }
671     RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
672     RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
673     RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
674     RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
675     RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
676 
677     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
678                                         pCallBackFlags, puD3dCallbacks,
679                                         puD3dDriverData, puD3dBufferCallbacks,
680                                         puD3dTextureFormats, puNumHeaps,
681                                         puvmList, puNumFourCC,
682                                         puFourCC)== FALSE);
683 
684     RTEST(pHalInfo != NULL);
685     ASSERT(pHalInfo != NULL);
686 
687     RTEST(pCallBackFlags != NULL);
688     ASSERT(pCallBackFlags != NULL);
689 
690     RTEST(puD3dCallbacks != NULL);
691     ASSERT(puD3dCallbacks != NULL);
692 
693     RTEST(puD3dDriverData != NULL);
694     ASSERT(puD3dDriverData != NULL);
695 
696     RTEST(puD3dBufferCallbacks != NULL);
697     ASSERT(puD3dDriverData != NULL);
698 
699     RTEST(puNumHeaps != NULL);
700     ASSERT(puNumHeaps != NULL);
701     RTEST(NumHeaps == 0);
702 
703     RTEST(puNumFourCC == NULL);
704     RTEST(puFourCC == NULL);
705 
706     RTEST(puvmList == NULL);
707 
708     /* We retesting the flags */
709     //RTEST(pCallBackFlags[0] != 0);
710     //RTEST(pCallBackFlags[1] != 0);
711     RTEST(pCallBackFlags[2] == 0);
712 
713     /* We do not retesting instead we compare it */
714     RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
715     RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
716     RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
717     RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);
718     /* we skip resting texture */
719 
720 
721     /* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, puvmList, NULL, */
722     pHalInfo = &HalInfo;
723     pCallBackFlags = CallBackFlags;
724     puD3dCallbacks = &D3dCallbacks;
725     puD3dDriverData = &D3dDriverData;
726     puD3dBufferCallbacks = &D3dBufferCallbacks;
727     puNumHeaps = &NumHeaps;
728     puvmList = &vmList;
729 
730     if (puD3dDriverData->dwNumTextureFormats != 0)
731     {
732         RtlZeroMemory(puD3dTextureFormats, puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));
733     }
734     RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));
735     RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);
736     RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));
737     RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));
738     RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));
739 
740     RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,
741                                         pCallBackFlags, puD3dCallbacks,
742                                         puD3dDriverData, puD3dBufferCallbacks,
743                                         puD3dTextureFormats, puNumHeaps,
744                                         puvmList, puNumFourCC,
745                                         puFourCC)== FALSE);
746 
747     RTEST(pHalInfo != NULL);
748     ASSERT(pHalInfo != NULL);
749 
750     RTEST(pCallBackFlags != NULL);
751     ASSERT(pCallBackFlags != NULL);
752 
753     RTEST(puD3dCallbacks != NULL);
754     ASSERT(puD3dCallbacks != NULL);
755 
756     RTEST(puD3dDriverData != NULL);
757     ASSERT(puD3dDriverData != NULL);
758 
759     RTEST(puD3dBufferCallbacks != NULL);
760     ASSERT(puD3dDriverData != NULL);
761 
762     RTEST(puNumHeaps != NULL);
763     ASSERT(puNumHeaps != NULL);
764     RTEST(NumHeaps == 0);
765 
766     RTEST(puvmList != NULL);
767 
768     RTEST(puNumFourCC == NULL);
769     RTEST(puFourCC == NULL);
770 
771 
772 
773     /* We retesting the flags */
774     //RTEST(pCallBackFlags[0] != 0);
775     //RTEST(pCallBackFlags[1] != 0);
776     RTEST(pCallBackFlags[2] == 0);
777 
778     /* We do not retesting instead we compare it */
779     RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);
780     RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);
781     RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);
782     RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);
783     /* we skip resting texture */
784 
785     /* Todo
786     * adding test for
787     * puNumFourCC
788     * puFourCC
789     */
790 
791     ok(NtGdiDdDeleteDirectDrawObject(hDirectDraw) == TRUE,
792        "NtGdiDdDeleteDirectDrawObject() failed\n");
793 
794     ok(DeleteDC(hdc) != 0, "DeleteDC() failed\n");
795 }
796