Fix DD_Cleanup that will make Contry Strike not crashing when it does not found right reslution, thx drfred that found the bug + source cleanup and small bugfix for ntddraw

svn path=/trunk/; revision=18387
This commit is contained in:
Magnus Olsen 2005-10-09 22:15:06 +00:00
parent 690727fe99
commit 5e45c5916f
2 changed files with 85 additions and 136 deletions

View 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;

View file

@ -20,8 +20,13 @@
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 */
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;
/* DD_CALLBACKS setup */
RtlMoveMemory(&pDirectDraw->DD, &callbacks, sizeof(DD_CALLBACKS));
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,35 +144,53 @@ 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;
}
if (pHalInfo->lpD3DGlobalDriverData)
{
RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
}
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;
}
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);
return TRUE;
}
DWORD STDCALL NtGdiDdGetDriverInfo(
HANDLE hDirectDrawLocal,
PDD_GETDRIVERINFODATA puGetDriverInfoData)
{
DWORD ddRVal;
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 */
/* FIXME NtGdiDdCreateSurface we do not call to ddCreateSurface */
@ -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);