ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

gdientry.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:        See COPYING in the top level directory
00003  * PROJECT:          ReactOS GDI32
00004  * PURPOSE:          GDI DirectX inteface
00005  * FILE:             lib/gdi32/misc/gdientry.c
00006  * PROGRAMERS:       Alex Ionescu (alex@relsoft.net)
00007  *                   Magnus Olsen (magnus@greatlord.com)
00008  */
00009 
00010 /* INCLUDES ******************************************************************/
00011 
00012 #include "precomp.h"
00013 
00014 /* DATA **********************************************************************/
00015 
00016 HANDLE ghDirectDraw;
00017 ULONG gcDirectDraw;
00018 
00019 #define GetDdHandle(Handle) ((HANDLE)Handle ? (HANDLE)Handle : ghDirectDraw)
00020 
00021 
00022 
00023 /* CALLBACKS *****************************************************************/
00024 
00025 /*
00026  * @implemented
00027  *
00028  * DdAddAttachedSurface
00029  */
00030 DWORD
00031 WINAPI
00032 DdAddAttachedSurface(LPDDHAL_ADDATTACHEDSURFACEDATA Attach)
00033 {
00034     /* Call win32k */
00035     return NtGdiDdAddAttachedSurface((HANDLE)Attach->lpDDSurface->hDDSurface,
00036                                      (HANDLE)Attach->lpSurfAttached->hDDSurface,
00037                                      (PDD_ADDATTACHEDSURFACEDATA)Attach);
00038 }
00039 
00040 /*
00041  * @implemented
00042  *
00043  * DdBlt
00044  */
00045 DWORD
00046 WINAPI
00047 DdBlt(LPDDHAL_BLTDATA Blt)
00048 {
00049     HANDLE Surface = 0;
00050 
00051     /* Use the right surface */
00052     if (Blt->lpDDSrcSurface)
00053     {
00054         Surface = (HANDLE)Blt->lpDDSrcSurface->hDDSurface;
00055     }
00056 
00057     /* Call win32k */
00058     return NtGdiDdBlt((HANDLE)Blt->lpDDDestSurface->hDDSurface, Surface, (PDD_BLTDATA)Blt);
00059 }
00060 
00061 /*
00062  * @implemented
00063  *
00064  * DdDestroySurface
00065  */
00066 DWORD
00067 WINAPI
00068 DdDestroySurface(LPDDHAL_DESTROYSURFACEDATA pDestroySurface)
00069 {
00070     DWORD Return = DDHAL_DRIVER_NOTHANDLED;
00071     BOOL RealDestroy;
00072 
00073     if (pDestroySurface->lpDDSurface->hDDSurface)
00074     {
00075         /* Check if we shoudl really destroy it */
00076         RealDestroy = !(pDestroySurface->lpDDSurface->dwFlags & DDRAWISURF_DRIVERMANAGED) ||
00077                       !(pDestroySurface->lpDDSurface->dwFlags & DDRAWISURF_INVALID);
00078 
00079         /* Call win32k */
00080         Return = NtGdiDdDestroySurface((HANDLE)pDestroySurface->lpDDSurface->hDDSurface, RealDestroy);
00081     }
00082 
00083     return Return;
00084 }
00085 
00086 /*
00087  * @implemented
00088  *
00089  * DdFlip
00090  */
00091 DWORD
00092 WINAPI
00093 DdFlip(LPDDHAL_FLIPDATA Flip)
00094 {
00095     /* Note :
00096     * See http://msdn2.microsoft.com/en-us/library/ms794213.aspx and
00097     * http://msdn2.microsoft.com/en-us/library/ms792675.aspx
00098     */
00099 
00100     HANDLE hSurfaceCurrentLeft = NULL;
00101     HANDLE hSurfaceTargetLeft = NULL;
00102 
00103     /* Auto flip off or on */
00104     if (Flip->dwFlags & DDFLIP_STEREO )
00105     {
00106         if ( (Flip->lpSurfTargLeft) &&
00107                 (Flip->lpSurfCurrLeft))
00108         {
00109             /* Auto flip on */
00110             hSurfaceTargetLeft = (HANDLE) Flip->lpSurfTargLeft->hDDSurface;
00111             hSurfaceCurrentLeft = (HANDLE) Flip->lpSurfCurrLeft->hDDSurface;
00112         }
00113     }
00114 
00115     /* Call win32k */
00116     return NtGdiDdFlip( (HANDLE) Flip->lpSurfCurr->hDDSurface,
00117                         (HANDLE) Flip->lpSurfTarg->hDDSurface,
00118                         hSurfaceCurrentLeft,
00119                         hSurfaceTargetLeft,
00120                         (PDD_FLIPDATA) Flip);
00121 }
00122 
00123 /*
00124  * @implemented
00125  *
00126  * DdLock
00127  */
00128 DWORD
00129 WINAPI
00130 DdLock(LPDDHAL_LOCKDATA Lock)
00131 {
00132 
00133     /* Call win32k */
00134     return NtGdiDdLock((HANDLE)Lock->lpDDSurface->hDDSurface,
00135                        (PDD_LOCKDATA)Lock,
00136                        (HANDLE)Lock->lpDDSurface->hDC);
00137 }
00138 
00139 /*
00140  * @implemented
00141  *
00142  * DdUnlock
00143  */
00144 DWORD
00145 WINAPI
00146 DdUnlock(LPDDHAL_UNLOCKDATA Unlock)
00147 {
00148     /* Call win32k */
00149     return NtGdiDdUnlock((HANDLE)Unlock->lpDDSurface->hDDSurface,
00150                          (PDD_UNLOCKDATA)Unlock);
00151 }
00152 
00153 /*
00154  * @implemented
00155  *
00156  * DdGetBltStatus
00157  */
00158 DWORD
00159 WINAPI
00160 DdGetBltStatus(LPDDHAL_GETBLTSTATUSDATA GetBltStatus)
00161 {
00162     /* Call win32k */
00163     return NtGdiDdGetBltStatus((HANDLE)GetBltStatus->lpDDSurface->hDDSurface,
00164                                (PDD_GETBLTSTATUSDATA)GetBltStatus);
00165 }
00166 
00167 /*
00168  * @implemented
00169  *
00170  * DdGetBltStatus
00171  */
00172 DWORD
00173 WINAPI
00174 DdGetFlipStatus(LPDDHAL_GETFLIPSTATUSDATA GetFlipStatus)
00175 {
00176     /* Call win32k */
00177     return NtGdiDdGetFlipStatus((HANDLE)GetFlipStatus->lpDDSurface->hDDSurface,
00178                                 (PDD_GETFLIPSTATUSDATA)GetFlipStatus);
00179 }
00180 
00181 /*
00182  * @implemented
00183  *
00184  * DdUpdateOverlay
00185  */
00186 DWORD
00187 WINAPI
00188 DdUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA UpdateOverlay)
00189 {
00190 
00191     /* We have to handle this manually here */
00192     if (UpdateOverlay->dwFlags & DDOVER_KEYDEST)
00193     {
00194         /* Use the override */
00195         UpdateOverlay->dwFlags &= ~DDOVER_KEYDEST;
00196         UpdateOverlay->dwFlags |=  DDOVER_KEYDESTOVERRIDE;
00197 
00198         /* Set the overlay */
00199         UpdateOverlay->overlayFX.dckDestColorkey =
00200             UpdateOverlay->lpDDDestSurface->ddckCKDestOverlay;
00201     }
00202     if (UpdateOverlay->dwFlags & DDOVER_KEYSRC)
00203     {
00204         /* Use the override */
00205         UpdateOverlay->dwFlags &= ~DDOVER_KEYSRC;
00206         UpdateOverlay->dwFlags |=  DDOVER_KEYSRCOVERRIDE;
00207 
00208         /* Set the overlay */
00209         UpdateOverlay->overlayFX.dckSrcColorkey =
00210             UpdateOverlay->lpDDSrcSurface->ddckCKSrcOverlay;
00211     }
00212 
00213     /* Call win32k */
00214     return NtGdiDdUpdateOverlay((HANDLE)UpdateOverlay->lpDDDestSurface->hDDSurface,
00215                                 (HANDLE)UpdateOverlay->lpDDSrcSurface->hDDSurface,
00216                                 (PDD_UPDATEOVERLAYDATA)UpdateOverlay);
00217 }
00218 
00219 /*
00220  * @implemented
00221  *
00222  * DdSetOverlayPosition
00223  */
00224 DWORD
00225 WINAPI
00226 DdSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA SetOverlayPosition)
00227 {
00228     /* Call win32k */
00229     return NtGdiDdSetOverlayPosition( (HANDLE)SetOverlayPosition->lpDDSrcSurface->hDDSurface,
00230                                       (HANDLE)SetOverlayPosition->lpDDDestSurface->hDDSurface,
00231                                       (PDD_SETOVERLAYPOSITIONDATA) SetOverlayPosition);
00232 }
00233 
00234 /*
00235  * @implemented
00236  *
00237  * DdWaitForVerticalBlank
00238  */
00239 DWORD
00240 WINAPI
00241 DdWaitForVerticalBlank(LPDDHAL_WAITFORVERTICALBLANKDATA WaitForVerticalBlank)
00242 {
00243     /* Call win32k */
00244     return NtGdiDdWaitForVerticalBlank(GetDdHandle(
00245                                            WaitForVerticalBlank->lpDD->hDD),
00246                                        (PDD_WAITFORVERTICALBLANKDATA)
00247                                        WaitForVerticalBlank);
00248 }
00249 
00250 /*
00251  * @implemented
00252  *
00253  * DdCanCreateSurface
00254  */
00255 DWORD
00256 WINAPI
00257 DdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA CanCreateSurface)
00258 {
00259     /*
00260      * Note : This functions are basic same, in win32k
00261      * NtGdiDdCanCreateD3DBuffer and  NtGdiDdCanCreateSurface are mergs
00262      * toghter in win32k at end and retrurn same data, it is still sepreated
00263      * at user mode but in kmode it is not.
00264      */
00265 
00266     /* Call win32k */
00267     return NtGdiDdCanCreateSurface(GetDdHandle(CanCreateSurface->lpDD->hDD),
00268                                    (PDD_CANCREATESURFACEDATA)CanCreateSurface);
00269 }
00270 
00271 /*
00272  * @implemented
00273  *
00274  * DdCreateSurface
00275  */
00276 DWORD
00277 WINAPI
00278 DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
00279 {
00280     DWORD Return = DDHAL_DRIVER_NOTHANDLED;
00281     ULONG SurfaceCount = pCreateSurface->dwSCnt;
00282     DD_SURFACE_LOCAL DdSurfaceLocal;
00283     DD_SURFACE_MORE DdSurfaceMore;
00284     DD_SURFACE_GLOBAL DdSurfaceGlobal;
00285 
00286     HANDLE hPrevSurface, hSurface;
00287 
00288     PDD_SURFACE_LOCAL pDdSurfaceLocal = NULL;
00289     PDD_SURFACE_MORE pDdSurfaceMore = NULL;
00290     PDD_SURFACE_GLOBAL pDdSurfaceGlobal = NULL;
00291 
00292     PDD_SURFACE_LOCAL ptmpDdSurfaceLocal = NULL;
00293     PDD_SURFACE_MORE ptmpDdSurfaceMore = NULL;
00294     PDD_SURFACE_GLOBAL ptmpDdSurfaceGlobal = NULL;
00295     PHANDLE phSurface = NULL, puhSurface = NULL;
00296     ULONG i;
00297     LPDDSURFACEDESC pSurfaceDesc = NULL;
00298 
00299     /* TODO: Optimize speed. Most games/dx apps/programs do not want one surface, they want at least two.
00300      * So we need increase the stack to contain two surfaces instead of one. This will increase
00301      * the speed of the apps when allocating buffers. How to increase the surface stack space:
00302      * we need to create a struct for DD_SURFACE_LOCAL DdSurfaceLocal, DD_SURFACE_MORE DdSurfaceMore
00303      * DD_SURFACE_GLOBAL DdSurfaceGlobal, HANDLE hPrevSurface, hSurface like
00304      * struct { DD_SURFACE_LOCAL DdSurfaceLocal1, DD_SURFACE_LOCAL DdSurfaceLocal2 }
00305      * in a way that it may contain two surfaces, maybe even four. We need to watch what is most common before
00306      * we create the size. Activate this IF when you start doing the optimze and please also
00307      * take reports from users which value they got here.
00308      */
00309 #if 1
00310     {
00311         char buffer[1024];
00312         \
00313         sprintf ( buffer, "Function %s : Optimze max to %d Surface ? (%s:%d)\n", __FUNCTION__, (int)SurfaceCount,__FILE__,__LINE__ );
00314         OutputDebugStringA(buffer);
00315     }
00316 #endif
00317 
00318     /* Check how many surfaces there are */
00319     if (SurfaceCount != 1)
00320     {
00321         /* We got more than one surface, so we need to allocate memory for them */
00322         pDdSurfaceLocal = (PDD_SURFACE_LOCAL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_LOCAL) * SurfaceCount ));
00323         pDdSurfaceMore = (PDD_SURFACE_MORE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_MORE) * SurfaceCount ));
00324         pDdSurfaceGlobal = (PDD_SURFACE_GLOBAL)  HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_GLOBAL) * SurfaceCount ));
00325         phSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount ));
00326         puhSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount ));
00327 
00328         /* Check if we successfully allocated all memory we need */
00329         if ((pDdSurfaceLocal == NULL) || (pDdSurfaceMore == NULL) || (pDdSurfaceGlobal == NULL) || (phSurface == NULL) || (puhSurface == NULL))
00330         {
00331             pCreateSurface->ddRVal = DDERR_OUTOFMEMORY;
00332 
00333             if ( pDdSurfaceLocal != NULL )
00334             {
00335                 HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal);
00336             }
00337 
00338             if ( pDdSurfaceMore != NULL )
00339             {
00340                 HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
00341             }
00342 
00343             if ( pDdSurfaceGlobal != NULL )
00344             {
00345                 HeapFree(GetProcessHeap(), 0, pDdSurfaceGlobal);
00346             }
00347 
00348             if ( phSurface != NULL )
00349             {
00350                 HeapFree(GetProcessHeap(), 0, phSurface);
00351             }
00352 
00353             if ( puhSurface != NULL )
00354             {
00355                 HeapFree(GetProcessHeap(), 0, puhSurface);
00356             }
00357 
00358             return DDHAL_DRIVER_HANDLED;
00359         }
00360     }
00361     else
00362     {
00363         /* We'll use what we have on the stack */
00364         pDdSurfaceLocal = &DdSurfaceLocal;
00365         pDdSurfaceMore = &DdSurfaceMore;
00366         pDdSurfaceGlobal = &DdSurfaceGlobal;
00367         phSurface = &hPrevSurface;
00368         puhSurface = &hSurface;
00369 
00370         /* Clear the structures */
00371         RtlZeroMemory(&DdSurfaceLocal, sizeof(DdSurfaceLocal));
00372         RtlZeroMemory(&DdSurfaceGlobal, sizeof(DdSurfaceGlobal));
00373         RtlZeroMemory(&DdSurfaceMore, sizeof(DdSurfaceMore));
00374     }
00375 
00376     /* check if we got a surface or not */
00377     if (SurfaceCount!=0)
00378     {
00379         /* Loop for each surface */
00380         ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
00381         ptmpDdSurfaceLocal = pDdSurfaceLocal;
00382         ptmpDdSurfaceMore = pDdSurfaceMore;
00383         pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc;
00384 
00385         for (i = 0; i < SurfaceCount; i++)
00386         {
00387             LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
00388             LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl;
00389 
00390             phSurface[i] = (HANDLE)lcl->hDDSurface;
00391             ptmpDdSurfaceLocal->ddsCaps.dwCaps = lcl->ddsCaps.dwCaps;
00392 
00393             ptmpDdSurfaceLocal->dwFlags = (ptmpDdSurfaceLocal->dwFlags &
00394                                            (0xB0000000 | DDRAWISURF_INMASTERSPRITELIST |
00395                                             DDRAWISURF_HELCB | DDRAWISURF_FRONTBUFFER |
00396                                             DDRAWISURF_BACKBUFFER | DDRAWISURF_INVALID |
00397                                             DDRAWISURF_DCIBUSY | DDRAWISURF_DCILOCK)) |
00398                                           (lcl->dwFlags & DDRAWISURF_DRIVERMANAGED);
00399 
00400             ptmpDdSurfaceGlobal->wWidth = gpl->wWidth;
00401             ptmpDdSurfaceGlobal->wHeight = gpl->wHeight;
00402             ptmpDdSurfaceGlobal->lPitch = gpl->lPitch;
00403             ptmpDdSurfaceGlobal->fpVidMem = gpl->fpVidMem;
00404             ptmpDdSurfaceGlobal->dwBlockSizeX = gpl->dwBlockSizeX;
00405             ptmpDdSurfaceGlobal->dwBlockSizeY = gpl->dwBlockSizeY;
00406 
00407             if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT)
00408             {
00409                 RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface ,
00410                                &gpl->ddpfSurface,
00411                                sizeof(DDPIXELFORMAT));
00412 
00413                 ptmpDdSurfaceGlobal->ddpfSurface.dwSize = sizeof(DDPIXELFORMAT);
00414             }
00415             else
00416             {
00417                 RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface ,
00418                                &gpl->lpDD->vmiData.ddpfDisplay,
00419                                sizeof(DDPIXELFORMAT));
00420             }
00421 
00422             /* Note if lcl->lpSurfMore is NULL zero out
00423              * ptmpDdSurfaceMore->ddsCapsEx.dwCaps2,
00424              * dwCaps3, dwCaps4, ptmpDdSurfaceMore->dwSurfaceHandle
00425              */
00426             if (lcl->lpSurfMore)
00427             {
00428                 ptmpDdSurfaceMore->ddsCapsEx.dwCaps2 = lcl->lpSurfMore->ddsCapsEx.dwCaps2;
00429                 ptmpDdSurfaceMore->ddsCapsEx.dwCaps3 = lcl->lpSurfMore->ddsCapsEx.dwCaps3;
00430                 ptmpDdSurfaceMore->ddsCapsEx.dwCaps4 = lcl->lpSurfMore->ddsCapsEx.dwCaps4;
00431                 ptmpDdSurfaceMore->dwSurfaceHandle = lcl->lpSurfMore->dwSurfaceHandle;
00432             }
00433 
00434 
00435             /* count to next SurfaceCount */
00436             ptmpDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceGlobal)) + sizeof(DD_SURFACE_GLOBAL));
00437             ptmpDdSurfaceLocal = (PDD_SURFACE_LOCAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceLocal)) + sizeof(DD_SURFACE_LOCAL));
00438             ptmpDdSurfaceMore = (PDD_SURFACE_MORE) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceMore)) + sizeof(DD_SURFACE_MORE));
00439         }
00440     }
00441 
00442     /* Call win32k now */
00443     pCreateSurface->ddRVal = DDERR_GENERIC;
00444 
00445     Return = NtGdiDdCreateSurface(GetDdHandle(pCreateSurface->lpDD->hDD),
00446                                   (HANDLE *)phSurface,
00447                                   pSurfaceDesc,
00448                                   pDdSurfaceGlobal,
00449                                   pDdSurfaceLocal,
00450                                   pDdSurfaceMore,
00451                                   (PDD_CREATESURFACEDATA)pCreateSurface,
00452                                   puhSurface);
00453 
00454     if (SurfaceCount == 0)
00455     {
00456         pCreateSurface->ddRVal = DDERR_GENERIC;
00457     }
00458     else
00459     {
00460         ptmpDdSurfaceMore = pDdSurfaceMore;
00461         ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
00462         ptmpDdSurfaceLocal = pDdSurfaceLocal;
00463 
00464         for (i=0; i<SurfaceCount; i++)
00465         {
00466             LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
00467             LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl;
00468 
00469             gpl->lPitch = ptmpDdSurfaceGlobal->lPitch;
00470             gpl->fpVidMem = ptmpDdSurfaceGlobal->fpVidMem;
00471             gpl->dwBlockSizeX = ptmpDdSurfaceGlobal->dwBlockSizeX;
00472             gpl->dwBlockSizeY = ptmpDdSurfaceGlobal->dwBlockSizeY;
00473 
00474             if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT)
00475             {
00476                 RtlCopyMemory( &gpl->ddpfSurface, &ptmpDdSurfaceGlobal->ddpfSurface , sizeof(DDPIXELFORMAT));
00477             }
00478 
00479             if (pCreateSurface->ddRVal != DD_OK)
00480             {
00481                 gpl->fpVidMem = 0;
00482                 if (lcl->hDDSurface)
00483                 {
00484                     NtGdiDdDeleteSurfaceObject( (HANDLE)lcl->hDDSurface);
00485                 }
00486                 lcl->hDDSurface = 0;
00487             }
00488             else
00489             {
00490 
00491                 lcl->hDDSurface = (ULONG_PTR) puhSurface[i];
00492             }
00493 
00494             lcl->ddsCaps.dwCaps = ptmpDdSurfaceLocal->ddsCaps.dwCaps;
00495             if (lcl->lpSurfMore)
00496             {
00497                 lcl->lpSurfMore->ddsCapsEx.dwCaps2 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps2;
00498                 lcl->lpSurfMore->ddsCapsEx.dwCaps3 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps3;
00499                 lcl->lpSurfMore->ddsCapsEx.dwCaps4 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps4;
00500             }
00501 
00502             /* count to next SurfaceCount */
00503             ptmpDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceGlobal)) + sizeof(DD_SURFACE_GLOBAL));
00504             ptmpDdSurfaceLocal = (PDD_SURFACE_LOCAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceLocal)) + sizeof(DD_SURFACE_LOCAL));
00505             ptmpDdSurfaceMore = (PDD_SURFACE_MORE) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceMore)) + sizeof(DD_SURFACE_MORE));
00506         }
00507     }
00508 
00509     /* Check if we have to free all our local allocations */
00510     if (SurfaceCount > 1)
00511     {
00512         if ( pDdSurfaceLocal != NULL )
00513         {
00514             HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal);
00515         }
00516 
00517         if ( pDdSurfaceMore != NULL )
00518         {
00519             HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
00520         }
00521 
00522         if ( pDdSurfaceGlobal != NULL )
00523         {
00524             HeapFree(GetProcessHeap(), 0, pDdSurfaceGlobal);
00525         }
00526 
00527         if ( phSurface != NULL )
00528         {
00529             HeapFree(GetProcessHeap(), 0, phSurface);
00530         }
00531 
00532         if ( puhSurface != NULL )
00533         {
00534             HeapFree(GetProcessHeap(), 0, puhSurface);
00535         }
00536     }
00537 
00538     /* Return */
00539     return Return;
00540 }
00541 
00542 /*
00543  * @implemented
00544  *
00545  * DdSetColorKey
00546  */
00547 DWORD
00548 WINAPI
00549 DdSetColorKey(LPDDHAL_SETCOLORKEYDATA pSetColorKey)
00550 {
00551     /* Call win32k */
00552     return NtGdiDdSetColorKey((HANDLE)pSetColorKey->lpDDSurface->hDDSurface,
00553                               (PDD_SETCOLORKEYDATA)pSetColorKey);
00554 }
00555 
00556 /*
00557  * @implemented
00558  *
00559  * DdGetScanLine
00560  */
00561 DWORD
00562 WINAPI
00563 DdGetScanLine(LPDDHAL_GETSCANLINEDATA pGetScanLine)
00564 {
00565     /* Call win32k */
00566     return NtGdiDdGetScanLine(GetDdHandle(pGetScanLine->lpDD->hDD),
00567                               (PDD_GETSCANLINEDATA)pGetScanLine);
00568 }
00569 
00570 
00571 /*
00572  * @implemented
00573  *
00574  * DvpCreateVideoPort
00575  */
00576 BOOL
00577 WINAPI
00578 DvpCreateVideoPort(LPDDHAL_CREATEVPORTDATA pDvdCreatePort)
00579 {
00580     pDvdCreatePort->lpVideoPort->hDDVideoPort =
00581         NtGdiDvpCreateVideoPort(GetDdHandle(pDvdCreatePort->lpDD->lpGbl->hDD),
00582                                 (PDD_CREATEVPORTDATA) pDvdCreatePort);
00583 
00584     return TRUE;
00585 }
00586 
00587 /*
00588  * @implemented
00589  *
00590  * DvpCreateVideoPort
00591  */
00592 DWORD
00593 WINAPI
00594 DvpDestroyVideoPort(LPDDHAL_DESTROYVPORTDATA pDvdDestoryPort)
00595 {
00596     return NtGdiDvpDestroyVideoPort(pDvdDestoryPort->lpVideoPort->hDDVideoPort, (PDD_DESTROYVPORTDATA)pDvdDestoryPort);
00597 }
00598 
00599 /*
00600  * @implemented
00601  *
00602  * DvpCreateVideoPort
00603  */
00604 DWORD
00605 WINAPI
00606 DvpFlipVideoPort(LPDDHAL_FLIPVPORTDATA pDvdPortFlip)
00607 {
00608     return NtGdiDvpFlipVideoPort(pDvdPortFlip->lpVideoPort->hDDVideoPort,
00609                                  (HANDLE)pDvdPortFlip->lpSurfCurr->hDDSurface,
00610                                  (HANDLE)pDvdPortFlip->lpSurfTarg->hDDSurface,
00611                                  (PDD_FLIPVPORTDATA) pDvdPortFlip);
00612 }
00613 
00614 /*
00615  * @implemented
00616  *
00617  * DvpGetVideoPortBandwidth
00618  */
00619 DWORD
00620 WINAPI
00621 DvpGetVideoPortBandwidth(LPDDHAL_GETVPORTBANDWIDTHDATA pDvdPortBandWidth)
00622 {
00623     return NtGdiDvpGetVideoPortBandwidth(pDvdPortBandWidth->lpVideoPort->hDDVideoPort, (PDD_GETVPORTBANDWIDTHDATA)pDvdPortBandWidth);
00624 }
00625 
00626 /*
00627  * @implemented
00628  *
00629  * DvpColorControl
00630  */
00631 DWORD
00632 WINAPI
00633 DvpColorControl(LPDDHAL_VPORTCOLORDATA pDvdPortColorControl)
00634 {
00635     return NtGdiDvpColorControl(pDvdPortColorControl->lpVideoPort->hDDVideoPort, (PDD_VPORTCOLORDATA) pDvdPortColorControl);
00636 }
00637 
00638 /*
00639  * @implemented
00640  *
00641  * DvpGetVideoSignalStatus
00642  */
00643 DWORD
00644 WINAPI
00645 DvpGetVideoSignalStatus(LPDDHAL_GETVPORTSIGNALDATA pDvdPortVideoSignalStatus)
00646 {
00647     return NtGdiDvpGetVideoSignalStatus(pDvdPortVideoSignalStatus->lpVideoPort->hDDVideoPort, (PDD_GETVPORTSIGNALDATA) pDvdPortVideoSignalStatus);
00648 }
00649 
00650 /*
00651  * @implemented
00652  *
00653  * DvpGetVideoPortFlipStatus
00654  */
00655 DWORD
00656 WINAPI
00657 DvpGetVideoPortFlipStatus(LPDDHAL_GETVPORTFLIPSTATUSDATA pDvdPortVideoPortFlipStatus)
00658 {
00659     return NtGdiDvpGetVideoPortFlipStatus(GetDdHandle(pDvdPortVideoPortFlipStatus->lpDD->lpGbl->hDD), (PDD_GETVPORTFLIPSTATUSDATA) pDvdPortVideoPortFlipStatus);
00660 
00661 }
00662 
00663 /*
00664  * @implemented
00665  *
00666  * DvpCanCreateVideoPort
00667  */
00668 DWORD
00669 WINAPI
00670 DvpCanCreateVideoPort(LPDDHAL_CANCREATEVPORTDATA pDvdCanCreateVideoPort)
00671 {
00672     return NtGdiDvpCanCreateVideoPort(GetDdHandle(pDvdCanCreateVideoPort->lpDD->lpGbl->hDD), (PDD_CANCREATEVPORTDATA) pDvdCanCreateVideoPort);
00673 }
00674 /*
00675  * @implemented
00676  *
00677  * DvpWaitForVideoPortSync
00678  */
00679 DWORD
00680 WINAPI
00681 DvpWaitForVideoPortSync(LPDDHAL_WAITFORVPORTSYNCDATA pDvdWaitForVideoPortSync)
00682 {
00683     return NtGdiDvpWaitForVideoPortSync(pDvdWaitForVideoPortSync->lpVideoPort->hDDVideoPort,  (PDD_WAITFORVPORTSYNCDATA) pDvdWaitForVideoPortSync);
00684 }
00685 
00686 /*
00687  * @implemented
00688  *
00689  * DvpUpdateVideoPort
00690  */
00691 DWORD
00692 WINAPI
00693 DvpUpdateVideoPort(LPDDHAL_UPDATEVPORTDATA pDvdUpdateVideoPort)
00694 {
00695     /*
00696      * Windows XP limit to max 10 handles of videoport surface and Vbi
00697      * ReactOS doing same to keep compatible, if it is more that 10
00698      * videoport surface or vbi the stack will be curpted in windows xp
00699      * ReactOS safe guard againts that
00700      *
00701      */
00702 
00703     HANDLE phSurfaceVideo[10];
00704     HANDLE phSurfaceVbi[10];
00705 
00706     if (pDvdUpdateVideoPort->dwFlags != DDRAWI_VPORTSTOP)
00707     {
00708         DWORD dwNumAutoflip;
00709         DWORD dwNumVBIAutoflip;
00710 
00711         /* Take copy of lplpDDSurface for the handle value will be modify in dxg */
00712         dwNumAutoflip = pDvdUpdateVideoPort->dwNumAutoflip;
00713         if ((dwNumAutoflip == 0) &&
00714                 (pDvdUpdateVideoPort->lplpDDSurface == 0))
00715         {
00716             dwNumAutoflip++;
00717         }
00718 
00719         if (dwNumAutoflip != 0)
00720         {
00721             if (dwNumAutoflip>10)
00722             {
00723                 dwNumAutoflip = 10;
00724             }
00725             memcpy(phSurfaceVideo,pDvdUpdateVideoPort->lplpDDSurface,dwNumAutoflip*sizeof(HANDLE));
00726         }
00727 
00728         /* Take copy of lplpDDVBISurface for the handle value will be modify in dxg */
00729         dwNumVBIAutoflip = pDvdUpdateVideoPort->dwNumVBIAutoflip;
00730         if ( (dwNumVBIAutoflip == 0) &&
00731                 (pDvdUpdateVideoPort->lplpDDVBISurface == 0) )
00732         {
00733             dwNumVBIAutoflip++;
00734         }
00735 
00736         if (dwNumVBIAutoflip != 0)
00737         {
00738             if (dwNumVBIAutoflip>10)
00739             {
00740                 dwNumVBIAutoflip = 10;
00741             }
00742             memcpy(phSurfaceVbi,pDvdUpdateVideoPort->lplpDDVBISurface,dwNumVBIAutoflip*sizeof(HANDLE));
00743         }
00744     }
00745 
00746     /* Call Win32k */
00747     return NtGdiDvpUpdateVideoPort(pDvdUpdateVideoPort->lpVideoPort->hDDVideoPort,phSurfaceVideo,phSurfaceVbi, (PDD_UPDATEVPORTDATA)pDvdUpdateVideoPort);
00748 }
00749 
00750 /*
00751  * @implemented
00752  *
00753  * DvpWaitForVideoPortSync
00754  */
00755 DWORD
00756 WINAPI
00757 DvpGetVideoPortField(LPDDHAL_FLIPVPORTDATA pDvdGetVideoPortField)
00758 {
00759     return NtGdiDvpGetVideoPortField(pDvdGetVideoPortField->lpVideoPort->hDDVideoPort, (PDD_GETVPORTFIELDDATA)pDvdGetVideoPortField);
00760 }
00761 
00762 /*
00763  * @implemented
00764  *
00765  * DvpWaitForVideoPortSync
00766  */
00767 DWORD
00768 WINAPI
00769 DvpGetVideoPortInputFormats(LPDDHAL_GETVPORTINPUTFORMATDATA pDvdGetVideoPortInputFormat)
00770 {
00771     return NtGdiDvpGetVideoPortInputFormats(pDvdGetVideoPortInputFormat->lpVideoPort->hDDVideoPort, (PDD_GETVPORTINPUTFORMATDATA) pDvdGetVideoPortInputFormat);
00772 }
00773 
00774 /*
00775  * @implemented
00776  *
00777  * DvpGetVideoPortLine
00778  */
00779 DWORD
00780 WINAPI
00781 DvpGetVideoPortLine(LPDDHAL_GETVPORTLINEDATA pDvdGetVideoPortLine)
00782 {
00783     return NtGdiDvpGetVideoPortLine(pDvdGetVideoPortLine->lpVideoPort->hDDVideoPort, (PDD_GETVPORTLINEDATA)pDvdGetVideoPortLine);
00784 }
00785 
00786 /*
00787  * @implemented
00788  *
00789  * DvpGetVideoPortOutputFormats
00790  */
00791 DWORD
00792 WINAPI
00793 DvpGetVideoPortOutputFormats(LPDDHAL_GETVPORTLINEDATA pDvdGetVideoPortOutputFormat)
00794 {
00795     return NtGdiDvpGetVideoPortLine(pDvdGetVideoPortOutputFormat->lpVideoPort->hDDVideoPort, (PDD_GETVPORTLINEDATA)pDvdGetVideoPortOutputFormat);
00796 }
00797 
00798 /*
00799  * @implemented
00800  *
00801  * DvpGetVideoPortConnectInfo
00802  */
00803 DWORD
00804 WINAPI
00805 DvpGetVideoPortConnectInfo(LPDDHAL_GETVPORTCONNECTDATA pDvdGetVideoPortInfo)
00806 {
00807     return NtGdiDvpGetVideoPortConnectInfo( GetDdHandle( pDvdGetVideoPortInfo->lpDD->lpGbl->hDD) , (PDD_GETVPORTCONNECTDATA) pDvdGetVideoPortInfo);
00808 }
00809 
00810 /*
00811  * @implemented
00812  *
00813  * DdGetAvailDriverMemory
00814  */
00815 DWORD
00816 WINAPI
00817 DdGetAvailDriverMemory(LPDDHAL_GETAVAILDRIVERMEMORYDATA pDdGetAvailDriverMemory)
00818 {
00819     return NtGdiDdGetAvailDriverMemory(GetDdHandle( pDdGetAvailDriverMemory->lpDD->hDD), (PDD_GETAVAILDRIVERMEMORYDATA) pDdGetAvailDriverMemory);
00820 }
00821 
00822 /*
00823  * @implemented
00824  *
00825  * DdAlphaBlt
00826  */
00827 DWORD
00828 WINAPI
00829 DdAlphaBlt(LPDDHAL_BLTDATA pDdAlphaBlt)
00830 {
00831     HANDLE hDDSrcSurface = 0;
00832 
00833     if (pDdAlphaBlt->lpDDSrcSurface != 0)
00834     {
00835         hDDSrcSurface = (HANDLE) pDdAlphaBlt->lpDDSrcSurface->hDDSurface;
00836     }
00837 
00838     return NtGdiDdAlphaBlt((HANDLE)pDdAlphaBlt->lpDDDestSurface->hDDSurface, hDDSrcSurface, (PDD_BLTDATA)&pDdAlphaBlt);
00839 }
00840 
00841 /*
00842  * @implemented
00843  *
00844  * DdCreateSurfaceEx
00845  */
00846 DWORD
00847 WINAPI
00848 DdCreateSurfaceEx(LPDDHAL_CREATESURFACEEXDATA pDdCreateSurfaceEx)
00849 {
00850     pDdCreateSurfaceEx->ddRVal = NtGdiDdCreateSurfaceEx( GetDdHandle(pDdCreateSurfaceEx->lpDDLcl->lpGbl->hDD),
00851                                  (HANDLE)pDdCreateSurfaceEx->lpDDSLcl->hDDSurface,
00852                                  pDdCreateSurfaceEx->lpDDSLcl->lpSurfMore->dwSurfaceHandle);
00853     return TRUE;
00854 }
00855 
00856 /*
00857  * @implemented
00858  *
00859  * DdColorControl
00860  */
00861 DWORD
00862 WINAPI
00863 DdColorControl(LPDDHAL_COLORCONTROLDATA pDdColorControl)
00864 {
00865     return NtGdiDdColorControl( (HANDLE) pDdColorControl->lpDDSurface->hDDSurface, (PDD_COLORCONTROLDATA) &pDdColorControl);
00866 }
00867 
00868 /*
00869  * @implemented
00870  *
00871  * DdSetExclusiveMode
00872  */
00873 DWORD
00874 WINAPI
00875 DdSetExclusiveMode(LPDDHAL_SETEXCLUSIVEMODEDATA pDdSetExclusiveMode)
00876 {
00877     return NtGdiDdSetExclusiveMode( GetDdHandle(pDdSetExclusiveMode->lpDD->hDD), (PDD_SETEXCLUSIVEMODEDATA) &pDdSetExclusiveMode);
00878 }
00879 
00880 /*
00881  * @implemented
00882  *
00883  * DdFlipToGDISurface
00884  */
00885 DWORD
00886 WINAPI
00887 DdFlipToGDISurface(LPDDHAL_FLIPTOGDISURFACEDATA pDdFlipToGDISurface)
00888 {
00889     return NtGdiDdFlipToGDISurface( GetDdHandle(pDdFlipToGDISurface->lpDD->hDD), (PDD_FLIPTOGDISURFACEDATA) &pDdFlipToGDISurface);
00890 }
00891 
00892 /* TODO */
00893 DWORD
00894 WINAPI
00895 DdGetDriverInfo(LPDDHAL_GETDRIVERINFODATA pData)
00896 {
00897     DDHAL_GETDRIVERINFODATA pDrvInfoData;
00898     DWORD retValue = DDHAL_DRIVER_NOTHANDLED;
00899     HANDLE hDD;
00900 
00901     /* FIXME add SEH around this functions */
00902 
00903     RtlZeroMemory(&pDrvInfoData, sizeof (DDHAL_GETDRIVERINFODATA));
00904     RtlCopyMemory(&pDrvInfoData.guidInfo, &pData->guidInfo, sizeof(GUID));
00905 
00906     hDD = GetDdHandle(pData->dwContext);
00907 
00908     pDrvInfoData.dwSize = sizeof (DDHAL_GETDRIVERINFODATA);
00909     pDrvInfoData.ddRVal = DDERR_GENERIC;
00910     pDrvInfoData.dwContext = (ULONG_PTR)hDD;
00911 
00912 
00913     /* Videoport Callbacks check and setup for DirectX/ ReactX */
00914     if (IsEqualGUID(&pData->guidInfo, &GUID_VideoPortCallbacks))
00915     {
00916         DDHAL_DDVIDEOPORTCALLBACKS  pDvdPort;
00917         DDHAL_DDVIDEOPORTCALLBACKS* pUserDvdPort = (DDHAL_DDVIDEOPORTCALLBACKS *)pData->lpvData;
00918 
00919         /* Clear internal out buffer and set it up*/
00920         RtlZeroMemory(&pDvdPort, DDVIDEOPORTCALLBACKSSIZE);
00921         pDvdPort.dwSize = DDVIDEOPORTCALLBACKSSIZE;
00922 
00923         /* set up internal buffer */
00924         pDrvInfoData.lpvData = (PVOID)&pDvdPort;
00925         pDrvInfoData.dwExpectedSize = DDVIDEOPORTCALLBACKSSIZE ;
00926 
00927         /* Call win32k */
00928         retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData);
00929 
00930         /* Setup user out buffer and convert kmode callbacks to user mode */
00931         pUserDvdPort->dwSize = DDVIDEOPORTCALLBACKSSIZE;
00932         pUserDvdPort->dwFlags = pDrvInfoData.dwFlags =  0;
00933 
00934         pUserDvdPort->dwFlags = (pDrvInfoData.dwFlags & ~(DDHAL_VPORT32_CREATEVIDEOPORT | DDHAL_VPORT32_FLIP |
00935                                  DDHAL_VPORT32_DESTROY | DDHAL_VPORT32_UPDATE | DDHAL_VPORT32_WAITFORSYNC)) |
00936                                 (DDHAL_VPORT32_CREATEVIDEOPORT | DDHAL_VPORT32_FLIP |
00937                                  DDHAL_VPORT32_DESTROY | DDHAL_VPORT32_UPDATE);
00938 
00939         pData->dwActualSize = DDVIDEOPORTCALLBACKSSIZE;
00940         pUserDvdPort->CreateVideoPort = (LPDDHALVPORTCB_CREATEVIDEOPORT) DvpCreateVideoPort;
00941         pUserDvdPort->FlipVideoPort = (LPDDHALVPORTCB_FLIP) DvpFlipVideoPort;
00942         pUserDvdPort->DestroyVideoPort = (LPDDHALVPORTCB_DESTROYVPORT) DvpDestroyVideoPort;
00943         pUserDvdPort->UpdateVideoPort = (LPDDHALVPORTCB_UPDATE) DvpUpdateVideoPort;
00944 
00945         if (pDvdPort.CanCreateVideoPort)
00946         {
00947             pUserDvdPort->CanCreateVideoPort = (LPDDHALVPORTCB_CANCREATEVIDEOPORT) DvpCanCreateVideoPort;
00948         }
00949 
00950         if (pDvdPort.GetVideoPortBandwidth)
00951         {
00952             pUserDvdPort->GetVideoPortBandwidth = (LPDDHALVPORTCB_GETBANDWIDTH) DvpGetVideoPortBandwidth;
00953         }
00954 
00955         if (pDvdPort.GetVideoPortInputFormats)
00956         {
00957             pUserDvdPort->GetVideoPortInputFormats = (LPDDHALVPORTCB_GETINPUTFORMATS) DvpGetVideoPortInputFormats;
00958         }
00959 
00960         if (pDvdPort.GetVideoPortOutputFormats)
00961         {
00962             pUserDvdPort->GetVideoPortOutputFormats = (LPDDHALVPORTCB_GETOUTPUTFORMATS) DvpGetVideoPortOutputFormats;
00963         }
00964 
00965         if (pDvdPort.GetVideoPortField)
00966         {
00967             pUserDvdPort->GetVideoPortField = (LPDDHALVPORTCB_GETFIELD) DvpGetVideoPortField;
00968         }
00969 
00970         if (pDvdPort.GetVideoPortLine)
00971         {
00972             pUserDvdPort->GetVideoPortLine = (LPDDHALVPORTCB_GETLINE) DvpGetVideoPortLine;
00973         }
00974 
00975         if (pDvdPort.GetVideoPortConnectInfo)
00976         {
00977             pUserDvdPort->GetVideoPortConnectInfo = (LPDDHALVPORTCB_GETVPORTCONNECT) DvpGetVideoPortConnectInfo;
00978         }
00979 
00980         if (pDvdPort.GetVideoPortFlipStatus)
00981         {
00982             pUserDvdPort->GetVideoPortFlipStatus = (LPDDHALVPORTCB_GETFLIPSTATUS) DvpGetVideoPortFlipStatus;
00983         }
00984 
00985         if (pDvdPort.WaitForVideoPortSync)
00986         {
00987             pUserDvdPort->WaitForVideoPortSync = (LPDDHALVPORTCB_WAITFORSYNC) DvpWaitForVideoPortSync;
00988         }
00989 
00990         if (pDvdPort.GetVideoSignalStatus)
00991         {
00992             pUserDvdPort->GetVideoSignalStatus = (LPDDHALVPORTCB_GETSIGNALSTATUS) DvpGetVideoSignalStatus;
00993         }
00994 
00995         if (pDvdPort.ColorControl)
00996         {
00997             pUserDvdPort->ColorControl = (LPDDHALVPORTCB_COLORCONTROL) DvpColorControl;
00998         }
00999 
01000         /* Windows XP never repot back the true return value,
01001          *  it only report back if we have a driver or not
01002          *  ReactOS keep this behoir to be compatible with
01003          *  Windows XP
01004          */
01005         pData->ddRVal = retValue;
01006     }
01007 
01008     /* Color Control Callbacks check and setup for DirectX/ ReactX */
01009     if (IsEqualGUID(&pData->guidInfo, &GUID_ColorControlCallbacks))
01010     {
01011         DDHAL_DDCOLORCONTROLCALLBACKS  pColorControl;
01012         DDHAL_DDCOLORCONTROLCALLBACKS* pUserColorControl = (DDHAL_DDCOLORCONTROLCALLBACKS *)pData->lpvData;
01013 
01014         /* Clear internal out buffer and set it up*/
01015         RtlZeroMemory(&pColorControl, DDCOLORCONTROLCALLBACKSSIZE);
01016         pColorControl.dwSize = DDCOLORCONTROLCALLBACKSSIZE;
01017 
01018         /* set up internal buffer */
01019         pDrvInfoData.lpvData = (PVOID)&pColorControl;
01020         pDrvInfoData.dwExpectedSize = DDCOLORCONTROLCALLBACKSSIZE ;
01021 
01022         /* Call win32k */
01023         retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData);
01024 
01025         pData->dwActualSize = DDCOLORCONTROLCALLBACKSSIZE;
01026         pData->dwFlags = pDrvInfoData.dwFlags;
01027 
01028         pUserColorControl->dwSize = DDCOLORCONTROLCALLBACKSSIZE;
01029         pUserColorControl->dwFlags = pUserColorControl->dwFlags;
01030 
01031         if (pColorControl.ColorControl != NULL)
01032         {
01033             pUserColorControl->ColorControl = (LPDDHALCOLORCB_COLORCONTROL) DdColorControl;
01034         }
01035 
01036         /* Windows XP never repot back the true return value,
01037          *  it only report back if we have a driver or not
01038          *  ReactOS keep this behoir to be compatible with
01039          *  Windows XP
01040          */
01041         pData->ddRVal = retValue;
01042     }
01043 
01044     /* Misc Callbacks check and setup for DirectX/ ReactX */
01045     else if (IsEqualGUID(&pData->guidInfo, &GUID_MiscellaneousCallbacks))
01046     {
01047         DDHAL_DDMISCELLANEOUSCALLBACKS  pMisc;
01048         DDHAL_DDMISCELLANEOUSCALLBACKS* pUserMisc = (DDHAL_DDMISCELLANEOUSCALLBACKS *)pData->lpvData;
01049 
01050         /* Clear internal out buffer and set it up*/
01051         RtlZeroMemory(&pMisc, DDMISCELLANEOUSCALLBACKSSIZE);
01052         pMisc.dwSize = DDMISCELLANEOUSCALLBACKSSIZE;
01053 
01054         /* set up internal buffer */
01055         pDrvInfoData.lpvData = (PVOID)&pMisc;
01056         pDrvInfoData.dwExpectedSize = DDMISCELLANEOUSCALLBACKSSIZE ;
01057 
01058         /* Call win32k */
01059         retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData);
01060 
01061         pData->dwActualSize = DDMISCELLANEOUSCALLBACKSSIZE;
01062 
01063         /* Only one callbacks are supported */
01064         pUserMisc->dwFlags = pMisc.dwFlags & DDHAL_MISCCB32_GETAVAILDRIVERMEMORY;
01065         pUserMisc->GetAvailDriverMemory = (LPDDHAL_GETAVAILDRIVERMEMORY) DdGetAvailDriverMemory;
01066 
01067         /* This callbacks are only for win9x and theirfor it is not longer use in NT or ReactOS
01068          * pUserMisc->UpdateNonLocalHeap;
01069          * pUserMisc->GetHeapAlignment;
01070          * pUserMisc->GetSysmemBltStatus; */
01071 
01072         /* Windows XP never repot back the true return value,
01073          *  it only report back if we have a driver or not
01074          *  ReactOS keep this behoir to be compatible with
01075          *  Windows XP
01076          */
01077         pData->ddRVal = retValue;
01078     }
01079 
01080     /* Misc 2 Callbacks check and setup for DirectX/ ReactX */
01081     else if (IsEqualGUID(&pData->guidInfo, &GUID_Miscellaneous2Callbacks))
01082     {
01083         DDHAL_DDMISCELLANEOUS2CALLBACKS  pMisc;
01084         DDHAL_DDMISCELLANEOUS2CALLBACKS* pUserMisc = (DDHAL_DDMISCELLANEOUS2CALLBACKS *)pData->lpvData;
01085 
01086         /* Clear internal out buffer and set it up*/
01087         RtlZeroMemory(&pMisc, DDMISCELLANEOUS2CALLBACKSSIZE);
01088         pMisc.dwSize = DDMISCELLANEOUS2CALLBACKSSIZE;
01089 
01090         /* set up internal buffer */
01091         pDrvInfoData.lpvData = (PVOID)&pMisc;
01092         pDrvInfoData.dwExpectedSize = DDMISCELLANEOUS2CALLBACKSSIZE ;
01093 
01094         /* Call win32k */
01095         retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData);
01096 
01097         pData->dwActualSize = DDMISCELLANEOUS2CALLBACKSSIZE;
01098 
01099         pUserMisc->dwFlags = pMisc.dwFlags;
01100 
01101         /* This functions are not documneted in MSDN for this struct, here is directx/reactx alpha blend */
01102         if ( pMisc.Reserved )
01103         {
01104             pUserMisc->Reserved = (LPVOID) DdAlphaBlt;
01105         }
01106 
01107         if ( pMisc.CreateSurfaceEx )
01108         {
01109             pUserMisc->CreateSurfaceEx = (LPDDHAL_CREATESURFACEEX) DdCreateSurfaceEx;
01110         }
01111 
01112         if ( pMisc.GetDriverState )
01113         {
01114             pUserMisc->GetDriverState = (LPDDHAL_GETDRIVERSTATE) NtGdiDdGetDriverState;
01115         }
01116 
01117         /* NOTE : pUserMisc->DestroyDDLocal is outdated and are not beign tuch */
01118 
01119         /* Windows XP never repot back the true return value,
01120          *  it only report back if we have a driver or not
01121          *  ReactOS keep this behoir to be compatible with
01122          *  Windows XP
01123          */
01124         pData->ddRVal = retValue;
01125     }
01126 
01127     /* NT Callbacks check and setup for DirectX/ ReactX */
01128     else if (IsEqualGUID(&pData->guidInfo, &GUID_NTCallbacks))
01129     {
01130         /* MS does not have DHAL_* version of this callbacks
01131          * so we are force using PDD_* callbacks here
01132          */
01133         DD_NTCALLBACKS  pNtKernel;
01134         PDD_NTCALLBACKS pUserNtKernel = (PDD_NTCALLBACKS)pData->lpvData;
01135 
01136         /* Clear internal out buffer and set it up*/
01137         RtlZeroMemory(&pNtKernel, sizeof(DD_NTCALLBACKS));
01138         pNtKernel.dwSize = sizeof(DD_NTCALLBACKS);
01139 
01140         /* set up internal buffer */
01141         pDrvInfoData.lpvData = (PVOID)&pNtKernel;
01142         pDrvInfoData.dwExpectedSize = sizeof(DD_NTCALLBACKS) ;
01143 
01144         /* Call win32k */
01145         retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData);
01146 
01147         pData->dwActualSize = sizeof(DD_NTCALLBACKS);
01148 
01149         pUserNtKernel->dwSize = sizeof(DD_NTCALLBACKS);
01150         pUserNtKernel->dwFlags = pNtKernel.dwFlags;
01151         pUserNtKernel->FreeDriverMemory = 0;
01152 
01153         if (pNtKernel.SetExclusiveMode)
01154         {
01155             pUserNtKernel->SetExclusiveMode = (PDD_SETEXCLUSIVEMODE) DdSetExclusiveMode;
01156         }
01157 
01158         if (pNtKernel.FlipToGDISurface)
01159         {
01160             pUserNtKernel->FlipToGDISurface = (PDD_FLIPTOGDISURFACE) DdFlipToGDISurface;
01161         }
01162 
01163         /* Windows XP never repot back the true return value,
01164          *  it only report back if we have a driver or not
01165          *  ReactOS keep this behoir to be compatible with
01166          *  Windows XP
01167          */
01168         pData->ddRVal = retValue;
01169     }
01170 
01171     /* D3D Callbacks version 2 check and setup for DirectX/ ReactX */
01172     else if (IsEqualGUID(&pData->guidInfo, &GUID_D3DCallbacks2))
01173     {
01174         // FIXME GUID_D3DCallbacks2
01175     }
01176 
01177     /* D3D Callbacks version 3 check and setup for DirectX/ ReactX */
01178     else if (IsEqualGUID(&pData->guidInfo, &GUID_D3DCallbacks3))
01179     {
01180         // FIXME GUID_D3DCallbacks3
01181     }
01182 
01183     /* D3DParseUnknownCommand Callbacks check and setup for DirectX/ ReactX */
01184     else if (IsEqualGUID(&pData->guidInfo, &GUID_D3DParseUnknownCommandCallback))
01185     {
01186         // FIXME GUID_D3DParseUnknownCommandCallback
01187     }
01188 
01189     /* MotionComp Callbacks check and setup for DirectX/ ReactX */
01190     else if (IsEqualGUID(&pData->guidInfo, &GUID_MotionCompCallbacks))
01191     {
01192         // FIXME GUID_MotionCompCallbacks
01193     }
01194 
01195     /* FIXME VPE2 Callbacks check and setup for DirectX/ ReactX */
01196     //else if (IsEqualGUID(&pData->guidInfo, &GUID_VPE2Callbacks))
01197     //{
01198     // FIXME GUID_VPE2Callbacks
01199     //}
01200     else
01201     {
01202         /* set up internal buffer */
01203         pDrvInfoData.dwExpectedSize = pData->dwExpectedSize;
01204         pDrvInfoData.lpvData = pData->lpvData;
01205 
01206         /* We do not cover all callbacks for user mode, they are only cover by kmode */
01207         retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData);
01208 
01209         /* Setup return data */
01210         pData->dwActualSize = pDrvInfoData.dwActualSize;
01211         pData->lpvData = pDrvInfoData.lpvData;
01212         /* Windows XP never repot back the true return value,
01213          *  it only report back if we have a driver or not
01214          *  ReactOS keep this behoir to be compatible with
01215          *  Windows XP
01216          */
01217         pData->ddRVal = retValue;
01218     }
01219 
01220     return retValue;
01221 }
01222 
01223 
01224 /*
01225  * @implemented
01226  *
01227  * D3dContextCreate
01228  */
01229 BOOL
01230 WINAPI
01231 D3dContextCreate(LPD3DHAL_CONTEXTCREATEDATA pdcci)
01232 {
01233     HANDLE hSurfZ = NULL;
01234 
01235     if (pdcci->lpDDSZLcl)
01236     {
01237         hSurfZ = (HANDLE)pdcci->lpDDSZLcl->hDDSurface;
01238     }
01239 
01240     return  NtGdiD3dContextCreate(GetDdHandle(pdcci->lpDDLcl->hDD),
01241                                   (HANDLE)pdcci->lpDDSLcl->hDDSurface,
01242                                   hSurfZ,
01243                                   (D3DNTHAL_CONTEXTCREATEI *)pdcci);
01244 }
01245 
01246 /*
01247  * @implemented
01248  *
01249  * DdCanCreateD3DBuffer
01250  */
01251 DWORD
01252 WINAPI
01253 DdCanCreateD3DBuffer(LPDDHAL_CANCREATESURFACEDATA CanCreateD3DBuffer)
01254 {
01255     /*
01256      * Note : This functions are basic same, in win32k
01257      * NtGdiDdCanCreateD3DBuffer and  NtGdiDdCanCreateSurface are mergs
01258      * toghter in win32k at end and retrurn same data, it is still sepreated
01259      * at user mode but in kmode it is not.
01260      */
01261 
01262     /* Call win32k */
01263     return NtGdiDdCanCreateD3DBuffer(GetDdHandle(CanCreateD3DBuffer->lpDD->hDD),
01264                                      (PDD_CANCREATESURFACEDATA)CanCreateD3DBuffer);
01265 }
01266 
01267 
01268 /*
01269  * @implemented
01270  *
01271  * DdCreateD3DBuffer
01272  */
01273 DWORD
01274 WINAPI
01275 DdCreateD3DBuffer(LPDDHAL_CREATESURFACEDATA pCreateSurface)
01276 {
01277     HANDLE puhSurface = 0;
01278     DDRAWI_DDRAWSURFACE_GBL *pSurfGBL;
01279     DDRAWI_DDRAWSURFACE_LCL *pSurfLcl;
01280     DD_SURFACE_GLOBAL puSurfaceGlobalData;
01281     DD_SURFACE_MORE puSurfaceMoreData;
01282     DD_SURFACE_LOCAL puSurfaceLocalData;
01283     DWORD retValue;
01284 
01285     /* Zero all local memory pointer */
01286     RtlZeroMemory(&puSurfaceGlobalData, sizeof(DD_SURFACE_GLOBAL) );
01287     RtlZeroMemory(&puSurfaceMoreData, sizeof(DD_SURFACE_MORE) ) ;
01288     RtlZeroMemory(&puSurfaceLocalData, sizeof(DD_SURFACE_LOCAL) );
01289 
01290     pCreateSurface->dwSCnt = 1;
01291     pSurfLcl = pCreateSurface->lplpSList[0];
01292     pSurfGBL = pSurfLcl->lpGbl;
01293 
01294     /* Convert DDRAWI_DDRAWSURFACE_GBL to DD_SURFACE_GLOBAL */
01295     puSurfaceGlobalData.wWidth = pSurfGBL->wWidth;
01296     puSurfaceGlobalData.wHeight = pSurfGBL->wHeight;
01297     puSurfaceGlobalData.dwLinearSize = pSurfGBL->dwLinearSize;
01298     puSurfaceGlobalData.fpVidMem = pSurfGBL->fpVidMem;
01299     puSurfaceGlobalData.dwBlockSizeX = pSurfGBL->dwBlockSizeX;
01300     puSurfaceGlobalData.dwBlockSizeY = pSurfGBL->dwBlockSizeY;
01301 
01302     /* Convert DDRAWI_DDRAWSURFACE_MORE to DD_SURFACE_MORE */
01303     puSurfaceMoreData.dwSurfaceHandle = pSurfLcl->lpSurfMore->dwSurfaceHandle;
01304     puSurfaceMoreData.ddsCapsEx.dwCaps2 = pSurfLcl->lpSurfMore->ddsCapsEx.dwCaps2;
01305     puSurfaceMoreData.ddsCapsEx.dwCaps3 = pSurfLcl->lpSurfMore->ddsCapsEx.dwCaps3;
01306     puSurfaceMoreData.ddsCapsEx.dwCaps4 = pSurfLcl->lpSurfMore->ddsCapsEx.dwCaps4;
01307 
01308     /* Convert DDRAWI_DDRAWSURFACE_LCL to DD_SURFACE_LOCAL */
01309     puSurfaceLocalData.dwFlags = pSurfLcl->dwFlags;
01310     puSurfaceLocalData.ddsCaps.dwCaps = pSurfLcl->ddsCaps.dwCaps;
01311 
01312     /* Call win32k */
01313     retValue = NtGdiDdCreateD3DBuffer( GetDdHandle(pCreateSurface->lpDD->hDD),
01314                                        (HANDLE*)&pSurfLcl->hDDSurface,
01315                                        pCreateSurface->lpDDSurfaceDesc,
01316                                        &puSurfaceGlobalData,
01317                                        &puSurfaceLocalData,
01318                                        &puSurfaceMoreData,
01319                                        (DD_CREATESURFACEDATA *) pCreateSurface,
01320                                        &puhSurface);
01321 
01322     /* Setup surface handle if we got one back  */
01323     if ( puhSurface != NULL )
01324     {
01325         pCreateSurface->lplpSList[0]->hDDSurface = (ULONG_PTR)puhSurface;
01326     }
01327 
01328     /* Convert DD_SURFACE_GLOBAL to DDRAWI_DDRAWSURFACE_GBL */
01329     pSurfGBL->dwLinearSize = puSurfaceGlobalData.dwLinearSize;
01330     pSurfGBL->fpVidMem = puSurfaceGlobalData.fpVidMem;
01331     pSurfGBL->dwBlockSizeX = puSurfaceGlobalData.dwBlockSizeX;
01332     pSurfGBL->dwBlockSizeY = puSurfaceGlobalData.dwBlockSizeY;
01333 
01334     return retValue;
01335 }
01336 
01337 /*
01338  * @implemented
01339  *
01340  * DdDestroyD3DBuffer
01341  */
01342 DWORD
01343 WINAPI
01344 DdDestroyD3DBuffer(LPDDHAL_DESTROYSURFACEDATA pDestroySurface)
01345 {
01346     DWORD retValue = 0;
01347     if ( pDestroySurface->lpDDSurface->hDDSurface)
01348     {
01349         /* Call win32k */
01350         retValue = NtGdiDdDestroyD3DBuffer((HANDLE)pDestroySurface->lpDDSurface->hDDSurface);
01351     }
01352 
01353     return retValue;
01354 }
01355 
01356 /*
01357  * @implemented
01358  *
01359  * DdLockD3D
01360  */
01361 DWORD
01362 WINAPI
01363 DdLockD3D(LPDDHAL_LOCKDATA Lock)
01364 {
01365 
01366     /* Call win32k */
01367     return NtGdiDdLockD3D((HANDLE)Lock->lpDDSurface->hDDSurface, (PDD_LOCKDATA)Lock);
01368 }
01369 
01370 /*
01371  * @implemented
01372  *
01373  * DdUnlockD3D
01374  */
01375 DWORD
01376 WINAPI
01377 DdUnlockD3D(LPDDHAL_UNLOCKDATA Unlock)
01378 {
01379     /* Call win32k */
01380     return NtGdiDdUnlock((HANDLE)Unlock->lpDDSurface->hDDSurface,
01381                          (PDD_UNLOCKDATA)Unlock);
01382 }
01383 
01384 
01385 /* PRIVATE FUNCTIONS *********************************************************/
01386 
01387 BOOL
01388 WINAPI
01389 bDDCreateSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface,
01390                  BOOL bComplete)
01391 {
01392     DD_SURFACE_LOCAL SurfaceLocal;
01393     DD_SURFACE_GLOBAL SurfaceGlobal;
01394     DD_SURFACE_MORE SurfaceMore;
01395 
01396     /* Zero struct */
01397     RtlZeroMemory(&SurfaceLocal, sizeof(DD_SURFACE_LOCAL));
01398     RtlZeroMemory(&SurfaceGlobal, sizeof(DD_SURFACE_GLOBAL));
01399     RtlZeroMemory(&SurfaceMore, sizeof(DD_SURFACE_MORE));
01400 
01401     /* Set up SurfaceLocal struct */
01402     SurfaceLocal.ddsCaps.dwCaps = pSurface->ddsCaps.dwCaps;
01403     SurfaceLocal.dwFlags = pSurface->dwFlags;
01404 
01405     /* Set up SurfaceMore struct */
01406     RtlMoveMemory(&SurfaceMore.ddsCapsEx,
01407                   &pSurface->ddckCKDestBlt,
01408                   sizeof(DDSCAPSEX));
01409     SurfaceMore.dwSurfaceHandle = (DWORD)pSurface->dbnOverlayNode.object_int->lpVtbl;
01410 
01411     /* Set up SurfaceGlobal struct */
01412     SurfaceGlobal.fpVidMem = pSurface->lpGbl->fpVidMem;
01413     SurfaceGlobal.dwLinearSize = pSurface->lpGbl->dwLinearSize;
01414     SurfaceGlobal.wHeight = pSurface->lpGbl->wHeight;
01415     SurfaceGlobal.wWidth = pSurface->lpGbl->wWidth;
01416 
01417     /* Check if we have a pixel format */
01418     if (pSurface->dwFlags & DDSD_PIXELFORMAT)
01419     {
01420         /* Use global one */
01421         SurfaceGlobal.ddpfSurface = pSurface->lpGbl->lpDD->vmiData.ddpfDisplay;
01422         SurfaceGlobal.ddpfSurface.dwSize = sizeof(DDPIXELFORMAT);
01423     }
01424     else
01425     {
01426         /* Use local one */
01427         SurfaceGlobal.ddpfSurface = pSurface->lpGbl->lpDD->vmiData.ddpfDisplay;
01428     }
01429 
01430     /* Create the object */
01431     pSurface->hDDSurface = (DWORD)NtGdiDdCreateSurfaceObject(GetDdHandle(pSurface->lpGbl->lpDD->hDD),
01432                            (HANDLE)pSurface->hDDSurface,
01433                            &SurfaceLocal,
01434                            &SurfaceMore,
01435                            &SurfaceGlobal,
01436                            bComplete);
01437 
01438     /* Return status */
01439     if (pSurface->hDDSurface) return TRUE;
01440     return FALSE;
01441 }
01442 
01443 /* PUBLIC FUNCTIONS **********************************************************/
01444 
01445 /*
01446  * @implemented
01447  *
01448  * GDIEntry 1
01449  */
01450 BOOL
01451 WINAPI
01452 DdCreateDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal,
01453                          HDC hdc)
01454 {
01455     BOOL Return = FALSE;
01456 
01457     /* Check if the global hDC (hdc == 0) is being used */
01458     if (!hdc)
01459     {
01460         /* We'll only allow this if the global object doesn't exist yet */
01461         if (!ghDirectDraw)
01462         {
01463             /* Create the DC */
01464             if ((hdc = CreateDCW(L"Display", NULL, NULL, NULL)))
01465             {
01466                 /* Create the DDraw Object */
01467                 ghDirectDraw = NtGdiDdCreateDirectDrawObject(hdc);
01468 
01469                 /* Delete our DC */
01470                 DeleteDC(hdc);
01471             }
01472         }
01473 
01474         /* If we created the object, or had one ...*/
01475         if (ghDirectDraw)
01476         {
01477             /* Increase count and set success */
01478             gcDirectDraw++;
01479             Return = TRUE;
01480         }
01481 
01482         /* Zero the handle */
01483         pDirectDrawGlobal->hDD = 0;
01484     }
01485     else
01486     {
01487         /* Using the per-process object, so create it */
01488         pDirectDrawGlobal->hDD = (ULONG_PTR)NtGdiDdCreateDirectDrawObject(hdc);
01489 
01490         /* Set the return value */
01491         Return = pDirectDrawGlobal->hDD ? TRUE : FALSE;
01492     }
01493 
01494     /* Return to caller */
01495     return Return;
01496 }
01497 
01498 /*
01499  * @implemented
01500  *
01501  * GDIEntry 2
01502  */
01503 BOOL
01504 WINAPI
01505 DdQueryDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal,
01506                         LPDDHALINFO pHalInfo,
01507                         LPDDHAL_DDCALLBACKS pDDCallbacks,
01508                         LPDDHAL_DDSURFACECALLBACKS pDDSurfaceCallbacks,
01509                         LPDDHAL_DDPALETTECALLBACKS pDDPaletteCallbacks,
01510                         LPD3DHAL_CALLBACKS pD3dCallbacks,
01511                         LPD3DHAL_GLOBALDRIVERDATA pD3dDriverData,
01512                         LPDDHAL_DDEXEBUFCALLBACKS pD3dBufferCallbacks,
01513                         LPDDSURFACEDESC pD3dTextureFormats,
01514                         LPDWORD pdwFourCC,
01515                         LPVIDMEM pvmList)
01516 {
01517     PVIDEOMEMORY VidMemList = NULL;
01518     DD_HALINFO HalInfo;
01519     D3DNTHAL_CALLBACKS D3dCallbacks;
01520     D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;
01521     DD_D3DBUFCALLBACKS D3dBufferCallbacks;
01522     DWORD CallbackFlags[3];
01523     DWORD dwNumHeaps=0, FourCCs=0;
01524     DWORD Flags;
01525     BOOL retVal = TRUE;
01526 
01527     /* Clear the structures */
01528     RtlZeroMemory(&HalInfo, sizeof(DD_HALINFO));
01529     RtlZeroMemory(&D3dCallbacks, sizeof(D3DNTHAL_CALLBACKS));
01530     RtlZeroMemory(&D3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
01531     RtlZeroMemory(&D3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS));
01532     RtlZeroMemory(CallbackFlags, sizeof(DWORD)*3);
01533 
01534     /* Note : XP always alloc 24*sizeof(VIDEOMEMORY) of pvmlist so we change it to it */
01535     if ( (pvmList != NULL) &&
01536             (pHalInfo->vmiData.dwNumHeaps != 0) )
01537     {
01538         VidMemList = (PVIDEOMEMORY) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(VIDEOMEMORY) * 24 ) * pHalInfo->vmiData.dwNumHeaps);
01539     }
01540 
01541 
01542     /* Do the query */
01543     if (!NtGdiDdQueryDirectDrawObject(GetDdHandle(pDirectDrawGlobal->hDD),
01544                                       &HalInfo,
01545                                       CallbackFlags,
01546                                       &D3dCallbacks,
01547                                       &D3dDriverData,
01548                                       &D3dBufferCallbacks,
01549                                       pD3dTextureFormats,
01550                                       &dwNumHeaps,
01551                                       VidMemList,
01552                                       &FourCCs,
01553                                       pdwFourCC))
01554     {
01555         /* We failed, free the memory and return */
01556         retVal = FALSE;
01557         goto cleanup;
01558     }
01559 
01560     /* Clear the incoming pointer */
01561     RtlZeroMemory(pHalInfo, sizeof(DDHALINFO));
01562 
01563     /* Convert all the data */
01564     pHalInfo->dwSize = sizeof(DDHALINFO);
01565     pHalInfo->lpDDCallbacks = pDDCallbacks;
01566     pHalInfo->lpDDSurfaceCallbacks = pDDSurfaceCallbacks;
01567     pHalInfo->lpDDPaletteCallbacks = pDDPaletteCallbacks;
01568 
01569     /* Check for NT5+ D3D Data */
01570     if ( (D3dCallbacks.dwSize != 0) &&
01571             (D3dDriverData.dwSize != 0) )
01572     {
01573         /* Write these down */
01574         pHalInfo->lpD3DGlobalDriverData = (ULONG_PTR)pD3dDriverData;
01575         pHalInfo->lpD3DHALCallbacks = (ULONG_PTR)pD3dCallbacks;
01576 
01577         /* Check for Buffer Callbacks */
01578         if (D3dBufferCallbacks.dwSize)
01579         {
01580             /* Write this one too */
01581             pHalInfo->lpDDExeBufCallbacks = pD3dBufferCallbacks;
01582         }
01583     }
01584 
01585     /* Continue converting the rest */
01586     pHalInfo->vmiData.dwFlags = HalInfo.vmiData.dwFlags;
01587     pHalInfo->vmiData.dwDisplayWidth = HalInfo.vmiData.dwDisplayWidth;
01588     pHalInfo->vmiData.dwDisplayHeight = HalInfo.vmiData.dwDisplayHeight;
01589     pHalInfo->vmiData.lDisplayPitch = HalInfo.vmiData.lDisplayPitch;
01590     pHalInfo->vmiData.fpPrimary = 0;
01591 
01592     RtlCopyMemory( &pHalInfo->vmiData.ddpfDisplay,
01593                    &HalInfo.vmiData.ddpfDisplay,
01594                    sizeof(DDPIXELFORMAT));
01595 
01596     pHalInfo->vmiData.dwOffscreenAlign = HalInfo.vmiData.dwOffscreenAlign;
01597     pHalInfo->vmiData.dwOverlayAlign = HalInfo.vmiData.dwOverlayAlign;
01598     pHalInfo->vmiData.dwTextureAlign = HalInfo.vmiData.dwTextureAlign;
01599     pHalInfo->vmiData.dwZBufferAlign = HalInfo.vmiData.dwZBufferAlign;
01600     pHalInfo->vmiData.dwAlphaAlign = HalInfo.vmiData.dwAlphaAlign;
01601 
01602     pHalInfo->vmiData.dwNumHeaps = dwNumHeaps;
01603     pHalInfo->vmiData.pvmList = pvmList;
01604 
01605     RtlCopyMemory( &pHalInfo->ddCaps,
01606                    &HalInfo.ddCaps,
01607                    sizeof(DDCORECAPS ));
01608 
01609     pHalInfo->ddCaps.dwNumFourCCCodes = FourCCs;
01610     pHalInfo->lpdwFourCC = pdwFourCC;
01611 
01612     /* always force rope 0x1000 for hal it mean only source copy is supported */
01613     pHalInfo->ddCaps.dwRops[6] = 0x1000;
01614 
01615     /* Set the HAL flags what ReactX got from the driver
01616      * Windows XP force setting DDHALINFO_GETDRIVERINFOSET if the driver does not set it
01617      * and ReactX doing same to keep compatible with drivers, but the driver are
01618      * force support DdGetDriverInfo acoriding MSDN but it seam some driver do not set
01619      * this flag even it is being supported. that is mean. It is small hack to keep
01620      * bad driver working, that trust this is always being setting by it self at end
01621      */
01622     pHalInfo->dwFlags = (HalInfo.dwFlags & ~DDHALINFO_GETDRIVERINFOSET) | DDHALINFO_GETDRIVERINFOSET;
01623     pHalInfo->GetDriverInfo = (LPDDHAL_GETDRIVERINFO) DdGetDriverInfo;
01624 
01625     /* Now check if we got any DD callbacks */
01626     if (pDDCallbacks)
01627     {
01628         /* Zero the structure */
01629         RtlZeroMemory(pDDCallbacks, sizeof(DDHAL_DDCALLBACKS));
01630         pDDCallbacks->dwSize = sizeof(DDHAL_DDCALLBACKS);
01631 
01632         /* Set the flags for this structure
01633          * Windows XP force setting DDHAL_CB32_CREATESURFACE if the driver does not set it
01634          * and ReactX doing same to keep compatible with drivers, but the driver are
01635          * force support pDDCallbacks acoriding MSDN but it seam some driver do not set
01636          * this flag even it is being supported. that is mean. It is small hack to keep
01637          * bad driver working, that trust this is always being setting by it self at end
01638         */
01639         Flags = (CallbackFlags[0] & ~DDHAL_CB32_CREATESURFACE) | DDHAL_CB32_CREATESURFACE;
01640         pDDCallbacks->dwFlags = Flags;
01641 
01642         /* Write the always-on functions */
01643         pDDCallbacks->CreateSurface = DdCreateSurface;
01644 
01645         /* Now write the pointers, if applicable */
01646         if (Flags & DDHAL_CB32_WAITFORVERTICALBLANK)
01647         {
01648             pDDCallbacks->WaitForVerticalBlank = DdWaitForVerticalBlank;
01649         }
01650         if (Flags & DDHAL_CB32_CANCREATESURFACE)
01651         {
01652             pDDCallbacks->CanCreateSurface = DdCanCreateSurface;
01653         }
01654         if (Flags & DDHAL_CB32_GETSCANLINE)
01655         {
01656             pDDCallbacks->GetScanLine = DdGetScanLine;
01657         }
01658     }
01659 
01660     /* Check for DD Surface Callbacks */
01661     if (pDDSurfaceCallbacks)
01662     {
01663         /* Zero the structures */
01664         RtlZeroMemory(pDDSurfaceCallbacks, sizeof(DDHAL_DDSURFACECALLBACKS));
01665         pDDSurfaceCallbacks->dwSize  = sizeof(DDHAL_DDSURFACECALLBACKS);
01666 
01667         /* Set the flags for this structure
01668          * Windows XP force setting DDHAL_SURFCB32_LOCK, DDHAL_SURFCB32_UNLOCK,
01669          * DDHAL_SURFCB32_SETCOLORKEY, DDHAL_SURFCB32_DESTROYSURFACE if the driver
01670          * does not set it and ReactX doing same to keep compatible with drivers,
01671          * but the driver are force support pDDSurfaceCallbacks acoriding MSDN but it seam
01672          * some driver do not set this flag even it is being supported. that is mean.
01673          * It is small hack to keep bad driver working, that trust this is always being
01674          * setting by it self at end
01675          */
01676 
01677         Flags = (CallbackFlags[1] & ~(DDHAL_SURFCB32_LOCK | DDHAL_SURFCB32_UNLOCK |
01678                                       DDHAL_SURFCB32_SETCOLORKEY | DDHAL_SURFCB32_DESTROYSURFACE)) |
01679                 (DDHAL_SURFCB32_LOCK | DDHAL_SURFCB32_UNLOCK |
01680                  DDHAL_SURFCB32_SETCOLORKEY | DDHAL_SURFCB32_DESTROYSURFACE);
01681 
01682         pDDSurfaceCallbacks->dwFlags = Flags;
01683 
01684         /* Write the always-on functions */
01685         pDDSurfaceCallbacks->Lock = DdLock;
01686         pDDSurfaceCallbacks->Unlock = DdUnlock;
01687         pDDSurfaceCallbacks->SetColorKey = DdSetColorKey;
01688         pDDSurfaceCallbacks->DestroySurface = DdDestroySurface;
01689 
01690         /* Write the optional ones */
01691         if (Flags & DDHAL_SURFCB32_FLIP)
01692         {
01693             pDDSurfaceCallbacks->Flip = DdFlip;
01694         }
01695         if (Flags & DDHAL_SURFCB32_BLT)
01696         {
01697             pDDSurfaceCallbacks->Blt = DdBlt;
01698         }
01699         if (Flags & DDHAL_SURFCB32_GETBLTSTATUS)
01700         {
01701             pDDSurfaceCallbacks->GetBltStatus = DdGetBltStatus;
01702         }
01703         if (Flags & DDHAL_SURFCB32_GETFLIPSTATUS)
01704         {
01705             pDDSurfaceCallbacks->GetFlipStatus = DdGetFlipStatus;
01706         }
01707         if (Flags & DDHAL_SURFCB32_UPDATEOVERLAY)
01708         {
01709             pDDSurfaceCallbacks->UpdateOverlay = DdUpdateOverlay;
01710         }
01711         if (Flags & DDHAL_SURFCB32_SETOVERLAYPOSITION)
01712         {
01713             pDDSurfaceCallbacks->SetOverlayPosition = DdSetOverlayPosition;
01714         }
01715         if (Flags & DDHAL_SURFCB32_ADDATTACHEDSURFACE)
01716         {
01717             pDDSurfaceCallbacks->AddAttachedSurface = DdAddAttachedSurface;
01718         }
01719     }
01720 
01721     /* Check for DD Palette Callbacks, This interface are dead for user mode,
01722      * only what it can support are being report back.
01723      */
01724     if (pDDPaletteCallbacks)
01725     {
01726         /* Zero the struct */
01727         RtlZeroMemory(pDDPaletteCallbacks, sizeof(DDHAL_DDPALETTECALLBACKS));
01728 
01729         /* Write the header */
01730         pDDPaletteCallbacks->dwSize  = sizeof(DDHAL_DDPALETTECALLBACKS);
01731         pDDPaletteCallbacks->dwFlags = CallbackFlags[2];
01732     }
01733 
01734     if (pD3dCallbacks)
01735     {
01736         /* Zero the struct */
01737         RtlZeroMemory(pD3dCallbacks, sizeof(DDHAL_DDEXEBUFCALLBACKS));
01738 
01739         /* Check if we have one */
01740         if (D3dCallbacks.dwSize)
01741         {
01742             /* Write the header */
01743             pD3dCallbacks->dwSize = sizeof(DDHAL_DDEXEBUFCALLBACKS);
01744 
01745             /* Now check for each callback */
01746             if (D3dCallbacks.ContextCreate)
01747             {
01748                 pD3dCallbacks->ContextCreate = (LPD3DHAL_CONTEXTCREATECB) D3dContextCreate;
01749             }
01750             if (D3dCallbacks.ContextDestroy)
01751             {
01752                 pD3dCallbacks->ContextDestroy = (LPD3DHAL_CONTEXTDESTROYCB) NtGdiD3dContextDestroy;
01753             }
01754             if (D3dCallbacks.ContextDestroyAll)
01755             {
01756                 pD3dCallbacks->ContextDestroyAll = (LPD3DHAL_CONTEXTDESTROYALLCB) NtGdiD3dContextDestroyAll;
01757             }
01758         }
01759     }
01760 
01761     /* Check for D3D Driver Data */
01762     if (pD3dDriverData)
01763     {
01764         /* Copy the struct */
01765         RtlMoveMemory(pD3dDriverData, &D3dDriverData, sizeof(D3DHAL_GLOBALDRIVERDATA));
01766 
01767         /* Write the pointer to the texture formats */
01768         pD3dDriverData->lpTextureFormats = pD3dTextureFormats;
01769     }
01770 
01771     /* Check for D3D Buffer Callbacks */
01772     if (pD3dBufferCallbacks)
01773     {
01774         /* Zero the struct */
01775         RtlZeroMemory(pD3dBufferCallbacks, sizeof(DDHAL_DDEXEBUFCALLBACKS));
01776 
01777         if ( D3dBufferCallbacks.dwSize)
01778         {
01779             pD3dBufferCallbacks->dwSize = D3dBufferCallbacks.dwSize;
01780 
01781             pD3dBufferCallbacks->dwFlags = D3dBufferCallbacks.dwFlags;
01782             if ( D3dBufferCallbacks.CanCreateD3DBuffer)
01783             {
01784                 pD3dBufferCallbacks->CanCreateExecuteBuffer = (LPDDHALEXEBUFCB_CANCREATEEXEBUF)DdCanCreateD3DBuffer;
01785             }
01786 
01787             if (D3dBufferCallbacks.CreateD3DBuffer)
01788             {
01789                 pD3dBufferCallbacks->CreateExecuteBuffer = (LPDDHALEXEBUFCB_CREATEEXEBUF) DdCreateD3DBuffer;
01790             }
01791 
01792             if ( D3dBufferCallbacks.DestroyD3DBuffer )
01793             {
01794                 pD3dBufferCallbacks->DestroyExecuteBuffer = (LPDDHALEXEBUFCB_DESTROYEXEBUF) DdDestroyD3DBuffer;
01795             }
01796 
01797             if ( D3dBufferCallbacks.LockD3DBuffer )
01798             {
01799                 pD3dBufferCallbacks->LockExecuteBuffer = (LPDDHALEXEBUFCB_LOCKEXEBUF) DdLockD3D;
01800             }
01801 
01802             if ( D3dBufferCallbacks.UnlockD3DBuffer )
01803             {
01804                 pD3dBufferCallbacks->UnlockExecuteBuffer = (LPDDHALEXEBUFCB_UNLOCKEXEBUF) DdUnlockD3D;
01805             }
01806 
01807         }
01808     }
01809 
01810     /* FIXME VidMemList */
01811 
01812 cleanup:
01813     if (VidMemList)
01814     {
01815         HeapFree(GetProcessHeap(), 0, VidMemList);
01816     }
01817 
01818     return retVal;
01819 }
01820 
01821 /*
01822  * @implemented
01823  *
01824  * GDIEntry 3
01825  */
01826 BOOL
01827 WINAPI
01828 DdDeleteDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal)
01829 {
01830     BOOL Return = FALSE;
01831 
01832     /* If this is the global object */
01833     if(pDirectDrawGlobal->hDD)
01834     {
01835         /* Free it */
01836         Return = NtGdiDdDeleteDirectDrawObject((HANDLE)pDirectDrawGlobal->hDD);
01837         if (Return == TRUE)
01838         {
01839             pDirectDrawGlobal->hDD = 0;
01840         }
01841     }
01842     else if (ghDirectDraw)
01843     {
01844         /* Always success here */
01845         Return = TRUE;
01846 
01847         /* Make sure this is the last instance */
01848         if (!(--gcDirectDraw))
01849         {
01850             /* Delete the object */
01851             Return = NtGdiDdDeleteDirectDrawObject(ghDirectDraw);
01852             if (Return == TRUE)
01853             {
01854                 ghDirectDraw = 0;
01855             }
01856         }
01857     }
01858 
01859     /* Return */
01860     return Return;
01861 }
01862 
01863 /*
01864  * @implemented
01865  *
01866  * GDIEntry 4
01867  */
01868 BOOL
01869 WINAPI
01870 DdCreateSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal,
01871                        BOOL bPrimarySurface)
01872 {
01873     return bDDCreateSurface(pSurfaceLocal, TRUE);
01874 }
01875 
01876 
01877 /*
01878  * @implemented
01879  *
01880  * GDIEntry 5
01881  */
01882 BOOL
01883 WINAPI
01884 DdDeleteSurfaceObject(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal)
01885 {
01886     BOOL Return = FALSE;
01887 
01888     /* Make sure there is one */
01889     if (pSurfaceLocal->hDDSurface)
01890     {
01891         /* Delete it */
01892         Return = NtGdiDdDeleteSurfaceObject((HANDLE)pSurfaceLocal->hDDSurface);
01893         pSurfaceLocal->hDDSurface = 0;
01894     }
01895 
01896     return Return;
01897 }
01898 
01899 /*
01900  * @implemented
01901  *
01902  * GDIEntry 6
01903  */
01904 BOOL
01905 WINAPI
01906 DdResetVisrgn(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal,
01907               HWND hWnd)
01908 {
01909     /* Call win32k directly */
01910     return NtGdiDdResetVisrgn((HANDLE) pSurfaceLocal->hDDSurface, hWnd);
01911 }
01912 
01913 /*
01914  * @implemented
01915  *
01916  * GDIEntry 7
01917  */
01918 HDC
01919 WINAPI
01920 DdGetDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal,
01921         LPPALETTEENTRY pColorTable)
01922 {
01923     /* Call win32k directly */
01924     return NtGdiDdGetDC(pColorTable, (HANDLE) pSurfaceLocal->hDDSurface);
01925 }
01926 
01927 /*
01928  * @implemented
01929  *
01930  * GDIEntry 8
01931  */
01932 BOOL
01933 WINAPI
01934 DdReleaseDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal)
01935 {
01936     /* Call win32k directly */
01937     return NtGdiDdReleaseDC((HANDLE) pSurfaceLocal->hDDSurface);
01938 }
01939 
01940 /*
01941  * @unimplemented
01942  * GDIEntry 9
01943  */
01944 HBITMAP
01945 WINAPI
01946 DdCreateDIBSection(HDC hdc,
01947                    CONST BITMAPINFO *pbmi,
01948                    UINT iUsage,
01949                    VOID **ppvBits,
01950                    HANDLE hSectionApp,
01951                    DWORD dwOffset)
01952 {
01953     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
01954     return 0;
01955 }
01956 
01957 /*
01958  * @implemented
01959  *
01960  * GDIEntry 10
01961  */
01962 BOOL
01963 WINAPI
01964 DdReenableDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal,
01965                            BOOL *pbNewMode)
01966 {
01967     /* Call win32k directly */
01968     return NtGdiDdReenableDirectDrawObject(GetDdHandle(pDirectDrawGlobal->hDD),
01969                                            pbNewMode);
01970 }
01971 
01972 
01973 /*
01974  * @implemented
01975  *
01976  * GDIEntry 11
01977  */
01978 BOOL
01979 WINAPI
01980 DdAttachSurface( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom,
01981                  LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo)
01982 {
01983     /* Create Surface if it does not exits one */
01984     if (!pSurfaceFrom->hDDSurface)
01985     {
01986         if (!bDDCreateSurface(pSurfaceFrom, FALSE))
01987         {
01988             return FALSE;
01989         }
01990     }
01991 
01992     /* Create Surface if it does not exits one */
01993     if (!pSurfaceTo->hDDSurface)
01994     {
01995         if (!bDDCreateSurface(pSurfaceTo, FALSE))
01996         {
01997             return FALSE;
01998         }
01999     }
02000 
02001     /* Call win32k */
02002     return NtGdiDdAttachSurface((HANDLE)pSurfaceFrom->hDDSurface,
02003                                 (HANDLE)pSurfaceTo->hDDSurface);
02004 }
02005 
02006 /*
02007  * @implemented
02008  *
02009  * GDIEntry 12
02010  */
02011 VOID
02012 WINAPI
02013 DdUnattachSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface,
02014                   LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached)
02015 {
02016     /* Call win32k */
02017     NtGdiDdUnattachSurface((HANDLE)pSurface->hDDSurface,
02018                            (HANDLE)pSurfaceAttached->hDDSurface);
02019 }
02020 
02021 /*
02022  * @implemented
02023  *
02024  * GDIEntry 13
02025  */
02026 ULONG
02027 WINAPI
02028 DdQueryDisplaySettingsUniqueness()
02029 {
02030     return GdiSharedHandleTable->flDeviceUniq;
02031 }
02032 
02033 /*
02034  * @implemented
02035  *
02036  * GDIEntry 14
02037  */
02038 HANDLE
02039 WINAPI
02040 DdGetDxHandle(LPDDRAWI_DIRECTDRAW_LCL pDDraw,
02041               LPDDRAWI_DDRAWSURFACE_LCL pSurface,
02042               BOOL bRelease)
02043 {
02044     HANDLE hDD = NULL;
02045     HANDLE hSurface = NULL;
02046 
02047     /* Check if we already have a surface */
02048     if (!pSurface)
02049     {
02050         /* We don't have one, use the DirectDraw Object handle instead */
02051         hDD = GetDdHandle(pDDraw->lpGbl->hDD);
02052     }
02053     else
02054     {
02055         hSurface = (HANDLE)pSurface->hDDSurface;
02056     }
02057 
02058     /* Call the API */
02059     return (HANDLE)NtGdiDdGetDxHandle(hDD, hSurface, bRelease);
02060 }
02061 
02062 /*
02063  * @implemented
02064  *
02065  * GDIEntry 15
02066  */
02067 BOOL
02068 WINAPI
02069 DdSetGammaRamp(LPDDRAWI_DIRECTDRAW_LCL pDDraw,
02070                HDC hdc,
02071                LPVOID lpGammaRamp)
02072 {
02073     /* Call win32k directly */
02074     return NtGdiDdSetGammaRamp(GetDdHandle(pDDraw->lpGbl->hDD),
02075                                hdc,
02076                                lpGammaRamp);
02077 }
02078 
02079 
02080 
02081 
02082 

Generated on Sat May 26 2012 04:37:10 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.