Fix DD_Cleanup that will make Contry Strike not crashing when it does not found right...
authorMagnus Olsen <magnus@greatlord.com>
Sun, 9 Oct 2005 22:15:06 +0000 (22:15 +0000)
committerMagnus Olsen <magnus@greatlord.com>
Sun, 9 Oct 2005 22:15:06 +0000 (22:15 +0000)
svn path=/trunk/; revision=18387

reactos/subsys/win32k/include/intddraw.h
reactos/subsys/win32k/ntddraw/ddraw.c

index e26f5f7..beb5e8f 100644 (file)
@@ -9,6 +9,7 @@
 #define GDI_OBJECT_TYPE_DD_MOTIONCOMP 0x00650000
 
 
+
 typedef struct
 {
        DD_SURFACE_LOCAL Local;
@@ -25,8 +26,7 @@ typedef struct
        DD_DIRECTDRAW_GLOBAL Global;
        // Drv callbacks                
        PGD_GETDIRECTDRAWINFO            DrvGetDirectDrawInfo;  
-       PGD_DISABLEDIRECTDRAW            DrvDisableDirectDraw;
-       PDD_GETDRIVERINFO                DdGetDriverInfo; 
+       PGD_DISABLEDIRECTDRAW            DrvDisableDirectDraw;  
 
        // DD callbacks
        DD_CALLBACKS                     DD;
@@ -36,14 +36,29 @@ typedef struct
 
        // Palette callbacks
        DD_PALETTECALLBACKS              Pal;
-       
+
+       // HAL 
+       DD_HALINFO                       Hal;
+
        // Color Control Callback 
-       PDD_COLORCB_COLORCONTROL         DdControlColor; 
+       DD_COLORCONTROLCALLBACKS         Color;
+
+       // D3DHAL_CALLBACKS
+       //D3DHAL_CALLBACKS                 D3dHal;
+       //D3DHAL_CALLBACKS3                D3dHal3;
+       //D3DHAL_D3DEXTENDEDCAPS           D3dHal3Ext;
+
+       // Heap Callback
+       //DD_GETHEAPALIGNMENTDATA          HeapData;
+       
+       // Kernel Callback
+       //DD_KERNELCALLBACKS               Kernel;
+    //DDKERNELCAPS                     KernelCaps;
+
        // Miscellaneous Callback
-       PDD_GETAVAILDRIVERMEMORY         DdGetAvailDriverMemory;
-    // Kernel Callback 
-       PDD_KERNELCB_SYNCSURFACE         DdSyncSurfaceData; 
-       PDD_KERNELCB_SYNCVIDEOPORT       DdSyncVideoPortData;
+       DD_MISCELLANEOUSCALLBACKS        Misc;
+
+    
        // NT-based Callback 
        PDD_FLIPTOGDISURFACE             DdFlipToGDISurface; 
        PDD_FREEDRIVERMEMORY             DdFreeDriverMemory; 
@@ -77,17 +92,8 @@ typedef struct
     PDD_VPORTCB_WAITFORSYNC          DdVideoPortWaitForSync;
     // Notify Callback 
     //LPDD_NOTIFYCALLBACK NotifyCallback
+       
 
-
-       // D3D Device context callbacks
-       PD3DNTHAL_CONTEXTCREATECB       D3dContextCreate;
-       PD3DNTHAL_CONTEXTDESTROYCB      D3dContextDestroy;
-       // D3D Buffer callbacks
-       PDD_CANCREATESURFACE            DdCanCreateD3DBuffer;
-       PDD_CREATESURFACE               DdCreateD3DBuffer;
-       PDD_SURFCB_DESTROYSURFACE       DdDestroyD3DBuffer;
-       PDD_SURFCB_LOCK                 DdLockD3DBuffer;
-       PDD_SURFCB_UNLOCK               DdUnlockD3DBuffer;
        
        
                   
index a238a25..702f182 100644 (file)
 BOOL INTERNAL_CALL
 DD_Cleanup(PVOID ObjectBody)
 {
-       PDD_DIRECTDRAW pDD = (PDD_DIRECTDRAW)ObjectBody;
-       pDD->DrvDisableDirectDraw(pDD->Global.dhpdev);
+       PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(ObjectBody, GDI_OBJECT_TYPE_DIRECTDRAW);
+       if (!pDirectDraw)
+               return FALSE;
+
+       pDirectDraw->DrvDisableDirectDraw(pDirectDraw->Global.dhpdev);
+
+       GDIOBJ_UnlockObjByPtr(pDirectDraw);
        return TRUE;
 }
 
@@ -33,13 +38,14 @@ HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
        DD_SURFACECALLBACKS surface_callbacks;
        DD_PALETTECALLBACKS palette_callbacks;
 
-       RtlZeroMemory(&callbacks, sizeof(callbacks));
-       callbacks.dwSize = sizeof(callbacks);
-       RtlZeroMemory(&surface_callbacks, sizeof(surface_callbacks));
-       surface_callbacks.dwSize = sizeof(surface_callbacks);
-       RtlZeroMemory(&palette_callbacks, sizeof(palette_callbacks));
-       palette_callbacks.dwSize = sizeof(palette_callbacks);
+       RtlZeroMemory(&callbacks, sizeof(DD_CALLBACKS));
+       callbacks.dwSize = sizeof(DD_CALLBACKS);
+       RtlZeroMemory(&surface_callbacks, sizeof(DD_SURFACECALLBACKS));
+       surface_callbacks.dwSize = sizeof(DD_SURFACECALLBACKS);
+       RtlZeroMemory(&palette_callbacks, sizeof(DD_PALETTECALLBACKS));
+       palette_callbacks.dwSize = sizeof(DD_PALETTECALLBACKS);
 
+       
        DC *pDC = DC_LockDc(hdc);
        if (!pDC)
                return NULL;
@@ -83,68 +89,16 @@ HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
 
        pDirectDraw->DrvGetDirectDrawInfo = pDC->DriverFunctions.GetDirectDrawInfo;
        pDirectDraw->DrvDisableDirectDraw = pDC->DriverFunctions.DisableDirectDraw;
+
+    /* DD_CALLBACKS setup */   
+       RtlMoveMemory(&pDirectDraw->DD, &callbacks, sizeof(DD_CALLBACKS));
        
-    /* DD_CALLBACKS setup */
-    pDirectDraw->DD.dwFlags = callbacks.dwFlags;
-       
-       /* DestroyDriver Unsuse in win2k or higher                         */            
-       if (callbacks.dwFlags & DDHAL_CB32_DESTROYDRIVER)
-           pDirectDraw->DD.DestroyDriver = callbacks.DestroyDriver;
-       if (callbacks.dwFlags & DDHAL_CB32_CREATESURFACE)
-               pDirectDraw->DD.CreateSurface = callbacks.CreateSurface;
-       if (callbacks.dwFlags & DDHAL_CB32_SETCOLORKEY)
-               pDirectDraw->DD.SetColorKey = callbacks.SetColorKey;
-       if (callbacks.dwFlags & DDHAL_CB32_SETMODE)
-               pDirectDraw->DD.SetMode = callbacks.SetMode;
-       if (callbacks.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK)
-               pDirectDraw->DD.WaitForVerticalBlank = callbacks.WaitForVerticalBlank;
-       if (callbacks.dwFlags & DDHAL_CB32_CANCREATESURFACE)
-               pDirectDraw->DD.CanCreateSurface = callbacks.CanCreateSurface;
-       if (callbacks.dwFlags & DDHAL_CB32_CREATEPALETTE)
-               pDirectDraw->DD.CreatePalette = callbacks.CreatePalette;
-       if (callbacks.dwFlags & DDHAL_CB32_GETSCANLINE)
-               pDirectDraw->DD.GetScanLine = callbacks.GetScanLine;
-       if (callbacks.dwFlags & DDHAL_CB32_MAPMEMORY)
-               pDirectDraw->DD.MapMemory = callbacks.MapMemory;
-
-       /* Surface Callbacks */
-    pDirectDraw->Surf.dwFlags = surface_callbacks.dwFlags;
-       
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE)
-               pDirectDraw->Surf.DestroySurface = surface_callbacks.DestroySurface;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_FLIP)
-               pDirectDraw->Surf.Flip = surface_callbacks.Flip;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETCLIPLIST)
-               pDirectDraw->Surf.SetClipList = surface_callbacks.SetClipList;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_LOCK)
-               pDirectDraw->Surf.Lock = surface_callbacks.Lock;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_UNLOCK)
-               pDirectDraw->Surf.Unlock = surface_callbacks.Unlock;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_BLT)
-               pDirectDraw->Surf.Blt = surface_callbacks.Blt;
-       /* DD Callbacks SetColorKey is same as Surface callback SetColorKey */
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETCOLORKEY)
-               pDirectDraw->Surf.SetColorKey = surface_callbacks.SetColorKey;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE)
-               pDirectDraw->Surf.AddAttachedSurface = surface_callbacks.AddAttachedSurface;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS)
-               pDirectDraw->Surf.GetBltStatus = surface_callbacks.GetBltStatus;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS)
-               pDirectDraw->Surf.GetFlipStatus = surface_callbacks.GetFlipStatus;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY)
-               pDirectDraw->Surf.UpdateOverlay = surface_callbacks.UpdateOverlay;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION)
-               pDirectDraw->Surf.SetOverlayPosition = surface_callbacks.SetOverlayPosition;
-       if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETPALETTE)
-               pDirectDraw->Surf.SetPalette = surface_callbacks.SetPalette;
-       
-    /* Palette Callbacks */
-    pDirectDraw->Pal.dwFlags = palette_callbacks.dwFlags;
-       if (palette_callbacks.dwFlags & DDHAL_PALCB32_DESTROYPALETTE)
-               pDirectDraw->Pal.DestroyPalette = palette_callbacks.DestroyPalette;
-       if (palette_callbacks.dwFlags & DDHAL_PALCB32_SETENTRIES)
-               pDirectDraw->Pal.SetEntries = palette_callbacks.SetEntries;
+       /* DD_SURFACECALLBACKS  setup*/ 
+       RtlMoveMemory(&pDirectDraw->Surf, &surface_callbacks, sizeof(DD_SURFACECALLBACKS));
 
