Author: greatlrd
Date: Thu Feb 22 01:22:30 2007
New Revision: 25871
URL:
http://svn.reactos.org/svn/reactos?rev=25871&view=rev
Log:
merge r25870 it take care of unexpect crash in NtGdiDdCreateDirectDrawObject for it
using seh now
Modified:
branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/intddraw.h
branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/tags.h
branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/ddraw.c
branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/stubs.c
Modified: branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/intddraw.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/subsys…
==============================================================================
--- branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/intddraw.h
(original)
+++ branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/intddraw.h Thu Feb
22 01:22:30 2007
@@ -100,6 +100,14 @@
/* Notify Callback */
//LPDD_NOTIFYCALLBACK NotifyCallback
+ /* memory stuff */
+ DWORD dwNumHeaps;
+ PVIDEOMEMORY pvmList;
+
+ DWORD dwNumFourCC;
+ LPDWORD pdwFourCC;
+
+
} DD_DIRECTDRAW, *PDD_DIRECTDRAW;
BOOL INTERNAL_CALL DD_Cleanup(PVOID pDD);
Modified: branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/tags.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/subsys…
==============================================================================
--- branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/tags.h (original)
+++ branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/include/tags.h Thu Feb 22
01:22:30 2007
@@ -58,4 +58,10 @@
#define TAG_FNTFILE TAG('F', 'N', 'T', 'F') /* font file
*/
#define TAG_SSECTPOOL TAG('S', 'S', 'C', 'P') /* shared
section pool */
+
+/* Dx internal tags rember I do not known if it right namees */
+#define TAG_DXPVMLIST TAG('D', 'X', 'P', 'L') /* pmvlist
for the driver */
+#define TAG_DXFOURCC TAG('D', 'X', 'F', 'O') /* pdwFourCC
for the driver */
+
+
#endif /* _WIN32K_TAGS_H */
Modified: branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/ddraw.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/subsys…
==============================================================================
--- branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/ddraw.c (original)
+++ branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/ddraw.c Thu Feb 22
01:22:30 2007
@@ -48,79 +48,182 @@
return FALSE;
}
+ //if (pDirectDraw->pvmList != NULL)
+ //{
+ // ExFreePool(pDirectDraw->pvmList);
+ //}
+ //
+ //if (pDirectDraw->pdwFourCC != NULL)
+ //{
+ // ExFreePool(pDirectDraw->pdwFourCC);
+ //}
+
pDirectDraw->DrvDisableDirectDraw(pDirectDraw->Global.dhpdev);
return TRUE;
}
+/* code for enable and reanble the drv */
+BOOL
+intEnableDriver(PDD_DIRECTDRAW pDirectDraw)
+{
+ BOOL success;
+ DD_HALINFO HalInfo;
+
+ /*clean up some of the cache entry */
+ RtlZeroMemory(&pDirectDraw->DD, sizeof(DD_CALLBACKS));
+ RtlZeroMemory(&pDirectDraw->Surf, sizeof(DD_SURFACECALLBACKS));
+ RtlZeroMemory(&pDirectDraw->Pal, sizeof(DD_PALETTECALLBACKS));
+ RtlZeroMemory(&pDirectDraw->Hal, sizeof(DD_HALINFO));
+ RtlZeroMemory(&HalInfo, sizeof(DD_HALINFO));
+ pDirectDraw->dwNumHeaps =0;
+ pDirectDraw->dwNumFourCC = 0;
+ pDirectDraw->pdwFourCC = NULL;
+ pDirectDraw->pvmList = NULL;
+
+ /* Get DirectDraw infomations form the driver
+ * DDK say pvmList, pdwFourCC is always NULL in frist call here
+ * but we get back how many pvmList it whant we should alloc, same
+ * with pdwFourCC.
+ */
+ success = pDirectDraw->DrvGetDirectDrawInfo( pDirectDraw->Global.dhpdev,
+ &HalInfo,
+ &pDirectDraw->dwNumHeaps,
+ NULL,
+ &pDirectDraw->dwNumFourCC,
+ NULL);
+ if (!success)
+ {
+ DPRINT1("DrvGetDirectDrawInfo frist call fail\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return FALSE;
+ }
+
+ /* The driver are not respnose to alloc the memory for pvmList
+ * but it is win32k responsible todo, Windows 9x it is gdi32.dll
+ */
+ if (pDirectDraw->dwNumHeaps != 0)
+ {
+ pDirectDraw->pvmList = (PVIDEOMEMORY) ExAllocatePoolWithTag(PagedPool,
pDirectDraw->dwNumHeaps * sizeof(VIDEOMEMORY), TAG_DXPVMLIST);
+ if (pDirectDraw->pvmList == NULL)
+ {
+ return FALSE;
+ }
+ }
+
+ /* The driver are not respnose to alloc the memory for pdwFourCC
+ * but it is win32k responsible todo, Windows 9x it is gdi32.dll
+ */
+
+ if (pDirectDraw->dwNumFourCC != 0)
+ {
+ pDirectDraw->pdwFourCC = (LPDWORD) ExAllocatePoolWithTag(PagedPool,
pDirectDraw->dwNumFourCC * sizeof(DWORD), TAG_DXFOURCC);
+
+ if (pDirectDraw->pdwFourCC == NULL)
+ {
+ return FALSE;
+ }
+ }
+
+ success = pDirectDraw->DrvGetDirectDrawInfo( pDirectDraw->Global.dhpdev,
+ &HalInfo,
+ &pDirectDraw->dwNumHeaps,
+ pDirectDraw->pvmList,
+ &pDirectDraw->dwNumFourCC,
+ pDirectDraw->pdwFourCC);
+ if (!success)
+ {
+ DPRINT1("DrvGetDirectDrawInfo second call fail\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return FALSE;
+ }
+
+
+ /* We need now convert the DD_HALINFO we got, it can be NT4 driver we
+ * loading ReactOS supporting NT4 and higher to be loading.so we make
+ * the HALInfo compatible here so we can easy pass it to gdi32.dll
+ * without converting it later
+ */
+
+ if ((HalInfo.dwSize != sizeof(DD_HALINFO)) &&
+ (HalInfo.dwSize != sizeof(DD_HALINFO_V4)))
+ {
+ DPRINT1(" Fail not vaild driver DD_HALINFO struct found\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return FALSE;
+ }
+
+ if (HalInfo.dwSize != sizeof(DD_HALINFO))
+ {
+ if (HalInfo.dwSize == sizeof(DD_HALINFO_V4))
+ {
+ /* NT4 Compatible */
+ DPRINT1("Got DD_HALINFO_V4 sturct we convert it to DD_HALINFO
\n");
+ HalInfo.dwSize = sizeof(DD_HALINFO);
+ HalInfo.lpD3DGlobalDriverData = NULL;
+ HalInfo.lpD3DHALCallbacks = NULL;
+ HalInfo.lpD3DBufCallbacks = NULL;
+ }
+ else
+ {
+ /* Unknown version found */
+ DPRINT1(" Fail : did not get DD_HALINFO size \n");
+
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return FALSE;
+ }
+
+ /* Copy it to user mode pointer the data */
+ RtlCopyMemory(&pDirectDraw->Hal, &HalInfo, sizeof(DD_HALINFO));
+ }
+
+ success = pDirectDraw->EnableDirectDraw( pDirectDraw->Global.dhpdev,
+ &pDirectDraw->DD,
+ &pDirectDraw->Surf,
+ &pDirectDraw->Pal);
+
+ if (!success)
+ {
+ DPRINT1("EnableDirectDraw call fail\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(HDC hdc)
{
- DD_CALLBACKS callbacks;
- DD_SURFACECALLBACKS surface_callbacks;
- DD_PALETTECALLBACKS palette_callbacks;
DC *pDC;
- BOOL success;
HANDLE hDirectDraw;
PDD_DIRECTDRAW pDirectDraw;
DPRINT1("NtGdiDdCreateDirectDrawObject\n");
- 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);
-
/* Create a hdc if we do not have one */
if (hdc == NULL)
{
- HDC newHdc = IntGdiCreateDC(NULL,NULL,NULL,NULL,FALSE);
- hdc = newHdc;
-
- if (hdc == NULL)
- {
- DPRINT1("FIXME hdc is NULL \n");
- return NULL;
- }
+ return NULL;
}
/* Look the hdc to gain the internal struct */
-
pDC = DC_LockDc(hdc);
if (!pDC)
{
- /* We did fail look here so return NULL */
return NULL;
}
- if (pDC->DriverFunctions.EnableDirectDraw == NULL)
- {
- /* Driver doesn't support DirectDraw */
-
- /*
- Warring ReactOS complain that pDC are not right owner
- when DC_UnlockDc(pDC) hit, why ?
- */
+ /* test see if drv got a dx interface or not */
+ if (( pDC->DriverFunctions.GetDirectDrawInfo == NULL) ||
+ ( pDC->DriverFunctions.DisableDirectDraw == NULL) ||
+ ( pDC->DriverFunctions.EnableDirectDraw == NULL))
+ {
DC_UnlockDc(pDC);
return NULL;
}
- /* test see if driver support DirectDraw interface */
- success = pDC->DriverFunctions.EnableDirectDraw(
- pDC->PDev, &callbacks, &surface_callbacks,
&palette_callbacks);
-
- if (!success)
- {
- /* DirectDraw creation failed */
- DPRINT1("DirectDraw creation failed\n");
- DC_UnlockDc(pDC);
- return NULL;
- }
-
- /* We found a DirectDraw interface
- * Alloc a handler for it
- */
+ /* alloc and lock the stucrt */
hDirectDraw = GDIOBJ_AllocObj(DdHandleTable, GDI_OBJECT_TYPE_DIRECTDRAW);
if (!hDirectDraw)
{
@@ -129,8 +232,6 @@
return NULL;
}
- /* try look the DirectDraw handler and setup some data later */
-
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDraw,
GDI_OBJECT_TYPE_DIRECTDRAW);
if (!pDirectDraw)
{
@@ -139,27 +240,7 @@
return NULL;
}
- /*
- * We are caching all callbacks and some data
- * reason for it, is we do not trust on the kernel/usermode
- * pointer for the callbacks comes back from user mode.
- * I perfer more safer way todo it, only safe way is
- * to cache the callbacks pointer, and send back the true
- * kernel pointer to user mode of the driver api we get back
- * Windows is sending back kernel pointer of the driver we
- * are doing same, differnt is we also cache it. and only
- * use the cached one.
- */
-
- /*
- Getting the PDev bad idea we need the hdc instead
- if we are doing a dymatic resultions change the
- Pdev will get lost, we should cache the HDC instead
- in windows, after a resultions change the HAL interface
- need be rebuild from scrach, thanks to this.small problem
- maybe we in ReactOS can found a solvtions on this later
- */
-
+ /* setup the internal stuff */
pDirectDraw->Global.dhpdev = pDC->PDev;
pDirectDraw->Local.lpGbl = &pDirectDraw->Global;
@@ -167,30 +248,28 @@
pDirectDraw->DrvDisableDirectDraw = pDC->DriverFunctions.DisableDirectDraw;
pDirectDraw->EnableDirectDraw = pDC->DriverFunctions.EnableDirectDraw;
-
- /* DD_CALLBACKS setup */
- RtlMoveMemory(&pDirectDraw->DD, &callbacks, sizeof(DD_CALLBACKS));
-
- /* DD_SURFACECALLBACKS setup*/
- RtlMoveMemory(&pDirectDraw->Surf, &surface_callbacks,
sizeof(DD_SURFACECALLBACKS));
-
- /* DD_PALETTECALLBACKS setup*/
- RtlMoveMemory(&pDirectDraw->Pal, &palette_callbacks,
sizeof(DD_PALETTECALLBACKS));
+ if (intEnableDriver(pDirectDraw) == FALSE)
+ {
+ /* FIXME delete the pDirectDraw and the handle */
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ DC_UnlockDc(pDC);
+ return NULL;
+ }
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
DC_UnlockDc(pDC);
-
DPRINT1("DirectDraw return handler 0x%x\n",hDirectDraw);
+
return hDirectDraw;
}
BOOL STDCALL
NtGdiDdDeleteDirectDrawObject( HANDLE hDirectDrawLocal)
{
-
DPRINT1("NtGdiDdDeleteDirectDrawObject\n");
return GDIOBJ_FreeObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
}
+
BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
@@ -207,139 +286,97 @@
DWORD *puFourCC
)
{
- DD_HALINFO HalInfo;
PDD_DIRECTDRAW pDirectDraw;
- BOOL success;
-
+ NTSTATUS Status = FALSE;
DPRINT1("NtGdiDdQueryDirectDrawObject\n");
-
- /* Check for NULL pointer to prevent any one doing a mistake */
if (hDirectDrawLocal == NULL)
{
return FALSE;
}
- if (pHalInfo == NULL)
- {
- return FALSE;
- }
-
- if ( pCallBackFlags == NULL)
- {
- return FALSE;
- }
-
- /* Look the DirectDraw interface */
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal,
GDI_OBJECT_TYPE_DIRECTDRAW);
if (!pDirectDraw)
{
- /* Fail to Lock DirectDraw handle */
return FALSE;
}
- /* lock susseces
- * rest the pHalInfo size we do not known
- * if we got a NT4 driver or windows 2000/XP/2003 driver yet
- */
- pHalInfo->dwSize = 0;
-
- /* Getting the request size of all struct at frist call
- * Secound call we getting data back
- */
-
- success = pDirectDraw->DrvGetDirectDrawInfo( pDirectDraw->Global.dhpdev,
- &HalInfo,
- puNumHeaps, puvmList,
- puNumFourCC, puFourCC);
-
- if (!success)
- {
- /* fail we did not get any DrvGetDirectDrawInfo
- * so we assume it is simple 2d DirectDraw interface
- */
- DPRINT1("Driver does not fill the Fail to get DirectDraw driver info
\n");
-
- GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ _SEH_TRY
+ {
+ ProbeForWrite(pHalInfo, sizeof(DD_HALINFO), 1);
+ RtlCopyMemory(pHalInfo,&pDirectDraw->Hal, sizeof(DD_HALINFO));
+
+ ProbeForWrite(pCallBackFlags, sizeof(DWORD)*3, 1);
+ pCallBackFlags[0]=pDirectDraw->DD.dwFlags;
+ pCallBackFlags[1]=pDirectDraw->Surf.dwFlags;
+ pCallBackFlags[2]=pDirectDraw->Pal.dwFlags;
+
+ if (pDirectDraw->Hal.lpD3DHALCallbacks != NULL)
+ {
+ DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
+
+ ProbeForWrite(puD3dCallbacks, sizeof(D3DNTHAL_CALLBACKS), 1);
+ RtlCopyMemory( puD3dCallbacks, pDirectDraw->Hal.lpD3DHALCallbacks,
+ sizeof( D3DNTHAL_CALLBACKS ) );
+ }
+
+ if (pDirectDraw->Hal.lpD3DGlobalDriverData != NULL)
+ {
+ DPRINT1("Found DirectDraw Global DriverData \n");
+
+ ProbeForWrite(puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA), 1);
+ RtlCopyMemory( puD3dDriverData, pDirectDraw->Hal.lpD3DGlobalDriverData,
+ sizeof(D3DNTHAL_GLOBALDRIVERDATA));
+ }
+
+ if (pDirectDraw->Hal.lpD3DBufCallbacks != NULL)
+ {
+ DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
+ ProbeForWrite(puD3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS), 1);
+ RtlCopyMemory( puD3dBufferCallbacks, pDirectDraw->Hal.lpD3DBufCallbacks,
+ sizeof(DD_D3DBUFCALLBACKS));
+ }
+
+ /* FIXME LPDDSURFACEDESC puD3dTextureFormats */
+
+ ProbeForWrite(puNumHeaps, sizeof(DWORD), 1);
+ *puNumHeaps = pDirectDraw->dwNumHeaps;
+
+ if (pDirectDraw->pvmList != NULL)
+ {
+ ProbeForWrite(puvmList, sizeof(VIDEOMEMORY) * pDirectDraw->dwNumHeaps, 1);
+ RtlCopyMemory( puvmList,
+ pDirectDraw->pvmList,
+ sizeof(VIDEOMEMORY) * pDirectDraw->dwNumHeaps);
+ }
+
+ ProbeForWrite(puNumFourCC, sizeof(DWORD), 1);
+ *puNumFourCC = pDirectDraw->dwNumFourCC;
+
+ if (pDirectDraw->pdwFourCC != NULL)
+ {
+ ProbeForWrite(puFourCC, sizeof(DWORD) * pDirectDraw->dwNumFourCC, 1);
+ RtlCopyMemory( puFourCC,
+ pDirectDraw->pdwFourCC,
+ sizeof(DWORD) * pDirectDraw->dwNumFourCC);
+ }
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
return FALSE;
}
- if (HalInfo.dwSize == 0)
- {
- /* some driver does not fill it, they only implement the DrvGetDirectDrawInfo
- * so they work on Windows 2000/XP/2003
- */
-
- DPRINT1(" Fail for driver does not fill the DD_HALINFO struct \n");
- GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
- return FALSE;
- }
-
- /* check see if DD_HALINFO is NT4 version or not
- * if it NT4 version we convert it to NT5 version
- */
- if (HalInfo.dwSize != sizeof(DD_HALINFO))
- {
- if (HalInfo.dwSize == sizeof(DD_HALINFO_V4))
- {
- /* NT4 Compatible */
- DPRINT1("Got DD_HALINFO_V4 sturct we convert it to DD_HALINFO
\n");
- HalInfo.dwSize = sizeof(DD_HALINFO);
- HalInfo.lpD3DGlobalDriverData = NULL;
- HalInfo.lpD3DHALCallbacks = NULL;
- HalInfo.lpD3DBufCallbacks = NULL;
- }
- else
- {
- /* Unknown version found */
- DPRINT1(" Fail : did not get DD_HALINFO size \n");
- GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
- return FALSE;
- }
- }
-
- /* Copy it to user mode pointer the data */
- RtlMoveMemory(pHalInfo, &HalInfo, sizeof(DD_HALINFO));
-
- /* rest the flag so we do not need do it later */
- pCallBackFlags[0]=pDirectDraw->DD.dwFlags;
- pCallBackFlags[1]=pDirectDraw->Surf.dwFlags;
- pCallBackFlags[2]=pDirectDraw->Pal.dwFlags;
-
- DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n");
-
- /* Copy it to the cache */
- RtlMoveMemory(&pDirectDraw->Hal, pHalInfo, sizeof(DD_HALINFO));
-
- if (pHalInfo->lpD3DGlobalDriverData)
- {
- /*
- msdn say D3DHAL_GLOBALDRIVERDATA and D3DNTHAL_GLOBALDRIVERDATA
- are not same but if u compare these in msdn it is exacly same
- */
- DPRINT1("Found DirectDraw Global DriverData \n");
- RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData,
- sizeof(D3DNTHAL_GLOBALDRIVERDATA));
- }
-
- if (pHalInfo->lpD3DHALCallbacks )
- {
- DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
- RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks,
- sizeof( D3DNTHAL_CALLBACKS ) );
- }
-
- if (pHalInfo->lpD3DBufCallbacks)
- {
- DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
- /* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */
- RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks,
- sizeof(DD_D3DBUFCALLBACKS));
- }
-
- GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return TRUE;
}
Modified: branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/stubs.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/subsys…
==============================================================================
--- branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/stubs.c (original)
+++ branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/stubs.c Thu Feb 22
01:22:30 2007
@@ -311,7 +311,7 @@
{
UNIMPLEMENTED
- return 0;
+ return FALSE;
}
BOOL STDCALL NtGdiDdReleaseDC(