Author: greatlrd
Date: Sat Mar 3 19:32:57 2007
New Revision: 25974
URL:
http://svn.reactos.org/svn/reactos?rev=25974&view=rev
Log:
merge down r25973 from trunk
Modified:
branches/ros-branch-0_3_1/reactos/subsystems/win32/win32k/ntddraw/ddraw.c
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 Sat Mar 3
19:32:57 2007
@@ -97,6 +97,8 @@
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
@@ -288,11 +290,17 @@
{
PDD_DIRECTDRAW pDirectDraw;
NTSTATUS Status = FALSE;
+ BOOL Ret=FALSE;
+
+ /* FIXME the workaround for 0.3.1 pseh bugs
+ * we should not need todo if (pHalInfo != NULL)
+ * so on
+ */
DPRINT1("NtGdiDdQueryDirectDrawObject\n");
if (hDirectDrawLocal == NULL)
{
- return FALSE;
+ return Ret;
}
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal,
@@ -300,68 +308,217 @@
if (!pDirectDraw)
{
- return FALSE;
- }
+ return Ret;
+ }
+
+ /*
+ * Get pHalInfo
+ */
+ if (pHalInfo != NULL)
+ {
+ DPRINT1("copy &pDirectDraw->Hal to pHalInfo\n");
+ _SEH_TRY
+ {
+ ProbeForWrite(pHalInfo, sizeof(DD_HALINFO), 1);
+ RtlCopyMemory(pHalInfo,&pDirectDraw->Hal, sizeof(DD_HALINFO));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr and SetLastNtError\n");
+ SetLastNtError(Status);
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+ }
+ else
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+
+
+ /*
+ * Get pCallBackFlags
+ */
+ if (pCallBackFlags != NULL)
+ {
+ DPRINT1("copy &CallBackFlags to pCallBackFlags\n");
+ _SEH_TRY
+ {
+ ProbeForWrite(pCallBackFlags, sizeof(DWORD)*3, 1);
+ pCallBackFlags[0]=pDirectDraw->DD.dwFlags;
+ pCallBackFlags[1]=pDirectDraw->Surf.dwFlags;
+ pCallBackFlags[2]=pDirectDraw->Pal.dwFlags;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr and SetLastNtError\n");
+ SetLastNtError(Status);
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+ }
+ else
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+
+ /*
+ * Get puD3dCallbacks
+ */
+ if (puD3dCallbacks != NULL)
+ {
+ DPRINT1("copy pDirectDraw->Hal.lpD3DHALCallbacks to
puD3dCallbacks\n");
+ if (pDirectDraw->Hal.lpD3DHALCallbacks != NULL)
+ {
+ _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))
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr and SetLastNtError\n");
+ SetLastNtError(Status);
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+ }
+ }
+ else
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+
+ /*
+ * Get lpD3DGlobalDriverData
+ */
+ if (puD3dDriverData != NULL)
+ {
+ DPRINT1("copy pDirectDraw->Hal.lpD3DGlobalDriverData to
puD3dDriverData\n");
+ if (pDirectDraw->Hal.lpD3DGlobalDriverData != NULL)
+ {
+ _SEH_TRY
+ {
+ LPD3DNTHAL_GLOBALDRIVERDATA MyD3d;
+ DPRINT1("Found DirectDraw GlobalDriverData for 3D Hal\n");
+ MyD3d = (LPD3DNTHAL_GLOBALDRIVERDATA)
pDirectDraw->Hal.lpD3DGlobalDriverData;
+
+ /* Get puD3dDriverData */
+ ProbeForWrite(puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA), 1);
+ RtlCopyMemory( puD3dDriverData,
pDirectDraw->Hal.lpD3DGlobalDriverData,
+ sizeof(D3DNTHAL_GLOBALDRIVERDATA));
+
+ /* Get puD3dTextureFormats */
+ if (puD3dTextureFormats != NULL)
+ {
+ ProbeForWrite(puD3dTextureFormats, sizeof(DDSURFACEDESC) *
MyD3d->dwNumTextureFormats, 1);
+ if (( MyD3d->lpTextureFormats != NULL) && (
MyD3d->dwNumTextureFormats != 0))
+ {
+ RtlCopyMemory( puD3dTextureFormats, MyD3d->lpTextureFormats,
sizeof(DDSURFACEDESC) * MyD3d->dwNumTextureFormats);
+ }
+ ProbeForWrite(puD3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA),
1);
+ }
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr and SetLastNtError\n");
+ SetLastNtError(Status);
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+ }
+ }
+ else
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+
+ /*
+ * Get puD3dBufferCallbacks
+ */
+ if (puD3dBufferCallbacks != NULL)
+ {
+ DPRINT1("copy pDirectDraw->Hal.lpD3DGlobalDriverData to
puD3dBufferCallbacks\n");
+ if (pDirectDraw->Hal.lpD3DBufCallbacks != NULL)
+ {
+ DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
+ _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))
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr and SetLastNtError\n");
+ SetLastNtError(Status);
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+ }
+ }
+ else
+ {
+ DPRINT1("GDIOBJ_UnlockObjByPtr\n");
+ GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
+ return Ret;
+ }
+
+ DPRINT1("next\n");
_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);
- }
+ ProbeForWrite(puNumHeaps, sizeof(DWORD), 1);
+ *puNumHeaps = pDirectDraw->dwNumHeaps;
+
+ if ((pDirectDraw->pvmList != NULL) && (puvmList != 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) && (puFourCC != NULL))
+ {
+ ProbeForWrite(puFourCC, sizeof(DWORD) * pDirectDraw->dwNumFourCC, 1);
+ RtlCopyMemory( puFourCC, pDirectDraw->pdwFourCC, sizeof(DWORD) *
pDirectDraw->dwNumFourCC);
+ }
}
_SEH_HANDLE
{
@@ -369,15 +526,18 @@
}
_SEH_END;
+
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
- return FALSE;
- }
-
- return TRUE;
+ }
+ else
+ {
+ Ret = TRUE;
+ }
+ return Ret;
}