+       /* DD_PALETTECALLBACKS setup*/  
+       RtlMoveMemory(&pDirectDraw->Pal, &surface_callbacks, sizeof(DD_PALETTECALLBACKS));
+       
        GDIOBJ_UnlockObjByPtr(pDirectDraw);
        DC_UnlockDc(pDC);
 
@@ -190,34 +144,52 @@ BOOL STDCALL NtGdiDdQueryDirectDrawObject(
                return FALSE;
        }
 
-       if (pHalInfo->lpD3DHALCallbacks)
+       if (pHalInfo)
        {
-               RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));
-               pDirectDraw->D3dContextCreate = puD3dCallbacks->ContextCreate;
-               pDirectDraw->D3dContextDestroy = puD3dCallbacks->ContextDestroy;
-       }
+       RtlMoveMemory(&pDirectDraw->Hal, pHalInfo, sizeof(DD_HALINFO));
+
+          if (pHalInfo->lpD3DHALCallbacks)
+          {
+                RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));                
+          }
+
+          if (pHalInfo->lpD3DGlobalDriverData)
+          {
+                RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
+          }
+          if (pHalInfo->lpD3DBufCallbacks)
+          {
+                RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
+          }
+                       
+        }
+        
+       GDIOBJ_UnlockObjByPtr(pDirectDraw);
 
