[ros-diffs] [greatlrd] 26278: tested NtGdiDdGetScanLine not suppored by vmware drv did use another 3d party driver for the test. fixed some werid loop of pseh, all code are tested in 0.3.1 for I do not have a working vmware drv for the driver. NtGdiDdGetScanLine is working same as windows 2000 now.

greatlrd at svn.reactos.org greatlrd at svn.reactos.org
Sat Apr 7 17:10:01 CEST 2007


Author: greatlrd
Date: Sat Apr  7 19:10:01 2007
New Revision: 26278

URL: http://svn.reactos.org/svn/reactos?rev=26278&view=rev
Log:
tested NtGdiDdGetScanLine not suppored by vmware drv did use another 3d party driver for the test.
fixed some werid loop of pseh, all code are tested in 0.3.1 for I do not have a working vmware drv 
for the driver. NtGdiDdGetScanLine is working same as windows 2000 now. 


Modified:
    trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c
    trunk/reactos/subsystems/win32/win32k/ntddraw/ddraw.c

Modified: trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c?rev=26278&r1=26277&r2=26278&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c (original)
+++ trunk/reactos/subsystems/win32/win32k/ntddraw/dd.c Sat Apr  7 19:10:01 2007
@@ -453,8 +453,6 @@
     {
             ProbeForRead(puCanCreateSurfaceData,  sizeof(DD_CANCREATESURFACEDATA), 1);
             RtlCopyMemory(&CanCreateSurfaceData,puCanCreateSurfaceData, sizeof(DD_CANCREATESURFACEDATA));
-
-            /* FIXME can be version 2 of DDSURFACEDESC */
             ProbeForRead(puCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC), 1);
             RtlCopyMemory(&desc,puCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC));
     }
@@ -481,7 +479,6 @@
                      ProbeForWrite(puCanCreateSurfaceData, sizeof(DD_CANCREATESURFACEDATA), 1);
                      puCanCreateSurfaceData->ddRVal = CanCreateSurfaceData.ddRVal;
 
-                     /* FIXME can be version 2 of DDSURFACEDESC */
                      ProbeForWrite(puCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC), 1);
                      RtlCopyMemory(puCanCreateSurfaceData->lpDDSurfaceDesc,&desc, sizeof(DDSURFACEDESC));
 
@@ -501,53 +498,55 @@
 
 /************************************************************************/
 /* GetScanLine                                                          */
-/* status : not implement, was undoc in msdn now it is doc              */
+/* status : is now documented in MSDN and I checked the code it works   */
+/*          like windows 2000                                           */
 /************************************************************************/
 DWORD STDCALL 
 NtGdiDdGetScanLine( HANDLE hDirectDrawLocal, PDD_GETSCANLINEDATA puGetScanLineData)
 {
     DWORD  ddRVal = DDHAL_DRIVER_NOTHANDLED;
     DD_GETSCANLINEDATA GetScanLineData;
-    PDD_DIRECTDRAW pDirectDraw;
+    PDD_DIRECTDRAW pDirectDraw = NULL;
     NTSTATUS Status = FALSE;
-
-    DPRINT1("NtGdiDdGetScanLine\n");
-
-    _SEH_TRY
-    {
-            ProbeForRead(puGetScanLineData,  sizeof(DD_GETSCANLINEDATA), 1);
-            RtlCopyMemory(&GetScanLineData,puGetScanLineData, sizeof(DD_GETSCANLINEDATA));
-    }
-    _SEH_HANDLE
-    {
-        Status = _SEH_GetExceptionCode();
-    }
-    _SEH_END;
-    if(NT_SUCCESS(Status))
+    LPDDHAL_GETSCANLINEDATA ourpuGetScanLineData;
+
+    if (hDirectDrawLocal)
     {
         pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);;
-        if (pDirectDraw != NULL)
-        {
-            if (pDirectDraw->DD.dwFlags & DDHAL_CB32_GETSCANLINE)
-            {
-                GetScanLineData.ddRVal = DDERR_GENERIC;
-                GetScanLineData.lpDD = &pDirectDraw->Global;
-                ddRVal = pDirectDraw->DD.GetScanLine(&GetScanLineData);
-
-                _SEH_TRY
-                {
-                    ProbeForWrite(puGetScanLineData,  sizeof(DD_GETSCANLINEDATA), 1);
-                    puGetScanLineData->dwScanLine = GetScanLineData.dwScanLine;
-                    puGetScanLineData->ddRVal     = GetScanLineData.ddRVal;
-                }
-                _SEH_HANDLE
-                {
-                    Status = _SEH_GetExceptionCode();
-                }
-                _SEH_END;
-            }
-            GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
-        }
+    }
+
+    if (pDirectDraw != NULL)
+    {
+        DPRINT1("GetScanLine\n");
+        if (pDirectDraw->DD.dwFlags & DDHAL_CB32_GETSCANLINE)
+        {
+            RtlZeroMemory(&GetScanLineData,sizeof(DD_GETSCANLINEDATA));
+            GetScanLineData.ddRVal = DDERR_GENERIC;
+            GetScanLineData.lpDD = &pDirectDraw->Global;
+            ddRVal = pDirectDraw->DD.GetScanLine(&GetScanLineData);
+
+            DPRINT1("GetScanLine\n");
+            _SEH_TRY
+            {
+                ProbeForWrite(puGetScanLineData,  sizeof(DD_GETSCANLINEDATA), 1);
+                ourpuGetScanLineData = (LPDDHAL_GETSCANLINEDATA)puGetScanLineData;
+                ourpuGetScanLineData->dwScanLine = GetScanLineData.dwScanLine;
+                ourpuGetScanLineData->ddRVal     = GetScanLineData.ddRVal;
+            }
+            _SEH_HANDLE
+            {
+                Status = _SEH_GetExceptionCode();
+            }
+            _SEH_END;
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("GetScanLine\n");
+                ddRVal = DDHAL_DRIVER_NOTHANDLED;
+            }
+        }
+
+        GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
     }
 
   return ddRVal;

