Fixed one test so it be more fair.
[reactos.git] / rostests / apitests / w32knapi / ntdd / NtGdiDdQueryDirectDrawObject.c
index 4c375cb..a73c0dc 100644 (file)
-#include "../w32knapi.h"\r
-\r
-W32KAPI\r
-BOOL STDCALL \r
-NtGdiDdQueryDirectDrawObject(\r
-    HANDLE hDirectDrawLocal,\r
-    DD_HALINFO  *pHalInfo,\r
-    DWORD *pCallBackFlags,\r
-    LPD3DNTHAL_CALLBACKS puD3dCallbacks,\r
-    LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData,\r
-    PDD_D3DBUFCALLBACKS puD3dBufferCallbacks,\r
-    LPDDSURFACEDESC puD3dTextureFormats,\r
-    DWORD *puNumHeaps,\r
-    VIDEOMEMORY *puvmList,\r
-    DWORD *puNumFourCC,\r
-    DWORD *puFourCC\r
-)\r
-{\r
-       return (BOOL)Syscall(L"NtGdiDdQueryDirectDrawObject", 11, &hDirectDrawLocal);\r
-}\r
 \r
+/* Note : OsThunkDdQueryDirectDrawObject is the usermode name of NtGdiDdQueryDirectDrawObject\r
+ *        it lives in d3d8thk.dll and in windows 2000 it doing syscall direcly to win32k.sus\r
+ *        in windows xp and higher it call to gdi32.dll to DdEntry41 and it doing the syscall\r
+ */\r
 INT\r
 Test_NtGdiDdQueryDirectDrawObject(PTESTINFO pti)\r
 {\r
-       HANDLE  hDirectDraw = NULL;\r
-       DD_HALINFO *pHalInfo = NULL;\r
-       DWORD *pCallBackFlags = NULL;\r
-       LPD3DNTHAL_CALLBACKS puD3dCallbacks = NULL;\r
-       LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData = NULL;\r
-       PDD_D3DBUFCALLBACKS puD3dBufferCallbacks = NULL;\r
-       LPDDSURFACEDESC puD3dTextureFormats = NULL;\r
-       DWORD *puNumHeaps = NULL;\r
-       VIDEOMEMORY *puvmList = NULL;\r
-       DWORD *puNumFourCC = NULL;\r
-       DWORD *puFourCC = NULL;\r
-\r
-       DD_HALINFO HalInfo;\r
-       DD_HALINFO oldHalInfo;\r
-       DWORD CallBackFlags[4];\r
-       D3DNTHAL_CALLBACKS D3dCallbacks;\r
-       D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;\r
-       DD_D3DBUFCALLBACKS D3dBufferCallbacks;\r
-       DDSURFACEDESC2 D3dTextureFormats[100];\r
-       //DWORD NumHeaps = 0;\r
-       VIDEOMEMORY vmList;\r
-       //DWORD NumFourCC = 0;\r
-       //DWORD FourCC = 0;\r
-       DEVMODE devmode;\r
-       HDC hdc;\r
-\r
-\r
-       /* clear data */\r
-       memset(&vmList,0,sizeof(VIDEOMEMORY));\r
-       memset(&D3dTextureFormats,0,sizeof(DDSURFACEDESC));\r
-       memset(&D3dBufferCallbacks,0,sizeof(DD_D3DBUFCALLBACKS));\r
-       memset(&D3dDriverData,0,sizeof(D3DNTHAL_GLOBALDRIVERDATA));\r
-       memset(&D3dCallbacks,0,sizeof(D3DNTHAL_CALLBACKS));\r
-       memset(&HalInfo,0,sizeof(DD_HALINFO));\r
-       memset(CallBackFlags,0,sizeof(DWORD)*3);\r
-\r
-\r
-\r
-       /* Get currenet display mode */\r
-       EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);\r
-\r
-       hdc = CreateDCW(L"DISPLAY",NULL,NULL,NULL);\r
-       ASSERT1(hdc != NULL);\r
-\r
-       hDirectDraw = (HANDLE) Syscall(L"NtGdiDdCreateDirectDrawObject", 1, &hdc);\r
-       ASSERT1(hDirectDraw != NULL);\r
-\r
-       /* Test ReactX */\r
-       hDirectDraw = (HANDLE) Syscall(L"NtGdiDdCreateDirectDrawObject", 1, &hdc);\r
-\r
-       RTEST(NtGdiDdQueryDirectDrawObject( NULL, pHalInfo, \r
-                                                                               pCallBackFlags, puD3dCallbacks, \r
-                                                                               puD3dDriverData, puD3dBufferCallbacks, \r
-                                                                               puD3dTextureFormats, puNumHeaps, \r
-                                                                               puvmList, puNumFourCC,\r
-                                                                               puFourCC) == FALSE);\r
-\r
-       RTEST(pHalInfo == NULL);\r
-       RTEST(pCallBackFlags == NULL);\r
-       RTEST(puD3dCallbacks == NULL);\r
-       RTEST(puD3dDriverData == NULL);\r
-       RTEST(puD3dBufferCallbacks == NULL);\r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-\r
-       RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo, \r
-                                                                               pCallBackFlags, puD3dCallbacks, \r
-                                                                               puD3dDriverData, puD3dBufferCallbacks, \r
-                                                                               puD3dTextureFormats, puNumHeaps, \r
-                                                                               puvmList, puNumFourCC,\r
-                                                                               puFourCC) == FALSE);\r
-\r
-       RTEST(pHalInfo == NULL);\r
-       RTEST(pCallBackFlags == NULL);\r
-       RTEST(puD3dCallbacks == NULL);\r
-       RTEST(puD3dDriverData == NULL);\r
-       RTEST(puD3dBufferCallbacks == NULL);\r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-\r
-       pHalInfo = &HalInfo;\r
-       RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo, \r
-                                                                               pCallBackFlags, puD3dCallbacks, \r
-                                                                               puD3dDriverData, puD3dBufferCallbacks, \r
-                                                                               puD3dTextureFormats, puNumHeaps, \r
-                                                                               puvmList, puNumFourCC,\r
-                                                                               puFourCC)== FALSE);\r
-       RTEST(pHalInfo != NULL);\r
-       RTEST(pCallBackFlags == NULL);\r
-       RTEST(puD3dCallbacks == NULL);\r
-       RTEST(puD3dDriverData == NULL);\r
-       RTEST(puD3dBufferCallbacks == NULL);\r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-       ASSERT1(pHalInfo != NULL);\r
-\r
-       if ((pHalInfo->dwSize != sizeof(DD_HALINFO)) &&\r
-               (pHalInfo->dwSize != sizeof(DD_HALINFO_V4)))\r
-       {\r
-               RTEST(pHalInfo->dwSize != sizeof(DD_HALINFO));\r
-               ASSERT1(pHalInfo->dwSize != sizeof(DD_HALINFO));\r
-       }\r
-\r
-\r
-\r
-       if (pHalInfo->dwSize == sizeof(DD_HALINFO))\r
-       {\r
-               /*the offset, in bytes, to primary surface in the display memory  */\r
-               RTEST(pHalInfo->vmiData.fpPrimary != 0 );\r
-\r
-               /* unsuse always 0 */\r
-               RTEST(pHalInfo->vmiData.dwFlags == 0 );\r
-\r
-               /* Check the res */\r
-               RTEST(pHalInfo->vmiData.dwDisplayWidth == devmode.dmPelsWidth );\r
-               RTEST(pHalInfo->vmiData.dwDisplayHeight == devmode.dmPelsHeight ); \r
-               /* FIXME \r
-                       RTEST(pHalInfo->vmiData.lDisplayPitch == 0x1700;\r
-               */\r
-               RTEST(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT) ); \r
-               ASSERT1(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT));\r
-\r
-               /* Fail on 8bit screen deep */\r
-               RTEST(pHalInfo->vmiData.ddpfDisplay.dwFlags  == DDPF_RGB);\r
-\r
-\r
-               /* No fourcc are use on primary screen */\r
-               RTEST(pHalInfo->vmiData.ddpfDisplay.dwFourCC == 0 );\r
-\r
-               /* Count RGB Bits 8/16/24/32 */\r
-               RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount == devmode.dmBitsPerPel );\r
-\r
-               /* FIXME RGB mask */\r
-               //RTEST(pHalInfo->vmiData.ddpfDisplay.dwRBitMask  ==  0 );\r
-               //RTEST(pHalInfo->vmiData.ddpfDisplay.dwGBitMask ==  0 );\r
-               //RTEST(pHalInfo->vmiData.ddpfDisplay.dwBBitMask == 0 );\r
-\r
-               /* primary never set the alpha blend mask */\r
-               RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBAlphaBitMask ==  0 );\r
-\r
-               /* FIXME do not known how test follow thing, for it is diffent for each drv */\r
-               // pHalInfo->vmiData->dwOffscreenAlign               : 0x00000100\r
-               // pHalInfo->vmiData->dwOverlayAlign                 : 0x00000010\r
-               // pHalInfo->vmiData->dwTextureAlign                 : 0x00000020\r
-               // pHalInfo->vmiData->dwZBufferAlign                 : 0x00001000\r
-               // pHalInfo->vmiData->dwAlphaAlign                   : 0x00000000\r
-\r
-               /* the primary display address */\r
-               /* test see if it in kmode memory or not */\r
-               RTEST(pHalInfo->vmiData.pvPrimary != 0 );\r
-               \r
-               /* Test see if we got any hardware acclartions for 2d or 3d */\r
-               //RTEST(pHalInfo->ddCaps.dwSize == sizeof(DDCORECAPS));\r
-\r
-               /* Testing see if we got any hw support for \r
-                * This test can fail on video card that does not support 2d/overlay/3d \r
-                */\r
-               RTEST( pHalInfo->ddCaps.dwCaps != 0);\r
-               RTEST( pHalInfo->ddCaps.ddsCaps.dwCaps != 0);\r
-\r
-               /* if this fail we do not have a dx driver install acodring ms, some version of windows it\r
-                * is okay this fail and drv does then only support basic dx \r
-                */\r
-               RTEST( (pHalInfo->dwFlags & (DDHALINFO_GETDRIVERINFOSET | DDHALINFO_GETDRIVERINFO2)) != 0 );\r
-\r
-               if (pHalInfo->ddCaps.ddsCaps.dwCaps  & DDSCAPS_3DDEVICE )\r
-               {\r
-                       RTEST( pHalInfo->lpD3DGlobalDriverData != 0);\r
-                       RTEST( pHalInfo->lpD3DHALCallbacks != 0);\r
-                       RTEST( pHalInfo->lpD3DBufCallbacks != 0);\r
-               }\r
-       }\r
-\r
-       /* FIXME DD_HALINFO_V4 test */\r
-\r
-/* Next Start 2 */\r
-       RtlCopyMemory(&oldHalInfo, &HalInfo, sizeof(DD_HALINFO));\r
-\r
-       pHalInfo = &HalInfo;\r
-       pCallBackFlags = CallBackFlags;\r
-       RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
-\r
-       RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo, \r
-                                                                               pCallBackFlags, puD3dCallbacks, \r
-                                                                               puD3dDriverData, puD3dBufferCallbacks, \r
-                                                                               puD3dTextureFormats, puNumHeaps, \r
-                                                                               puvmList, puNumFourCC,\r
-                                                                               puFourCC)== FALSE);\r
-       RTEST(pHalInfo != NULL);\r
-       RTEST(pCallBackFlags != NULL);\r
-       RTEST(puD3dCallbacks == NULL);\r
-       RTEST(puD3dDriverData == NULL);\r
-       RTEST(puD3dBufferCallbacks == NULL);\r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-       ASSERT1(pHalInfo != NULL);\r
-\r
-       /* We do not retesting DD_HALINFO, instead we compare it */\r
-       RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
-       RTEST(pCallBackFlags[0] != 0);\r
-       RTEST(pCallBackFlags[1] != 0);\r
-\r
-       /* NT4 this will fail */\r
-       RTEST(pCallBackFlags[2] == 0);\r
-\r
-/* Next Start 3 */\r
-       pHalInfo = &HalInfo;\r
-       pCallBackFlags = CallBackFlags;\r
-       puD3dCallbacks = &D3dCallbacks;\r
-\r
-       RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
-       RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
-\r
-       RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo, \r
-                                                                               pCallBackFlags, puD3dCallbacks, \r
-                                                                               puD3dDriverData, puD3dBufferCallbacks, \r
-                                                                               puD3dTextureFormats, puNumHeaps, \r
-                                                                               puvmList, puNumFourCC,\r
-                                                                               puFourCC)== FALSE);\r
-       RTEST(pHalInfo != NULL);\r
-       RTEST(pCallBackFlags != NULL);\r
-\r
-       if (pHalInfo->ddCaps.ddsCaps.dwCaps  & DDSCAPS_3DDEVICE )\r
-       {\r
-               RTEST(puD3dCallbacks != NULL);\r
-       }\r
-\r
-       RTEST(puD3dDriverData == NULL);\r
-       RTEST(puD3dBufferCallbacks == NULL);\r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-       ASSERT1(pHalInfo != NULL);\r
-\r
-       /* We do not retesting DD_HALINFO, instead we compare it */\r
-       RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
-       RTEST(pCallBackFlags[0] != 0);\r
-       RTEST(pCallBackFlags[1] != 0);\r
-\r
-       /* NT4 this will fail */\r
-       RTEST(pCallBackFlags[2] == 0);\r
-\r
-/* Next Start 4 */\r
-       pHalInfo = &HalInfo;\r
-       pCallBackFlags = CallBackFlags;\r
-       puD3dCallbacks = &D3dCallbacks;\r
-       puD3dDriverData = &D3dDriverData;\r
-\r
-       RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
-       RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
-       RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
-\r
-       RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo, \r
-                                                                               pCallBackFlags, puD3dCallbacks, \r
-                                                                               puD3dDriverData, puD3dBufferCallbacks, \r
-                                                                               puD3dTextureFormats, puNumHeaps, \r
-                                                                               puvmList, puNumFourCC,\r
-                                                                               puFourCC)== FALSE);\r
-       RTEST(pHalInfo != NULL);\r
-       RTEST(pCallBackFlags != NULL);\r
-\r
-       if (pHalInfo->ddCaps.ddsCaps.dwCaps  & DDSCAPS_3DDEVICE )\r
-       {\r
-               RTEST(puD3dCallbacks != NULL);\r
-               RTEST(puD3dDriverData != NULL);\r
-       }\r
-\r
-       RTEST(puD3dBufferCallbacks == NULL);\r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-       ASSERT1(pHalInfo != NULL);\r
-\r
-       /* We do not retesting DD_HALINFO, instead we compare it */\r
-       RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
-       RTEST(pCallBackFlags[0] != 0);\r
-       RTEST(pCallBackFlags[1] != 0);\r
-\r
-       /* NT4 this will fail */\r
-       RTEST(pCallBackFlags[2] == 0);\r
-\r
-/* Next Start 5 */\r
-       pHalInfo = &HalInfo;\r
-       pCallBackFlags = CallBackFlags;\r
-       puD3dCallbacks = &D3dCallbacks;\r
-       puD3dDriverData = &D3dDriverData;\r
-       puD3dBufferCallbacks = &D3dBufferCallbacks;\r
-\r
-       RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
-       RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
-       RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
-       RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_CALLBACKS));\r
-\r
-       RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo, \r
-                                                                               pCallBackFlags, puD3dCallbacks, \r
-                                                                               puD3dDriverData, puD3dBufferCallbacks, \r
-                                                                               puD3dTextureFormats, puNumHeaps, \r
-                                                                               puvmList, puNumFourCC,\r
-                                                                               puFourCC)== FALSE);\r
-       RTEST(pHalInfo != NULL);\r
-       RTEST(pCallBackFlags != NULL);\r
-\r
-       if (pHalInfo->ddCaps.ddsCaps.dwCaps  & DDSCAPS_3DDEVICE )\r
-       {\r
-               RTEST(puD3dCallbacks != NULL);\r
-               RTEST(puD3dDriverData != NULL);\r
-       }\r
-\r
-       RTEST(puD3dBufferCallbacks == NULL);\r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-       ASSERT1(pHalInfo != NULL);\r
-\r
-       /* We do not retesting DD_HALINFO, instead we compare it */\r
-       RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
-       RTEST(pCallBackFlags[0] != 0);\r
-       RTEST(pCallBackFlags[1] != 0);\r
-\r
-       /* NT4 this will fail */\r
-       RTEST(pCallBackFlags[2] == 0);\r
-\r
-\r
-\r
-/* Next Start 6 */\r
-       //pHalInfo = &HalInfo;\r
-       //pCallBackFlags = CallBackFlags;\r
-       //puD3dCallbacks = &D3dCallbacks;\r
-       //puD3dDriverData = &D3dDriverData;\r
-       //puD3dBufferCallbacks = &D3dBufferCallbacks;\r
-\r
-       //RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
-       //RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
-       //RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
-       ////RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_CALLBACKS));\r
-       //RtlZeroMemory(&D3dBufferCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
-\r
-       //RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo, \r
-       //                                                                      pCallBackFlags, puD3dCallbacks, \r
-       //                                                                      puD3dDriverData, puD3dBufferCallbacks, \r
-       //                                                                      puD3dTextureFormats, puNumHeaps, \r
-       //                                                                      puvmList, puNumFourCC,\r
-       //                                                                      puFourCC)== FALSE);\r
-       //RTEST(pHalInfo != NULL);\r
-       //RTEST(pCallBackFlags != NULL);\r
-\r
-       //if (pHalInfo->ddCaps.ddsCaps.dwCaps  & DDSCAPS_3DDEVICE )\r
-       //{\r
-       //      RTEST(puD3dCallbacks != NULL);\r
-       //      RTEST(puD3dDriverData != NULL);\r
-       //      RTEST(puD3dBufferCallbacks != NULL);\r
-       //}\r
-\r
-\r
-       //RTEST(puD3dTextureFormats == NULL);\r
-       //RTEST(puNumFourCC == NULL);\r
-       //RTEST(puFourCC == NULL);\r
-       //ASSERT1(pHalInfo != NULL);\r
-\r
-       ///* We do not retesting DD_HALINFO, instead we compare it */\r
-       //RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
-       //RTEST(pCallBackFlags[0] != 0);\r
-       //RTEST(pCallBackFlags[1] != 0);\r
-\r
-       ///* NT4 this will fail */\r
-       //RTEST(pCallBackFlags[2] == 0);\r
-\r
-\r
-/* FIXME \r
-       RTEST(puD3dTextureFormats == NULL);\r
-       RTEST(puNumFourCC == NULL);\r
-       RTEST(puFourCC == NULL);\r
-*/\r
-       /* Cleanup ReactX setup */\r
-       DeleteDC(hdc);\r
-       Syscall(L"NtGdiDdDeleteDirectDrawObject", 1, &hDirectDraw);\r
-\r
-       return APISTATUS_NORMAL;\r
+    HANDLE  hDirectDraw = NULL;\r
+    DD_HALINFO *pHalInfo = NULL;\r
+    DWORD *pCallBackFlags = NULL;\r
+    LPD3DNTHAL_CALLBACKS puD3dCallbacks = NULL;\r
+    LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData = NULL;\r
+    PDD_D3DBUFCALLBACKS puD3dBufferCallbacks = NULL;\r
+    LPDDSURFACEDESC puD3dTextureFormats = NULL;\r
+    DWORD *puNumHeaps = NULL;\r
+    VIDEOMEMORY *puvmList = NULL;\r
+    DWORD *puNumFourCC = NULL;\r
+    DWORD *puFourCC = NULL;\r
+\r
+    DD_HALINFO HalInfo;\r
+    DD_HALINFO oldHalInfo;\r
+    DWORD CallBackFlags[4];\r
+\r
+    D3DNTHAL_CALLBACKS D3dCallbacks;\r
+    D3DNTHAL_CALLBACKS oldD3dCallbacks;\r
+\r
+    D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;\r
+    D3DNTHAL_GLOBALDRIVERDATA oldD3dDriverData;\r
+\r
+    DD_D3DBUFCALLBACKS D3dBufferCallbacks;\r
+    DD_D3DBUFCALLBACKS oldD3dBufferCallbacks;\r
+\r
+    DDSURFACEDESC2 D3dTextureFormats[100];\r
+    DWORD NumHeaps = 0;\r
+    VIDEOMEMORY vmList;\r
+    //DWORD NumFourCC = 0;\r
+    //DWORD FourCC = 0;\r
+    DEVMODE devmode;\r
+    HDC hdc;\r
+\r
+    DWORD dwTextureCounter = 0;\r
+    DDSURFACEDESC *myDesc = NULL;\r
+\r
+    /* clear data */\r
+    memset(&vmList,0,sizeof(VIDEOMEMORY));\r
+    memset(&D3dTextureFormats,0,sizeof(DDSURFACEDESC));\r
+    memset(&D3dBufferCallbacks,0,sizeof(DD_D3DBUFCALLBACKS));\r
+    memset(&D3dDriverData,0,sizeof(D3DNTHAL_GLOBALDRIVERDATA));\r
+    memset(&D3dCallbacks,0,sizeof(D3DNTHAL_CALLBACKS));\r
+    memset(&HalInfo,0,sizeof(DD_HALINFO));\r
+    memset(CallBackFlags,0,sizeof(DWORD)*3);\r
+\r
+    /* Get currenet display mode */\r
+    EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);\r
+\r
+    /* Create hdc that we can use */\r
+    hdc = CreateDCW(L"DISPLAY",NULL,NULL,NULL);\r
+    ASSERT(hdc != NULL);\r
+\r
+\r
+    /* Create ReactX handle */\r
+    hDirectDraw = (HANDLE) NtGdiDdCreateDirectDrawObject(hdc);\r
+    ASSERT(hDirectDraw != NULL);\r
+\r
+    /* Start Test ReactX NtGdiDdQueryDirectDrawObject function */\r
+\r
+    /* testing  OsThunkDdQueryDirectDrawObject( NULL, ....  */\r
+    RTEST(NtGdiDdQueryDirectDrawObject( NULL, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC) == FALSE);\r
+\r
+    RTEST(pHalInfo == NULL);\r
+    RTEST(pCallBackFlags == NULL);\r
+    RTEST(puD3dCallbacks == NULL);\r
+    RTEST(puD3dDriverData == NULL);\r
+    RTEST(puD3dBufferCallbacks == NULL);\r
+    RTEST(puD3dTextureFormats == NULL);\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, NULL, ....  */\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC) == FALSE);\r
+\r
+    RTEST(pHalInfo == NULL);\r
+    RTEST(pCallBackFlags == NULL);\r
+    RTEST(puD3dCallbacks == NULL);\r
+    RTEST(puD3dDriverData == NULL);\r
+    RTEST(puD3dBufferCallbacks == NULL);\r
+    RTEST(puD3dTextureFormats == NULL);\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, NULL, ....  */\r
+    pHalInfo = &HalInfo;\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags == NULL);\r
+    RTEST(puD3dCallbacks == NULL);\r
+    RTEST(puD3dDriverData == NULL);\r
+    RTEST(puD3dBufferCallbacks == NULL);\r
+    RTEST(puD3dTextureFormats == NULL);\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);   \r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    if ((pHalInfo->dwSize != sizeof(DD_HALINFO)) &&\r
+        (pHalInfo->dwSize != sizeof(DD_HALINFO_V4)))\r
+    {\r
+        RTEST(pHalInfo->dwSize != sizeof(DD_HALINFO));\r
+        ASSERT(pHalInfo->dwSize != sizeof(DD_HALINFO));\r
+    }\r
+\r
+    if (pHalInfo->dwSize == sizeof(DD_HALINFO))\r
+    {\r
+        /*the offset, in bytes, to primary surface in the display memory  */\r
+        /* some graphic card like  sis 760 GX, Nvida GF7900GS does not set any offset at all */\r
+        // RTEST(pHalInfo->vmiData.fpPrimary != 0 );\r
+\r
+        /* unsuse always 0 */\r
+        RTEST(pHalInfo->vmiData.dwFlags == 0 );\r
+\r
+        /* Check the res */\r
+        RTEST(pHalInfo->vmiData.dwDisplayWidth == devmode.dmPelsWidth );\r
+        RTEST(pHalInfo->vmiData.dwDisplayHeight == devmode.dmPelsHeight );\r
+\r
+        /*  This can never be test for it is who big the line is after it been align displayPitch */\r
+        RTEST(pHalInfo->vmiData.lDisplayPitch != 0);\r
+\r
+        RTEST(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT) );\r
+        ASSERT(pHalInfo->vmiData.ddpfDisplay.dwSize == sizeof(DDPIXELFORMAT));\r
+\r
+        /* We can not check if it DDPF_RGB flags been set for primary surface \r
+         * for it can be DDPF_PALETTEINDEXED1,DDPF_PALETTEINDEXED2,DDPF_PALETTEINDEXED4,DDPF_PALETTEINDEXED8, DDPF_PALETTEINDEXEDTO8, DDPF_RGB, DDPF_YUV\r
+         */\r
+        RTEST( (pHalInfo->vmiData.ddpfDisplay.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4 | \r
+                                                         DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8 | DDPF_RGB | DDPF_YUV)) != 0);\r
+\r
+\r
+        /* No fourcc are use on primary screen */\r
+        RTEST(pHalInfo->vmiData.ddpfDisplay.dwFourCC == 0 );\r
+\r
+        /* Count RGB Bits 8/16/24/32 */\r
+        RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount == devmode.dmBitsPerPel );\r
+\r
+        /* 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  \r
+         * But the mask can never be Zero \r
+         */\r
+        RTEST(pHalInfo->vmiData.ddpfDisplay.dwRBitMask  !=  0 );\r
+        RTEST(pHalInfo->vmiData.ddpfDisplay.dwGBitMask !=  0 );\r
+        RTEST(pHalInfo->vmiData.ddpfDisplay.dwBBitMask != 0 );\r
+\r
+        /* primary never set the alpha blend mask */\r
+        RTEST(pHalInfo->vmiData.ddpfDisplay.dwRGBAlphaBitMask ==  0 );\r
+\r
+        /* This can not be test at usermode it is each hardware drv that fill in it, \r
+         * only way to found them is to use this call  */\r
+        // pHalInfo->vmiData->dwOffscreenAlign\r
+        // pHalInfo->vmiData->dwOverlayAlign\r
+        // pHalInfo->vmiData->dwTextureAlign\r
+        // pHalInfo->vmiData->dwZBufferAlign\r
+        // pHalInfo->vmiData->dwAlphaAlign \r
+\r
+        /* the primary display address */\r
+        RTEST( ( (DWORD)pHalInfo->vmiData.pvPrimary & (~0x80000000)) != 0 );\r
+\r
+        /* test see if we got back the pvmList here \r
+         * acording msdn vmiData.dwNumHeaps and vmiData.pvmList\r
+         * exists for _VIDEOMEMORYINFO but they do not, it reviews \r
+         * in ddk and wdk and own testcase \r
+         */         \r
+         // RTEST(pHalInfo->vmiData.dwNumHeaps  != 0 );\r
+         // RTEST(pHalInfo->vmiData.pvmList  != 0 );\r
+\r
+        /* Test see if we got any hardware acclartions for 2d or 3d, this always fill in \r
+         * that mean we found a bugi drv and dx does not work on this drv \r
+         */\r
+\r
+        /* the SIS 760 GX will never fill it in, it is a bugi drv */\r
+        RTEST(pHalInfo->ddCaps.dwSize == sizeof(DDCORECAPS));\r
+\r
+        /* Testing see if we got any hw support for\r
+         * This test can fail on video card that does not support 2d/overlay/3d\r
+         */\r
+        RTEST( pHalInfo->ddCaps.dwCaps != 0);\r
+        RTEST( pHalInfo->ddCaps.ddsCaps.dwCaps != 0);\r
+\r
+        /* This flags is obsolete and should not be used by the driver */ \r
+        RTEST( pHalInfo->ddCaps.dwFXAlphaCaps == 0);\r
+        \r
+\r
+        /* basic dx 2 is found if this flags not set\r
+         * if this fail we do not have a dx driver install acodring ms, some version of windows it\r
+         * is okay this fail and drv does then only support basic dx\r
+         * \r
+         */\r
+        if (pHalInfo->dwFlags != 0)\r
+        {\r
+            RTEST( (pHalInfo->dwFlags & (DDHALINFO_GETDRIVERINFOSET | DDHALINFO_GETDRIVERINFO2)) != 0 );\r
+            RTEST( ( (DWORD)pHalInfo->GetDriverInfo & 0x80000000) != 0 );\r
+            ASSERT( ((DWORD)pHalInfo->GetDriverInfo & 0x80000000) != 0 );\r
+        }\r
+\r
+        /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/\r
+        \r
+\r
+       /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,\r
+        * 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 \r
+        * if it windows 2000 or windows xp/2003\r
+        *\r
+        * point to kmode direcly to the win32k.sys, win32k.sys is kmode and it is kmode address we getting back\r
+        */\r
+        RTEST( ( (DWORD)pHalInfo->lpD3DGlobalDriverData & (~0x80000000)) != 0 );\r
+        RTEST( ( (DWORD)pHalInfo->lpD3DHALCallbacks & (~0x80000000)) != 0 );\r
+        RTEST( ( (DWORD)pHalInfo->lpD3DHALCallbacks & (~0x80000000)) != 0 );\r
+    }\r
+\r
+    /* Backup DD_HALINFO so we do not need resting it */\r
+    RtlCopyMemory(&oldHalInfo, &HalInfo, sizeof(DD_HALINFO));\r
+\r
+    /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, NULL, ....  */\r
+    pHalInfo = &HalInfo;\r
+    pCallBackFlags = CallBackFlags;\r
+    RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
+\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags != NULL);\r
+    ASSERT(pCallBackFlags != NULL);\r
+\r
+    RTEST(puD3dCallbacks == NULL);\r
+    RTEST(puD3dDriverData == NULL);\r
+    RTEST(puD3dBufferCallbacks == NULL);\r
+    RTEST(puD3dTextureFormats == NULL);\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    /* We do not retesting DD_HALINFO, instead we compare it */\r
+    RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
+\r
+    /* Rember on some nivida drv the pCallBackFlags will not be set even they api exists in the drv\r
+     * known workaround is to check if the drv really return a kmode pointer for the drv functions \r
+     * we want to use.\r
+     */\r
+    RTEST(pCallBackFlags[0] != 0);\r
+    RTEST(pCallBackFlags[1] != 0);\r
+    RTEST(pCallBackFlags[2] == 0);\r
+\r
+    /* testing  NtGdiDdQueryDirectDrawObject( hDirectDrawLocal, pHalInfo, pCallBackFlags, D3dCallbacks, NULL, ....  */\r
+    pHalInfo = &HalInfo;\r
+    pCallBackFlags = CallBackFlags;\r
+    puD3dCallbacks = &D3dCallbacks;\r
+\r
+    RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
+    RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
+\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags != NULL);\r
+    ASSERT(pCallBackFlags != NULL);\r
+\r
+    /* rember puD3dCallbacks shall never return NULL */\r
+    RTEST(puD3dCallbacks != NULL);\r
+    ASSERT(puD3dCallbacks != NULL);\r
+\r
+    /* the pHalInfo->ddCaps.ddsCaps.dwCaps & DDSCAPS_3DDEVICE will be ignore, only way detect it proper follow code,\r
+     * 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 \r
+     * if it windows 2000 or windows xp/2003\r
+     */\r
+    RTEST(puD3dCallbacks->dwSize == sizeof(D3DNTHAL_CALLBACKS));\r
+\r
+    /* Nivda like GF7900GS will not follow ms design rule here, \r
+     * ContextDestroyAll must alwyas be NULL for it is not longer inuse in windows 2000 and higher\r
+     */\r
+    RTEST(puD3dCallbacks->ContextDestroyAll == NULL);\r
+\r
+    /* Nivda like GF7900GS will not follow ms design rule here, \r
+     * SceneCapture must alwyas be NULL for it is not longer inuse in windows 2000 and higher\r
+     */\r
+    RTEST(puD3dCallbacks->SceneCapture  == NULL);\r
+    RTEST(puD3dCallbacks->dwReserved10 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved11 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved22 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved23 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved == 0);\r
+    RTEST(puD3dCallbacks->TextureCreate  == NULL);\r
+    RTEST(puD3dCallbacks->TextureDestroy  == NULL);\r
+    RTEST(puD3dCallbacks->TextureSwap  == NULL);\r
+    RTEST(puD3dCallbacks->TextureGetSurf  == NULL);\r
+    RTEST(puD3dCallbacks->dwReserved12 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved13 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved14 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved15 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved16 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved17 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved18 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved19 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved20 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved21 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved24 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved0 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved1 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved2 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved3 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved4 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved5 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved6 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved7 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved8 == 0);\r
+    RTEST(puD3dCallbacks->dwReserved9 == 0);\r
+\r
+    /* how detect puD3dCallbacks->ContextCreate and puD3dCallbacks->ContextDestroy shall be set for bugi drv like nivda ? */\r
+    /* pointer direcly to the graphic drv, it is kmode pointer */\r
+    // RTEST( ( (DWORD)puD3dCallbacks->ContextCreate & (~0x80000000)) != 0 );\r
+    // RTEST( ( (DWORD)puD3dCallbacks->ContextDestroy & (~0x80000000)) != 0 );\r
+\r
+    RTEST(puD3dDriverData == NULL);\r
+    RTEST(puD3dBufferCallbacks == NULL);\r
+    RTEST(puD3dTextureFormats == NULL);\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    /* We do not retesting DD_HALINFO, instead we compare it */\r
+    RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
+    RTEST(pCallBackFlags[0] != 0);\r
+    RTEST(pCallBackFlags[1] != 0);\r
+    RTEST(pCallBackFlags[2] == 0);\r
+\r
+    /* Backup D3DNTHAL_CALLBACKS so we do not need resting it */\r
+    RtlCopyMemory(&oldD3dCallbacks, &D3dCallbacks, sizeof(D3DNTHAL_CALLBACKS));\r
+\r
+\r
+/* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, NULL, */\r
+    pHalInfo = &HalInfo;\r
+    pCallBackFlags = CallBackFlags;\r
+    puD3dCallbacks = &D3dCallbacks;\r
+    puD3dDriverData = &D3dDriverData;\r
+\r
+    RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
+    RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
+    RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
+\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags != NULL);\r
+    ASSERT(pCallBackFlags != NULL);\r
+\r
+    RTEST(puD3dCallbacks != NULL);\r
+    ASSERT(puD3dCallbacks != NULL);\r
+\r
+    RTEST(puD3dDriverData != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dBufferCallbacks == NULL);\r
+    RTEST(puD3dTextureFormats == NULL);\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    /* We retesting pCallBackFlags  */    \r
+    RTEST(pCallBackFlags[0] != 0);\r
+    RTEST(pCallBackFlags[1] != 0);\r
+    RTEST(pCallBackFlags[2] == 0);\r
+\r
+    /* We do not retesting instead we compare it */\r
+    RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
+    RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);\r
+\r
+    /* start test of puD3dDriverData */\r
+   \r
+    RTEST(puD3dDriverData->dwSize == sizeof(D3DNTHAL_GLOBALDRIVERDATA));\r
+    RTEST(puD3dDriverData->hwCaps.dwSize == sizeof(D3DNTHALDEVICEDESC_V1));\r
+    RTEST(puD3dDriverData->hwCaps.dtcTransformCaps.dwSize == sizeof(D3DTRANSFORMCAPS));\r
+    RTEST(puD3dDriverData->hwCaps.dlcLightingCaps.dwSize == sizeof(D3DLIGHTINGCAPS)); \r
+    RTEST(puD3dDriverData->hwCaps.dpcLineCaps.dwSize == sizeof(D3DPRIMCAPS));\r
+    RTEST(puD3dDriverData->hwCaps.dpcTriCaps.dwSize  == sizeof(D3DPRIMCAPS));\r
+    RTEST(puD3dDriverData->hwCaps.dwMaxBufferSize == 0);\r
+    RTEST(puD3dDriverData->hwCaps.dwMaxVertexCount == 0); \r
+\r
+    /* Backup D3DHAL_GLOBALDRIVERDATA so we do not need resting it */\r
+    RtlCopyMemory(&oldD3dDriverData, &D3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));\r
+\r
+/* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, NULL, */\r
+    pHalInfo = &HalInfo;\r
+    pCallBackFlags = CallBackFlags;\r
+    puD3dCallbacks = &D3dCallbacks;\r
+    puD3dDriverData = &D3dDriverData;\r
+    puD3dBufferCallbacks = &D3dBufferCallbacks;\r
+\r
+    RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
+    RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
+    RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
+    RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_CALLBACKS));\r
+\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+    RTEST(pHalInfo != NULL);\r
+    RTEST(pCallBackFlags != NULL);\r
+\r
+    if (pHalInfo->ddCaps.ddsCaps.dwCaps  & DDSCAPS_3DDEVICE )\r
+    {\r
+        RTEST(puD3dCallbacks != NULL);\r
+        RTEST(puD3dDriverData != NULL);\r
+        RTEST(puD3dBufferCallbacks != NULL);\r
+    }\r
+\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags != NULL);\r
+    ASSERT(pCallBackFlags != NULL);\r
+\r
+    RTEST(puD3dCallbacks != NULL);\r
+    ASSERT(puD3dCallbacks != NULL);\r
+\r
+    RTEST(puD3dDriverData != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dBufferCallbacks != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dTextureFormats == NULL);\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    /* We retesting the flags */    \r
+    RTEST(pCallBackFlags[0] != 0);\r
+    RTEST(pCallBackFlags[1] != 0);\r
+    RTEST(pCallBackFlags[2] == 0);\r
+\r
+    /* We do not retesting instead we compare it */\r
+    RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
+    RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);\r
+    RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);\r
+\r
+    /* start test of puD3dBufferCallbacks */\r
+    RTEST(puD3dBufferCallbacks->dwSize == sizeof(DD_D3DBUFCALLBACKS));\r
+    if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_CANCREATED3DBUF)\r
+    {\r
+        /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/\r
+        RTEST( ( (DWORD)puD3dBufferCallbacks->CanCreateD3DBuffer & (~0x80000000)) != 0 );\r
+    }\r
+    else\r
+    {\r
+        RTEST( puD3dBufferCallbacks->CanCreateD3DBuffer == NULL);\r
+    }\r
+\r
+    if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_CREATED3DBUF)\r
+    {\r
+        /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/\r
+        RTEST( ( (DWORD)puD3dBufferCallbacks->CreateD3DBuffer & (~0x80000000)) != 0 );\r
+    }\r
+    else\r
+    {\r
+        RTEST( puD3dBufferCallbacks->CreateD3DBuffer == NULL);\r
+    }\r
+\r
+    if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_DESTROYD3DBUF)\r
+    {\r
+        /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/\r
+        RTEST( ( (DWORD)puD3dBufferCallbacks->DestroyD3DBuffer & (~0x80000000)) != 0 );\r
+    }\r
+    else\r
+    {\r
+        RTEST( puD3dBufferCallbacks->DestroyD3DBuffer == NULL);\r
+    }\r
+\r
+    if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_LOCKD3DBUF)\r
+    {\r
+        /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/\r
+        RTEST( ( (DWORD)puD3dBufferCallbacks->LockD3DBuffer & (~0x80000000)) != 0 );\r
+    }\r
+    else\r
+    {\r
+        RTEST( puD3dBufferCallbacks->LockD3DBuffer == NULL);\r
+    }\r
+\r
+    if (puD3dBufferCallbacks->dwFlags & DDHAL_D3DBUFCB32_UNLOCKD3DBUF)\r
+    {\r
+        /* point to kmode direcly to the graphic drv, the drv is kmode and it is kmode address we getting back*/\r
+        RTEST( ( (DWORD)puD3dBufferCallbacks->UnlockD3DBuffer & (~0x80000000)) != 0 );\r
+    }\r
+    else\r
+    {\r
+        RTEST( puD3dBufferCallbacks->UnlockD3DBuffer == NULL);\r
+    }\r
+\r
+    /* Backup DD_D3DBUFCALLBACKS so we do not need resting it */\r
+    RtlCopyMemory(&oldD3dBufferCallbacks, &D3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS));\r
+\r
+\r
+/* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, NULL, */ \r
+    pHalInfo = &HalInfo;\r
+    pCallBackFlags = CallBackFlags;\r
+    puD3dCallbacks = &D3dCallbacks;\r
+    puD3dDriverData = &D3dDriverData;\r
+    puD3dBufferCallbacks = &D3dBufferCallbacks;\r
+\r
+    /* It is forbein to return a  DDSURFACEDESC2 it should always be DDSURFACEDESC\r
+        This is only for detected bad drivers that does not follow the rules, if they\r
+        does not follow tthe rules, not everthing being copy then in gdi32.dll\r
+        gdi32.dll always assume it is DDSURFACEDESC size\r
+    */\r
+    if (puD3dDriverData->dwNumTextureFormats != 0)\r
+    {\r
+        puD3dTextureFormats = malloc (puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));\r
+    }\r
+\r
+    RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
+    RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
+    RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
+    RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));\r
+    RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));\r
+\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags != NULL);\r
+    ASSERT(pCallBackFlags != NULL);\r
+\r
+    RTEST(puD3dCallbacks != NULL);\r
+    ASSERT(puD3dCallbacks != NULL);\r
+\r
+    RTEST(puD3dDriverData != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dBufferCallbacks != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dTextureFormats != NULL);\r
+    ASSERT(puD3dTextureFormats != NULL);\r
+    \r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    RTEST(puNumHeaps == NULL);\r
+    RTEST(puvmList == NULL);\r
+\r
+    /* We retesting the flags */    \r
+    RTEST(pCallBackFlags[0] != 0);\r
+    RTEST(pCallBackFlags[1] != 0);\r
+    RTEST(pCallBackFlags[2] == 0);\r
+\r
+    /* We do not retesting instead we compare it */\r
+    RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
+    RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);\r
+    RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);\r
+    RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);\r
+\r
+    /* start test of dwNumTextureFormats */        \r
+    if (puD3dDriverData->dwNumTextureFormats != 0)\r
+    {\r
+        myDesc = puD3dTextureFormats;\r
+        for (dwTextureCounter=0;dwTextureCounter<puD3dDriverData->dwNumTextureFormats;dwTextureCounter++)\r
+        {\r
+            RTEST(myDesc->dwSize == sizeof(DDSURFACEDESC))\r
+            ASSERT(myDesc->dwSize == sizeof(DDSURFACEDESC));\r
+\r
+            RTEST( (myDesc->dwFlags & (~(DDSD_CAPS|DDSD_PIXELFORMAT))) == 0);\r
+            RTEST(myDesc->dwHeight == 0);\r
+            RTEST(myDesc->dwWidth == 0);\r
+            RTEST(myDesc->dwLinearSize == 0);\r
+            RTEST(myDesc->dwBackBufferCount == 0);\r
+            RTEST(myDesc->dwZBufferBitDepth == 0);\r
+            RTEST(myDesc->dwAlphaBitDepth == 0);\r
+            RTEST(myDesc->dwReserved == 0);\r
+            RTEST(myDesc->lpSurface == 0);\r
+            RTEST(myDesc->ddckCKDestOverlay.dwColorSpaceLowValue == 0);\r
+            RTEST(myDesc->ddckCKDestOverlay.dwColorSpaceHighValue == 0);\r
+            RTEST(myDesc->ddckCKDestBlt.dwColorSpaceLowValue == 0);\r
+            RTEST(myDesc->ddckCKDestBlt.dwColorSpaceHighValue == 0);\r
+            RTEST(myDesc->ddckCKSrcOverlay.dwColorSpaceLowValue == 0);\r
+            RTEST(myDesc->ddckCKSrcOverlay.dwColorSpaceHighValue == 0);\r
+            RTEST(myDesc->ddckCKSrcBlt.dwColorSpaceLowValue == 0);\r
+            RTEST(myDesc->ddckCKSrcBlt.dwColorSpaceHighValue == 0);            \r
+            RTEST(myDesc->ddpfPixelFormat.dwSize == sizeof(DDPIXELFORMAT));\r
+            RTEST(myDesc->ddpfPixelFormat.dwFlags != 0);\r
+            if (myDesc->ddpfPixelFormat.dwFlags & DDPF_FOURCC)\r
+            {\r
+                RTEST(myDesc->ddpfPixelFormat.dwFourCC != 0);\r
+            }\r
+            RTEST(myDesc->ddsCaps.dwCaps == DDSCAPS_TEXTURE);\r
+\r
+            myDesc = (DDSURFACEDESC *) (((DWORD) myDesc) + sizeof(DDSURFACEDESC));\r
+        }\r
+    }\r
+     \r
+\r
+    /* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, NULL, */ \r
+    pHalInfo = &HalInfo;\r
+    pCallBackFlags = CallBackFlags;\r
+    puD3dCallbacks = &D3dCallbacks;\r
+    puD3dDriverData = &D3dDriverData;\r
+    puD3dBufferCallbacks = &D3dBufferCallbacks;\r
+    puNumHeaps = &NumHeaps;\r
+    \r
+    if (puD3dDriverData->dwNumTextureFormats != 0)\r
+    {\r
+        RtlZeroMemory(puD3dTextureFormats, puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));\r
+    }    \r
+    RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
+    RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
+    RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
+    RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));\r
+    RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));\r
+\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags != NULL);\r
+    ASSERT(pCallBackFlags != NULL);\r
+\r
+    RTEST(puD3dCallbacks != NULL);\r
+    ASSERT(puD3dCallbacks != NULL);\r
+\r
+    RTEST(puD3dDriverData != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dBufferCallbacks != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dTextureFormats != NULL);\r
+    ASSERT(puD3dTextureFormats != NULL);\r
+    \r
+    RTEST(puNumHeaps != NULL);\r
+    ASSERT(puNumHeaps != NULL);\r
+    RTEST(NumHeaps == 0);\r
+\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    \r
+    RTEST(puvmList == NULL);\r
+\r
+    /* We retesting the flags */    \r
+    RTEST(pCallBackFlags[0] != 0);\r
+    RTEST(pCallBackFlags[1] != 0);\r
+    RTEST(pCallBackFlags[2] == 0);\r
+\r
+    /* We do not retesting instead we compare it */\r
+    RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
+    RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);\r
+    RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);\r
+    RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);\r
+    /* we skip resting texture */\r
+\r
+\r
+    /* testing  NtGdiDdQueryDirectDrawObject( hDD, pHalInfo, pCallBackFlags, puD3dCallbacks, puD3dDriverData, puD3dBufferCallbacks, puD3dTextureFormats, puNumHeaps, puvmList, NULL, */ \r
+    pHalInfo = &HalInfo;\r
+    pCallBackFlags = CallBackFlags;\r
+    puD3dCallbacks = &D3dCallbacks;\r
+    puD3dDriverData = &D3dDriverData;\r
+    puD3dBufferCallbacks = &D3dBufferCallbacks;\r
+    puNumHeaps = &NumHeaps;\r
+    puvmList = &vmList;\r
+    \r
+    if (puD3dDriverData->dwNumTextureFormats != 0)\r
+    {\r
+        RtlZeroMemory(puD3dTextureFormats, puD3dDriverData->dwNumTextureFormats * sizeof(DDSURFACEDESC2));\r
+    }    \r
+    RtlZeroMemory(pHalInfo,sizeof(DD_HALINFO));\r
+    RtlZeroMemory(pCallBackFlags,sizeof(DWORD)*3);\r
+    RtlZeroMemory(puD3dCallbacks,sizeof(D3DNTHAL_CALLBACKS));\r
+    RtlZeroMemory(puD3dDriverData,sizeof(D3DNTHAL_GLOBALDRIVERDATA));\r
+    RtlZeroMemory(&D3dBufferCallbacks,sizeof(DD_D3DBUFCALLBACKS));\r
+\r
+    RTEST(NtGdiDdQueryDirectDrawObject( hDirectDraw, pHalInfo,\r
+                                        pCallBackFlags, puD3dCallbacks,\r
+                                        puD3dDriverData, puD3dBufferCallbacks,\r
+                                        puD3dTextureFormats, puNumHeaps,\r
+                                        puvmList, puNumFourCC,\r
+                                        puFourCC)== FALSE);\r
+\r
+    RTEST(pHalInfo != NULL);\r
+    ASSERT(pHalInfo != NULL);\r
+\r
+    RTEST(pCallBackFlags != NULL);\r
+    ASSERT(pCallBackFlags != NULL);\r
+\r
+    RTEST(puD3dCallbacks != NULL);\r
+    ASSERT(puD3dCallbacks != NULL);\r
+\r
+    RTEST(puD3dDriverData != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dBufferCallbacks != NULL);\r
+    ASSERT(puD3dDriverData != NULL);\r
+\r
+    RTEST(puD3dTextureFormats != NULL);\r
+    ASSERT(puD3dTextureFormats != NULL);\r
+    \r
+    RTEST(puNumHeaps != NULL);\r
+    ASSERT(puNumHeaps != NULL);\r
+    RTEST(NumHeaps == 0);\r
+\r
+    RTEST(puvmList != NULL);    \r
+\r
+    RTEST(puNumFourCC == NULL);\r
+    RTEST(puFourCC == NULL);\r
+    \r
+    \r
+\r
+    /* We retesting the flags */    \r
+    RTEST(pCallBackFlags[0] != 0);\r
+    RTEST(pCallBackFlags[1] != 0);\r
+    RTEST(pCallBackFlags[2] == 0);\r
+\r
+    /* We do not retesting instead we compare it */\r
+    RTEST(memcmp(&oldHalInfo, pHalInfo, sizeof(DD_HALINFO)) == 0);\r
+    RTEST(memcmp(&oldD3dCallbacks, puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)) == 0);\r
+    RTEST(memcmp(&oldD3dDriverData, puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)) == 0);\r
+    RTEST(memcmp(&oldD3dBufferCallbacks, puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)) == 0);\r
+    /* we skip resting texture */\r
+\r
+    /* Todo\r
+    * adding test for   \r
+    * puNumFourCC\r
+    * puFourCC\r
+    */\r
+\r
+    /* Cleanup ReactX setup */\r
+    DeleteDC(hdc);\r
+    Syscall(L"NtGdiDdDeleteDirectDrawObject", 1, &hDirectDraw);\r
+\r
+    return APISTATUS_NORMAL;\r
 }\r