-       if (pHalInfo->lpD3DGlobalDriverData)
-       {
-               RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
-       }
+       return TRUE;
+}
 
-       if (pHalInfo->lpD3DBufCallbacks)
-       {
-               RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
-               pDirectDraw->DdCanCreateD3DBuffer = puD3dBufferCallbacks->CanCreateD3DBuffer;
-               pDirectDraw->DdCreateD3DBuffer = puD3dBufferCallbacks->CreateD3DBuffer;
-               pDirectDraw->DdDestroyD3DBuffer = puD3dBufferCallbacks->DestroyD3DBuffer;
-               pDirectDraw->DdLockD3DBuffer = puD3dBufferCallbacks->LockD3DBuffer;
-               pDirectDraw->DdUnlockD3DBuffer = puD3dBufferCallbacks->UnlockD3DBuffer;
-       }
 
+DWORD STDCALL NtGdiDdGetDriverInfo(
+    HANDLE hDirectDrawLocal,
+    PDD_GETDRIVERINFODATA puGetDriverInfoData)
 
-       GDIOBJ_UnlockObjByPtr(pDirectDraw);
+{
+       DWORD  ddRVal;
 
-       return TRUE;
-}
+       PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
+       if (pDirectDraw == NULL) 
+               return DDHAL_DRIVER_NOTHANDLED;
+
+       if   (!(pDirectDraw->Hal.dwFlags & DDHALINFO_GETDRIVERINFOSET))
+            ddRVal = DDHAL_DRIVER_NOTHANDLED;
+       else
+            ddRVal = pDirectDraw->Hal.GetDriverInfo(puGetDriverInfoData);
+   
+    GDIOBJ_UnlockObjByPtr(pDirectDraw);
 
+       return ddRVal;
+}
 
 /************************************************************************/
 /* DD CALLBACKS                                                         */
@@ -653,45 +625,16 @@ BOOL STDCALL NtGdiDdAttachSurface(
 }
 */
 
-
-
-DWORD STDCALL NtGdiDdGetDriverInfo(
-    HANDLE hDirectDrawLocal,
-    PDD_GETDRIVERINFODATA puGetDriverInfoData)
-
-{
-       DWORD  ddRVal;
-
-       PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
-
-       ddRVal = pDirectDraw->DdGetDriverInfo(puGetDriverInfoData);
-   
-    GDIOBJ_UnlockObjByPtr(pDirectDraw);
-
-       return ddRVal;
-}
-
-
-
-
-
-
-
-
-
-
-
 DWORD STDCALL NtGdiDdGetAvailDriverMemory(
     HANDLE hDirectDrawLocal,
     PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData
 )
 {
-       DWORD  ddRVal;
+       DWORD  ddRVal = DDHAL_DRIVER_NOTHANDLED;
 
        PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
 
-    ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData); 
+   // ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData); 
  
        GDIOBJ_UnlockObjByPtr(pDirectDraw);