NtGdiDdQueryDirectDrawObject do not setup wrong callback to struct
members. Check for some NULL parama that can not be NULL.
Modified: trunk/reactos/subsys/win32k/ntddraw/ddraw.c
_____
Modified: trunk/reactos/subsys/win32k/ntddraw/ddraw.c
--- trunk/reactos/subsys/win32k/ntddraw/ddraw.c 2005-12-11 23:45:44 UTC
(rev 20093)
+++ trunk/reactos/subsys/win32k/ntddraw/ddraw.c 2005-12-11 23:53:23 UTC
(rev 20094)
@@ -13,6 +13,10 @@
#define NDEBUG
#include <debug.h>
+/* swtich this off to get rid of all dx debug msg */
+#define DX_DEBUG
+
+
/***********************************************************************
*/
/* DIRECT DRAW OBJECT
*/
/***********************************************************************
*/
@@ -21,7 +25,9 @@
DD_Cleanup(PVOID ObjectBody)
{
PDD_DIRECTDRAW pDirectDraw = (PDD_DIRECTDRAW) ObjectBody;
+#ifdef DX_DEBUG
DPRINT1("DD_Cleanup\n");
+#endif
if (!pDirectDraw)
return FALSE;
@@ -43,7 +49,9 @@
DD_CALLBACKS callbacks;
DD_SURFACECALLBACKS surface_callbacks;
DD_PALETTECALLBACKS palette_callbacks;
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdCreateDirectDrawObject\n");
+#endif
RtlZeroMemory(&callbacks, sizeof(DD_CALLBACKS));
callbacks.dwSize = sizeof(DD_CALLBACKS);
@@ -75,7 +83,9 @@
if (!success)
{
+#ifdef DX_DEBUG
DPRINT1("DirectDraw creation failed\n");
+#endif
// DirectDraw creation failed
DC_UnlockDc(pDC);
return NULL;
@@ -85,7 +95,9 @@
if (!hDirectDraw)
{
/* No more memmory */
+#ifdef DX_DEBUG
DPRINT1("No more memmory\n");
+#endif
DC_UnlockDc(pDC);
return NULL;
}
@@ -94,7 +106,9 @@
if (!pDirectDraw)
{
/* invalid handle */
+#ifdef DX_DEBUG
DPRINT1("invalid handle\n");
+#endif
DC_UnlockDc(pDC);
return NULL;
}
@@ -125,13 +139,15 @@
HANDLE hDirectDrawLocal
)
{
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdDeleteDirectDrawObject\n");
+#endif
return GDIOBJ_FreeObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
}
BOOL STDCALL NtGdiDdQueryDirectDrawObject(
HANDLE hDirectDrawLocal,
- DD_HALINFO *pHalInfo,
+ DD_HALINFO *pHalInfo,
DWORD *pCallBackFlags,
LPD3DNTHAL_CALLBACKS puD3dCallbacks,
LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData,
@@ -143,13 +159,51 @@
DWORD *puFourCC
)
{
+#ifdef DX_DEBUG
+ DPRINT1("NtGdiDdQueryDirectDrawObject\n");
+#endif
+
+ /* Check for NULL pointer to prevent any one doing a mistake */
+
+ if (hDirectDrawLocal == NULL)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("warning hDirectDraw handler is NULL, the handler is
DDRAWI_DIRECTDRAW_GBL.hDD\n");
+ DPRINT1("and it is NtGdiDdCreateDirectDrawObject return
value\n");
+#endif
+ return FALSE;
+ }
+
+
+ if (pHalInfo == NULL)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("warning pHalInfo buffer is NULL \n");
+#endif
+ return FALSE;
+ }
+
+ if ( pCallBackFlags == NULL)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("warning pCallBackFlags s NULL, the size must be 3*DWORD
in follow order \n");
+ DPRINT1("pCallBackFlags[0] = flags in DD_CALLBACKS\n");
+ DPRINT1("pCallBackFlags[1] = flags in DD_SURFACECALLBACKS\n");
+ DPRINT1("pCallBackFlags[2] = flags in DD_PALETTECALLBACKS\n");
+#endif
+ return FALSE;
+ }
+
+
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
- DPRINT1("NtGdiDdQueryDirectDrawObject\n");
+
if (!pDirectDraw)
{
/* Fail to Lock DirectDraw handle */
+#ifdef DX_DEBUG
DPRINT1(" Fail to Lock DirectDraw handle \n");
+#endif
return FALSE;
}
@@ -163,38 +217,133 @@
if (!success)
{
+#ifdef DX_DEBUG
DPRINT1(" Fail to get DirectDraw driver info \n");
+#endif
GDIOBJ_UnlockObjByPtr(pDirectDraw);
return FALSE;
}
+
+ /* rest the flag so we do not need do it later */
+ pCallBackFlags[0]=0;
+ pCallBackFlags[1]=0;
+ pCallBackFlags[2]=0;
+
if (pHalInfo)
- {
- DPRINT1("Found DirectDraw CallBack for 2D Hal\n");
- RtlMoveMemory(&pDirectDraw->Hal, pHalInfo, sizeof(DD_HALINFO));
+ {
+
+ {
+ DDHALINFO* pHalInfo2 = ((DDHALINFO*) pHalInfo);
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n");
+#endif
+ RtlMoveMemory(&pDirectDraw->Hal, pHalInfo2,
sizeof(DDHALINFO));
- if (pHalInfo->lpD3DHALCallbacks)
- {
- DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
- RtlMoveMemory(puD3dCallbacks,
pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));
+ if (pHalInfo2->lpDDExeBufCallbacks)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer
\n");
+#endif
+ /* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */
+ RtlMoveMemory(puD3dBufferCallbacks,
pHalInfo2->lpDDExeBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
+ }
+
+#ifdef DX_DEBUG
+ DPRINT1("Do not support CallBack for 3D Hal\n");
+#endif
+ /* FIXME we need D3DHAL be include
+
+ if (pHalInfo2->lpD3DHALCallbacks )
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
+#endif
+ RtlMoveMemory(puD3dCallbacks, (ULONG
*)pHalInfo2->lpD3DHALCallbacks, sizeof( D3DHAL_CALLBACKS ));
+ }
+ */
+
+
+ /* msdn say D3DHAL_GLOBALDRIVERDATA and
D3DNTHAL_GLOBALDRIVERDATA are not same
+ but if u compare these in msdn it is exacly same */
+
+ if (pHalInfo->lpD3DGlobalDriverData)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 3D Hal
Private \n");
+#endif
+ RtlMoveMemory(puD3dDriverData, (ULONG
*)pHalInfo2->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
+ }
+
+ /* build the flag */
+
+ if (pHalInfo2->lpDDCallbacks!=NULL)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D
Hal flag = %d\n",pHalInfo2->lpDDCallbacks->dwFlags);
+#endif
+ pCallBackFlags[0] =
pHalInfo2->lpDDCallbacks->dwFlags;
+ }
+
+ if (pHalInfo2->lpDDCallbacks!=NULL)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Dectect DirectDraw lpDDSurfaceCallbacks for
2D Hal flag = %d\n",pHalInfo2->lpDDSurfaceCallbacks->dwFlags);
+#endif
+ pCallBackFlags[1] =
pHalInfo2->lpDDSurfaceCallbacks->dwFlags;
+ }
+
+ if (pHalInfo2->lpDDCallbacks!=NULL)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D Hal
flag = %d\n",pHalInfo2->lpDDPaletteCallbacks->dwFlags);
+#endif
+ pCallBackFlags[2] =
pHalInfo2->lpDDPaletteCallbacks->dwFlags;
+ }
+
+ }
+
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
+#endif
+ RtlMoveMemory(&pDirectDraw->Hal, pHalInfo,
sizeof(DD_HALINFO));
+
+ if (pHalInfo->lpD3DBufCallbacks)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 3D Hal
Bufffer \n");
+#endif
+ RtlMoveMemory(puD3dBufferCallbacks,
pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
+ }
+
+ if (pHalInfo->lpD3DHALCallbacks)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
+#endif
+ RtlMoveMemory(puD3dCallbacks,
pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));
+ }
+
+ if (pHalInfo->lpD3DGlobalDriverData)
+ {
+#ifdef DX_DEBUG
+ DPRINT1("Found DirectDraw CallBack for 3D Hal
Private \n");
+#endif
+ RtlMoveMemory(puD3dDriverData,
pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
+ }
+
+#ifdef DX_DEBUG
+ DPRINT1("Unkown DirectX driver interface\n");
+#endif
+
}
- if (pHalInfo->lpD3DGlobalDriverData)
- {
- DPRINT1("Found DirectDraw CallBack for 3D Hal Private \n");
- RtlMoveMemory(puD3dDriverData,
pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
- }
- if (pHalInfo->lpD3DBufCallbacks)
- {
- DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
- RtlMoveMemory(puD3dBufferCallbacks,
pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
- }
-
- }
+#ifdef DX_DEBUG
else
{
DPRINT1("No DirectDraw Hal info have been found, it did not
fail, it did gather some other info \n");
}
+#endif
GDIOBJ_UnlockObjByPtr(pDirectDraw);
@@ -210,11 +359,15 @@
DWORD ddRVal = 0;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetDriverInfo\n");
+#endif
if (pDirectDraw == NULL)
{
+#ifdef DX_DEBUG
DPRINT1("Can not lock DirectDraw handle \n");
+#endif
return DDHAL_DRIVER_NOTHANDLED;
}
@@ -230,7 +383,9 @@
/* Now we are doing the call to drv DrvGetDriverInfo */
if (ddRVal == 2)
{
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetDriverInfo DDHAL_DRIVER_NOTHANDLED");
+#endif
ddRVal = DDHAL_DRIVER_NOTHANDLED;
}
else
@@ -259,12 +414,16 @@
{
DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED;
PDD_DIRECTDRAW_GLOBAL lgpl;
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdCreateSurface\n");
+#endif
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
if (pDirectDraw == NULL)
{
+#ifdef DX_DEBUG
DPRINT1("Can not lock the DirectDraw handle\n");
+#endif
return DDHAL_DRIVER_NOTHANDLED;
}
@@ -277,7 +436,9 @@
/* make the call */
if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
{
+#ifdef DX_DEBUG
DPRINT1("DirectDraw HAL does not support Create Surface");
+#endif
ddRVal = DDHAL_DRIVER_NOTHANDLED;
}
else
@@ -299,7 +460,9 @@
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdWaitForVerticalBlank\n");
+#endif
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
@@ -334,7 +497,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdCanCreateSurface\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -366,7 +531,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetScanLine\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -405,7 +572,9 @@
DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdDestroySurface\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -444,7 +613,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceTarget,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdFlip\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -478,7 +649,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdLock\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -510,7 +683,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdUnlock\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -543,7 +718,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDest,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdBlt\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -575,7 +752,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdSetColorKey\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -609,7 +788,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceAttached,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdAddAttachedSurface\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -641,7 +822,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetBltStatus\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -673,7 +856,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetFlipStatus\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -706,7 +891,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDestination,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdUpdateOverlay\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -739,7 +926,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDestination,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdSetOverlayPosition\n");
+#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
@@ -773,7 +962,9 @@
/* FIXME: implement
* PDD_SURFACE pDDSurf = PVOID pDDSurf
*/
+#ifdef DX_DEBUG
DPRINT1("DDSURF_Cleanup\n");
+#endif
return TRUE;
}
@@ -787,7 +978,9 @@
)
{
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdCreateSurfaceObject\n");
+#endif
if (!pDirectDraw)
return NULL;
@@ -818,7 +1011,9 @@
HANDLE hSurface
)
{
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdDeleteSurfaceObject\n");
+#endif
/* FIXME add right GDI_OBJECT_TYPE_ for everthing for now
we are using same type */
/* return GDIOBJ_FreeObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE);
*/
@@ -869,7 +1064,9 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetAvailDriverMemory\n");
+#endif
/* backup the orignal PDev and info */
lgpl = puGetAvailDriverMemoryData->lpDD;
@@ -901,7 +1098,10 @@
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDraw,
GDI_OBJECT_TYPE_DIRECTDRAW);
+
+#ifdef DX_DEBUG
DPRINT1("NtGdiDdSetExclusiveMode\n");
+#endif
/* backup the orignal PDev and info */
lgpl = puSetExclusiveModeData->lpDD;