Modified: trunk/reactos/subsystems/win32/win32k/ntddraw/ddraw.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntddraw/ddraw.c?rev=26278&r1=26277&r2=26278&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntddraw/ddraw.c (original)
+++ trunk/reactos/subsystems/win32/win32k/ntddraw/ddraw.c Sat Apr  7 19:10:01 2007
@@ -365,21 +365,74 @@
     /*
      * Get puD3dCallbacks
      */
-    if (puD3dCallbacks != NULL)
-    {
-        if (pDirectDraw->Hal.lpD3DHALCallbacks != NULL)
-        {
+    if ((puD3dCallbacks) && 
+        (pDirectDraw->Hal.lpD3DHALCallbacks))
+    {
+        _SEH_TRY
+        {
+            ProbeForWrite(puD3dCallbacks,  sizeof(D3DNTHAL_CALLBACKS), 1);
+            RtlCopyMemory( puD3dCallbacks, pDirectDraw->Hal.lpD3DHALCallbacks, sizeof( D3DNTHAL_CALLBACKS ) );
+        }
+        _SEH_HANDLE
+        {
+            Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
+        if(!NT_SUCCESS(Status))
+        {
+            SetLastNtError(Status);
+            GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+            return FALSE;
+        }
+    }
+    else
+    {
+        GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+        return FALSE;
+    }
+
+    /*
+     * Get lpD3DGlobalDriverData
+     */
+    if ((puD3dDriverData) && 
+        (pDirectDraw->Hal.lpD3DGlobalDriverData != NULL))
+    {
+        /* Get D3dDriverData */
+        _SEH_TRY
+        {
+            ProbeForWrite(puD3dDriverData,  sizeof(D3DNTHAL_GLOBALDRIVERDATA), 1);
+            RtlCopyMemory( puD3dDriverData, pDirectDraw->Hal.lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
+        }
+        _SEH_HANDLE
+        {
+            Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
+        if(!NT_SUCCESS(Status))
+        {
+            SetLastNtError(Status);
+            GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+            return FALSE;
+        }
+
+        /* Get TextureFormats */
+        pD3dDriverData =pDirectDraw->Hal.lpD3DGlobalDriverData;
+        if ((puD3dTextureFormats) && 
+            (pD3dDriverData->dwNumTextureFormats>0) && 
+            (pD3dDriverData->lpTextureFormats))
+        {
+            DWORD Size = sizeof(DDSURFACEDESC) * pD3dDriverData->dwNumTextureFormats;
             _SEH_TRY
             {
-                ProbeForWrite(puD3dCallbacks,  sizeof(D3DNTHAL_CALLBACKS), 1);
-                RtlCopyMemory( puD3dCallbacks, pDirectDraw->Hal.lpD3DHALCallbacks,
-                               sizeof( D3DNTHAL_CALLBACKS ) );
+                ProbeForWrite(puD3dTextureFormats, Size, 1);
+                RtlCopyMemory( puD3dTextureFormats, pD3dDriverData->lpTextureFormats, Size);
             }
             _SEH_HANDLE
             {
                 Status = _SEH_GetExceptionCode();
             }
             _SEH_END;
+
             if(!NT_SUCCESS(Status))
             {
                 SetLastNtError(Status);
@@ -394,43 +447,25 @@
         return FALSE;
     }
 
-    /*
-     * Get lpD3DGlobalDriverData
-     */
-    if (puD3dDriverData != NULL)
-    {
-        if (pDirectDraw->Hal.lpD3DGlobalDriverData != NULL)
-        {
-            _SEH_TRY
-            {
-                /* Get puD3dDriverData */
-                ProbeForWrite(puD3dDriverData,  sizeof(D3DNTHAL_GLOBALDRIVERDATA), 1);
-                RtlCopyMemory( puD3dDriverData, pDirectDraw->Hal.lpD3DGlobalDriverData,
-                               sizeof(D3DNTHAL_GLOBALDRIVERDATA));
-
-                /* Get puD3dTextureFormats */
-                pD3dDriverData =pDirectDraw->Hal.lpD3DGlobalDriverData;
-                if (puD3dTextureFormats != NULL)
-                {
-                    if ((pD3dDriverData->dwNumTextureFormats) && (pD3dDriverData->lpTextureFormats))
-                    {
-                        DWORD Size =sizeof(DDSURFACEDESC) * pD3dDriverData->dwNumTextureFormats;
-                        ProbeForWrite(puD3dTextureFormats, Size, 1);
-                        RtlCopyMemory( puD3dTextureFormats, pD3dDriverData->lpTextureFormats, Size);
-                    }
-                }
-            }
-            _SEH_HANDLE
-            {
-                Status = _SEH_GetExceptionCode();
-            }
-            _SEH_END;
-            if(!NT_SUCCESS(Status))
-            {
-                SetLastNtError(Status);
-                GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
-                return FALSE;
-            }
+    /*Get D3dBufferCallbacks */
+    if ( (puD3dBufferCallbacks) && 
+         (pDirectDraw->Hal.lpD3DBufCallbacks))
+    {
+        _SEH_TRY
+        {
+            ProbeForWrite(puD3dBufferCallbacks,  sizeof(DD_D3DBUFCALLBACKS), 1);
+            RtlCopyMemory( puD3dBufferCallbacks, pDirectDraw->Hal.lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
+        }
+        _SEH_HANDLE
+        {
+            Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
+        if(!NT_SUCCESS(Status))
+        {
+            SetLastNtError(Status);
+            GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+            return FALSE;
         }
     }
     else
@@ -439,53 +474,17 @@
         return FALSE;
     }
 
-    /*
-     * Get puD3dBufferCallbacks
-     */
-    if (puD3dBufferCallbacks != NULL)
-    {
-        if (pDirectDraw->Hal.lpD3DBufCallbacks != NULL)
-        {
-            _SEH_TRY
-            {
-                ProbeForWrite(puD3dBufferCallbacks,  sizeof(DD_D3DBUFCALLBACKS), 1);
-                RtlCopyMemory( puD3dBufferCallbacks, pDirectDraw->Hal.lpD3DBufCallbacks,
-                               sizeof(DD_D3DBUFCALLBACKS));
-            }
-            _SEH_HANDLE
-            {
-                Status = _SEH_GetExceptionCode();
-            }
-            _SEH_END;
-            if(!NT_SUCCESS(Status))
-            {
-                SetLastNtError(Status);
-                GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
-                return FALSE;
-            }
-        }
-    }
-    else
-    {
-        GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
-        return FALSE;
-    }
-
+    /* Get puNumFourCC and dwNumFourCC */
     _SEH_TRY
     {
-        /* Waring :
-         * In Windows 2000 puvmList and puNumHeaps does not export from 
-         * NtGdiDdQueryDirectDrawObject, I did remove the puvmList code 
-         * I wrote. See MSDN and my private note about this matter, 
-         * the private note will be in  my book as well when it comes.
-         */
         ProbeForWrite(puNumFourCC, sizeof(DWORD), 1);
         *puNumFourCC = pDirectDraw->dwNumFourCC;
 
-        if ((pDirectDraw->pdwFourCC != NULL) && (puFourCC != NULL))
+        if ((pDirectDraw->pdwFourCC) && 
+            (puFourCC))
         {
             ProbeForWrite(puFourCC, sizeof(DWORD) * pDirectDraw->dwNumFourCC, 1);
-            RtlCopyMemory( puFourCC,  pDirectDraw->pdwFourCC, sizeof(DWORD) *  pDirectDraw->dwNumFourCC);
+            RtlCopyMemory( puFourCC, pDirectDraw->pdwFourCC, sizeof(DWORD) * pDirectDraw->dwNumFourCC);
         }
     }
     _SEH_HANDLE
@@ -511,6 +510,11 @@
 NtGdiDdDeleteDirectDrawObject( HANDLE hDirectDrawLocal)
 {
     DPRINT1("NtGdiDdDeleteDirectDrawObject\n");
+    if (hDirectDrawLocal == NULL)
+    {
+        return FALSE;
+    }
+
     return GDIOBJ_FreeObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
 }
 




More information about the Ros-diffs mailing list