prepare some directdraw syscall using cache info, that will make our ddraw.dll work evently in reactos.
Modified: trunk/reactos/subsys/win32k/ntddraw/ddraw.c

Modified: trunk/reactos/subsys/win32k/ntddraw/ddraw.c
--- trunk/reactos/subsys/win32k/ntddraw/ddraw.c	2005-10-24 17:27:41 UTC (rev 18746)
+++ trunk/reactos/subsys/win32k/ntddraw/ddraw.c	2005-10-24 17:32:47 UTC (rev 18747)
@@ -208,12 +208,19 @@
 )
 {
 	DWORD  ddRVal = DDHAL_DRIVER_NOTHANDLED;
-	
+	PDD_DIRECTDRAW_GLOBAL lgpl;
 
 	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
 	if (pDirectDraw == NULL) 
 		return DDHAL_DRIVER_NOTHANDLED;
 
+	/* backup the orignal PDev and info */
+	lgpl = puCreateSurfaceData->lpDD;
+
+	/* use our cache version instead */
+	puCreateSurfaceData->lpDD = &pDirectDraw->Global;
+	
+	/* make the call */
 	if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
 		ddRVal = DDHAL_DRIVER_NOTHANDLED;
 	else
@@ -221,6 +228,9 @@
 	   ddRVal = pDirectDraw->DD.CreateSurface(puCreateSurfaceData);	 
 	}
 
+	/* But back the orignal PDev */
+	puCreateSurfaceData->lpDD = lgpl;
+    
 	GDIOBJ_UnlockObjByPtr(pDirectDraw);	
 	return ddRVal;
 }
@@ -231,15 +241,27 @@
 )
 {
 	DWORD  ddRVal;
+	PDD_DIRECTDRAW_GLOBAL lgpl;
+
 	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
 	if (pDirectDraw == NULL) 
 		return DDHAL_DRIVER_NOTHANDLED;
 
+	/* backup the orignal PDev and info */
+	lgpl = puWaitForVerticalBlankData->lpDD;
+
+	/* use our cache version instead */
+	puWaitForVerticalBlankData->lpDD = &pDirectDraw->Global;
+
+	/* make the call */
 	if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK))
 		ddRVal = DDHAL_DRIVER_NOTHANDLED;
 	else	
   	    ddRVal = pDirectDraw->DD.WaitForVerticalBlank(puWaitForVerticalBlankData);
 
+	/* But back the orignal PDev */
+	puWaitForVerticalBlankData->lpDD = lgpl;
+
     GDIOBJ_UnlockObjByPtr(pDirectDraw);
 	return ddRVal;
 }
@@ -250,16 +272,27 @@
 )
 {
 	DWORD  ddRVal;
+	PDD_DIRECTDRAW_GLOBAL lgpl;
 
 	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
 	if (pDirectDraw == NULL) 
 		return DDHAL_DRIVER_NOTHANDLED;
 
+	/* backup the orignal PDev and info */
+	lgpl = puCanCreateSurfaceData->lpDD;
+
+	/* use our cache version instead */
+	puCanCreateSurfaceData->lpDD = &pDirectDraw->Global;
+
+	/* make the call */
 	if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
 		ddRVal = DDHAL_DRIVER_NOTHANDLED;
 	else	
 	    ddRVal = pDirectDraw->DD.CanCreateSurface(puCanCreateSurfaceData);
 
+	/* But back the orignal PDev */
+	puCanCreateSurfaceData->lpDD = lgpl;
+
 	GDIOBJ_UnlockObjByPtr(pDirectDraw);
 	return ddRVal;
 }
@@ -270,16 +303,27 @@
 )
 {
 	DWORD  ddRVal;
+	PDD_DIRECTDRAW_GLOBAL lgpl;
 
 	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
 	if (pDirectDraw == NULL) 
 		return DDHAL_DRIVER_NOTHANDLED;
 
+	/* backup the orignal PDev and info */
+	lgpl = puGetScanLineData->lpDD;
+
+	/* use our cache version instead */
+	puGetScanLineData->lpDD = &pDirectDraw->Global;
+
+	/* make the call */
 	if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_GETSCANLINE))
 		ddRVal = DDHAL_DRIVER_NOTHANDLED;
 	else	
 	    ddRVal = pDirectDraw->DD.GetScanLine(puGetScanLineData);
 
+	/* But back the orignal PDev */
+	puGetScanLineData->lpDD = lgpl;
+
 	GDIOBJ_UnlockObjByPtr(pDirectDraw);
 	return ddRVal;
 }
@@ -321,6 +365,7 @@
         ddRVal = pDirectDraw->Surf.DestroySurface(&DestroySurf); 
 	}
 
+	
     GDIOBJ_UnlockObjByPtr(pDirectDraw);
     return ddRVal;			
 }
@@ -334,16 +379,27 @@
 )
 {
 	DWORD  ddRVal;
+	PDD_DIRECTDRAW_GLOBAL lgpl;
 
 	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceTarget, GDI_OBJECT_TYPE_DIRECTDRAW);
 	if (pDirectDraw == NULL) 
 		return DDHAL_DRIVER_NOTHANDLED;
 
+	/* backup the orignal PDev and info */
+	lgpl = puFlipData->lpDD;
+
+	/* use our cache version instead */
+	puFlipData->lpDD = &pDirectDraw->Global;
+
+	/* make the call */
 	if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_FLIP))
 		ddRVal = DDHAL_DRIVER_NOTHANDLED;
 	else
         ddRVal = pDirectDraw->Surf.Flip(puFlipData);
 
+	/* But back the orignal PDev */
+	puFlipData->lpDD = lgpl;
+
     GDIOBJ_UnlockObjByPtr(pDirectDraw);
     return ddRVal;		
 }
@@ -355,16 +411,27 @@
 )
 {
 	DWORD  ddRVal;
+	PDD_DIRECTDRAW_GLOBAL lgpl;
 
 	PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
 	if (pDirectDraw == NULL) 
 		return DDHAL_DRIVER_NOTHANDLED;
 
+	/* backup the orignal PDev and info */
+	lgpl = puLockData->lpDD;
+
+	/* use our cache version instead */
+	puLockData->lpDD = &pDirectDraw->Global;
+
+	/* make the call */
 	if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_LOCK))
 		ddRVal = DDHAL_DRIVER_NOTHANDLED;
 	else
         ddRVal = pDirectDraw->Surf.Lock(puLockData);
 
+	/* But back the orignal PDev */
+	puLockData->lpDD = lgpl;
+
     GDIOBJ_UnlockObjByPtr(pDirectDraw);
     return ddRVal;		
 }