/******************************Module*Header*******************************\ * Module Name: ddraw.c * * Client side stubs for the private DirectDraw system APIs. * * Created: 3-Dec-1995 * Author: J. Andrew Goossen [andrewgo] * * Copyright (c) 1995-1999 Microsoft Corporation \**************************************************************************/ #include "precomp.h" #pragma hdrstop #include #include #undef _NO_COM #define BUILD_DDDDK #include #include #include "ddstub.h" #include "d3dstub.h" // For the first incarnation of DirectDraw on Windows NT, we are // implementing a user-mode shared memory section between all instances // of DirectDraw to keep track of shared state -- mostly for off-screen // memory allocation and exclusive mode arbitration. Hopefully future // versions will move all this logic to kernel mode so that we can get // rid of the shared section, which is a robustness hole. // // One of the ramifications of this is that DirectDraw keeps its // global DirectDraw object in the shared memory section, where it is // used by all processes. Unfortunately, it is preferrable from a kernel // point of view to keep the DirectDraw objects unique between processes // so that proper cleanup can be done. As a compromise, so that // DirectDraw can keep using this global DirectDraw object, but that the // kernel still has unique DirectDraw objects per process, we simply stash // the unique per-process DirectDraw handle in a variable global to this // process, and use that instead of anything pulled out of DirectDraw's // own global DirectDraw object structure -- an advantage since the kernel // code is already written to the future model. // // One result of this, however, is that we are limiting ourselves to the // notion of only one DirectDraw device. However, since we will not // support multiple monitors for the NT 4.0 release, I don't consider this // to be a serious problem, and the non-shared-section model will fix this. HANDLE ghDirectDraw = 0; // Process-specific kernel-mode DirectDraw object // handle that we substitute for the 'global' // DirectDraw handle whenever we see it ULONG gcDirectDraw = 0; // Count of global DirectDraw instances /*****************************Private*Routine******************************\ * CanCreateVideoPort * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpCanCreateVideoPort( LPDDHAL_CANCREATEVPORTDATA pCanCreateVideoPort ) { return(NtGdiDvpCanCreateVideoPort(DD_HANDLE(pCanCreateVideoPort->lpDD->lpGbl->hDD), (PDD_CANCREATEVPORTDATA)pCanCreateVideoPort)); } /*****************************Private*Routine******************************\ * CreateVideoPort * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpCreateVideoPort( LPDDHAL_CREATEVPORTDATA pCreateVideoPort ) { HANDLE h; h = NtGdiDvpCreateVideoPort(DD_HANDLE(pCreateVideoPort->lpDD->lpGbl->hDD), (PDD_CREATEVPORTDATA)pCreateVideoPort); pCreateVideoPort->lpVideoPort->hDDVideoPort = h; return(DDHAL_DRIVER_HANDLED); } /*****************************Private*Routine******************************\ * DestroyVideoPort * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpDestroyVideoPort( LPDDHAL_DESTROYVPORTDATA pDestroyVideoPort ) { return(NtGdiDvpDestroyVideoPort((HANDLE) pDestroyVideoPort->lpVideoPort->hDDVideoPort, (PDD_DESTROYVPORTDATA)pDestroyVideoPort)); } /*****************************Private*Routine******************************\ * ColorControl * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpColorControl( LPDDHAL_VPORTCOLORDATA pColorControl ) { return(NtGdiDvpColorControl((HANDLE) pColorControl->lpVideoPort->hDDVideoPort, (PDD_VPORTCOLORDATA)pColorControl)); } /*****************************Private*Routine******************************\ * FlipVideoPort * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpFlipVideoPort( LPDDHAL_FLIPVPORTDATA pFlipVideoPort ) { return(NtGdiDvpFlipVideoPort((HANDLE) pFlipVideoPort->lpVideoPort->hDDVideoPort, (HANDLE) pFlipVideoPort->lpSurfCurr->hDDSurface, (HANDLE) pFlipVideoPort->lpSurfTarg->hDDSurface, (PDD_FLIPVPORTDATA) pFlipVideoPort)); } /*****************************Private*Routine******************************\ * GetVideoPortBandwidth * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoPortBandwidth( LPDDHAL_GETVPORTBANDWIDTHDATA pGetVPortBandwidth ) { return(NtGdiDvpGetVideoPortBandwidth((HANDLE) pGetVPortBandwidth->lpVideoPort->hDDVideoPort, (PDD_GETVPORTBANDWIDTHDATA) pGetVPortBandwidth)); } /*****************************Private*Routine******************************\ * GetVideoPortField * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoPortField( LPDDHAL_GETVPORTFIELDDATA pGetVideoPortField ) { return(NtGdiDvpGetVideoPortField((HANDLE) pGetVideoPortField->lpVideoPort->hDDVideoPort, (PDD_GETVPORTFIELDDATA)pGetVideoPortField)); } /*****************************Private*Routine******************************\ * GetVideoPortFlipStatus * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoPortFlipStatus( LPDDHAL_GETVPORTFLIPSTATUSDATA pGetVPortFlipStatus ) { return(NtGdiDvpGetVideoPortFlipStatus(DD_HANDLE(pGetVPortFlipStatus->lpDD->lpGbl->hDD), (PDD_GETVPORTFLIPSTATUSDATA)pGetVPortFlipStatus)); } /*****************************Private*Routine******************************\ * GetVideoPortInputFormats * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoPortInputFormats( LPDDHAL_GETVPORTINPUTFORMATDATA pGetVPortInputFormat ) { return(NtGdiDvpGetVideoPortInputFormats((HANDLE) pGetVPortInputFormat->lpVideoPort->hDDVideoPort, (PDD_GETVPORTINPUTFORMATDATA)pGetVPortInputFormat)); } /*****************************Private*Routine******************************\ * GetVideoPortLine * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoPortLine( LPDDHAL_GETVPORTLINEDATA pGetVideoPortLine ) { return(NtGdiDvpGetVideoPortLine((HANDLE) pGetVideoPortLine->lpVideoPort->hDDVideoPort, (PDD_GETVPORTLINEDATA)pGetVideoPortLine)); } /*****************************Private*Routine******************************\ * GetVideoPortOutputFormats * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoPortOutputFormats( LPDDHAL_GETVPORTOUTPUTFORMATDATA pGetVPortOutputFormats ) { return(NtGdiDvpGetVideoPortOutputFormats((HANDLE) pGetVPortOutputFormats->lpVideoPort->hDDVideoPort, (PDD_GETVPORTOUTPUTFORMATDATA)pGetVPortOutputFormats)); } /*****************************Private*Routine******************************\ * GetVideoPortConnectInfo * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoPortConnectInfo( LPDDHAL_GETVPORTCONNECTDATA pGetVPortConnectInfo ) { return(NtGdiDvpGetVideoPortConnectInfo(DD_HANDLE(pGetVPortConnectInfo->lpDD->lpGbl->hDD), (PDD_GETVPORTCONNECTDATA)pGetVPortConnectInfo)); } /*****************************Private*Routine******************************\ * GetVideoSignalStatus * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpGetVideoSignalStatus( LPDDHAL_GETVPORTSIGNALDATA pGetVideoSignalStatus ) { return(NtGdiDvpGetVideoSignalStatus((HANDLE) pGetVideoSignalStatus->lpVideoPort->hDDVideoPort, (PDD_GETVPORTSIGNALDATA)pGetVideoSignalStatus)); } /*****************************Private*Routine******************************\ * UpdateVideoPort * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpUpdateVideoPort( LPDDHAL_UPDATEVPORTDATA pUpdateVideoPort ) { HANDLE ahSurfaceVideo[MAX_AUTOFLIP_BUFFERS]; HANDLE ahSurfaceVbi[MAX_AUTOFLIP_BUFFERS]; DWORD dwNumAutoflip; DWORD dwNumVBIAutoflip; ULONG i; if (pUpdateVideoPort->dwFlags != DDRAWI_VPORTSTOP) { dwNumAutoflip = pUpdateVideoPort->dwNumAutoflip; if ((dwNumAutoflip == 0) && (pUpdateVideoPort->lplpDDSurface != NULL)) { dwNumAutoflip = 1; } for (i = 0; i < dwNumAutoflip; i++) { ahSurfaceVideo[i] = (HANDLE)(pUpdateVideoPort->lplpDDSurface[i]-> lpLcl->hDDSurface); } dwNumVBIAutoflip = pUpdateVideoPort->dwNumVBIAutoflip; if ((dwNumVBIAutoflip == 0) && (pUpdateVideoPort->lplpDDVBISurface != NULL)) { dwNumVBIAutoflip = 1; } for (i = 0; i < dwNumVBIAutoflip; i++) { ahSurfaceVbi[i] = (HANDLE)(pUpdateVideoPort->lplpDDVBISurface[i]-> lpLcl->hDDSurface); } } return(NtGdiDvpUpdateVideoPort((HANDLE) pUpdateVideoPort->lpVideoPort->hDDVideoPort, ahSurfaceVideo, ahSurfaceVbi, (PDD_UPDATEVPORTDATA) pUpdateVideoPort)); } /*****************************Private*Routine******************************\ * WaitForVideoPortSync * * History: * 2-Oct-1996 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpWaitForVideoPortSync( LPDDHAL_WAITFORVPORTSYNCDATA pWaitForVideoPortSync ) { return(NtGdiDvpWaitForVideoPortSync((HANDLE) pWaitForVideoPortSync->lpVideoPort->hDDVideoPort, (PDD_WAITFORVPORTSYNCDATA)pWaitForVideoPortSync)); } /*****************************Private*Routine******************************\ * AcquireNotification * * History: * 9-Oct-2000 -by- Scott MacDonald [smac] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpAcquireNotification( LPDDRAWI_DDVIDEOPORT_LCL pVideoPort, HANDLE * pHandle, LPDDVIDEOPORTNOTIFY pNotify) { return(NtGdiDvpAcquireNotification((HANDLE) pVideoPort->hDDVideoPort, pHandle, pNotify)); } /*****************************Private*Routine******************************\ * ReleaseNotification * * History: * 9-Oct-2000 -by- Scott MacDonald [smac] * Wrote it. \**************************************************************************/ DWORD WINAPI DvpReleaseNotification( LPDDRAWI_DDVIDEOPORT_LCL pVideoPort, HANDLE Handle) { return(NtGdiDvpReleaseNotification((HANDLE) pVideoPort->hDDVideoPort, Handle)); } /*****************************Private*Routine******************************\ * GetMoCompGuids * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdGetMoCompGuids( LPDDHAL_GETMOCOMPGUIDSDATA pGetMoCompGuids ) { return(NtGdiDdGetMoCompGuids(DD_HANDLE(pGetMoCompGuids->lpDD->lpGbl->hDD), (PDD_GETMOCOMPGUIDSDATA)pGetMoCompGuids)); } /*****************************Private*Routine******************************\ * GetMoCompFormats * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdGetMoCompFormats( LPDDHAL_GETMOCOMPFORMATSDATA pGetMoCompFormats ) { return(NtGdiDdGetMoCompFormats(DD_HANDLE(pGetMoCompFormats->lpDD->lpGbl->hDD), (PDD_GETMOCOMPFORMATSDATA)pGetMoCompFormats)); } /*****************************Private*Routine******************************\ * GetMoCompBuffInfo * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdGetMoCompBuffInfo( LPDDHAL_GETMOCOMPCOMPBUFFDATA pGetBuffData ) { return(NtGdiDdGetMoCompBuffInfo(DD_HANDLE(pGetBuffData->lpDD->lpGbl->hDD), (PDD_GETMOCOMPCOMPBUFFDATA)pGetBuffData)); } /*****************************Private*Routine******************************\ * GetInternalMoCompInfo * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdGetInternalMoCompInfo( LPDDHAL_GETINTERNALMOCOMPDATA pGetInternalData ) { return(NtGdiDdGetInternalMoCompInfo(DD_HANDLE(pGetInternalData->lpDD->lpGbl->hDD), (PDD_GETINTERNALMOCOMPDATA)pGetInternalData)); } /*****************************Private*Routine******************************\ * CreateMoComp * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdCreateMoComp( LPDDHAL_CREATEMOCOMPDATA pCreateMoComp ) { HANDLE h; h = NtGdiDdCreateMoComp(DD_HANDLE(pCreateMoComp->lpDD->lpGbl->hDD), (PDD_CREATEMOCOMPDATA)pCreateMoComp); pCreateMoComp->lpMoComp->hMoComp = h; return(DDHAL_DRIVER_HANDLED); } /*****************************Private*Routine******************************\ * DestroyMoComp * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdDestroyMoComp( LPDDHAL_DESTROYMOCOMPDATA pDestroyMoComp ) { return(NtGdiDdDestroyMoComp((HANDLE)pDestroyMoComp->lpMoComp->hMoComp, (PDD_DESTROYMOCOMPDATA)pDestroyMoComp)); } /*****************************Private*Routine******************************\ * BeginMoCompFrame * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdBeginMoCompFrame( LPDDHAL_BEGINMOCOMPFRAMEDATA pBeginFrame ) { LPDDRAWI_DDRAWSURFACE_LCL *lpOriginal=NULL; LPDDRAWI_DDRAWSURFACE_LCL lpOrigDest=NULL; DWORD i; DWORD dwRet; if( pBeginFrame->lpDestSurface != NULL ) { lpOrigDest = pBeginFrame->lpDestSurface; pBeginFrame->lpDestSurface = (LPDDRAWI_DDRAWSURFACE_LCL) pBeginFrame->lpDestSurface->hDDSurface; } dwRet = NtGdiDdBeginMoCompFrame((HANDLE)pBeginFrame->lpMoComp->hMoComp, (PDD_BEGINMOCOMPFRAMEDATA)pBeginFrame); if( lpOrigDest ) { pBeginFrame->lpDestSurface = lpOrigDest; } return dwRet; } /*****************************Private*Routine******************************\ * EndMoCompFrame * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdEndMoCompFrame( LPDDHAL_ENDMOCOMPFRAMEDATA pEndFrame ) { return(NtGdiDdEndMoCompFrame((HANDLE)pEndFrame->lpMoComp->hMoComp, (PDD_ENDMOCOMPFRAMEDATA)pEndFrame)); } /*****************************Private*Routine******************************\ * RenderMoComp * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdRenderMoComp( LPDDHAL_RENDERMOCOMPDATA pRender ) { DWORD i; DWORD dwRet; for( i = 0; i < pRender->dwNumBuffers; i++ ) { pRender->lpBufferInfo[i].lpPrivate = pRender->lpBufferInfo[i].lpCompSurface; pRender->lpBufferInfo[i].lpCompSurface = (LPDDRAWI_DDRAWSURFACE_LCL) pRender->lpBufferInfo[i].lpCompSurface->hDDSurface; } dwRet = NtGdiDdRenderMoComp((HANDLE)pRender->lpMoComp->hMoComp, (PDD_RENDERMOCOMPDATA)pRender); for( i = 0; i < pRender->dwNumBuffers; i++ ) { pRender->lpBufferInfo[i].lpCompSurface = (LPDDRAWI_DDRAWSURFACE_LCL) pRender->lpBufferInfo[i].lpPrivate; } return dwRet; } /*****************************Private*Routine******************************\ * QueryMoCompStatus * * History: * 18-Nov-1997 -by- smac * Wrote it. \**************************************************************************/ DWORD WINAPI DdQueryMoCompStatus( LPDDHAL_QUERYMOCOMPSTATUSDATA pQueryStatus ) { DWORD dwRet; LPDDRAWI_DDRAWSURFACE_LCL surf_lcl; surf_lcl = pQueryStatus->lpSurface; pQueryStatus->lpSurface = (LPDDRAWI_DDRAWSURFACE_LCL) surf_lcl->hDDSurface; dwRet = NtGdiDdQueryMoCompStatus((HANDLE)pQueryStatus->lpMoComp->hMoComp, (PDD_QUERYMOCOMPSTATUSDATA)pQueryStatus); pQueryStatus->lpSurface = surf_lcl; return dwRet; } /*****************************Private*Routine******************************\ * DdAlphaBlt * * History: * 24-Nov-1997 -by- Scott MacDonald [smac] * Wrote it. \**************************************************************************/ DWORD WINAPI DdAlphaBlt( LPDDHAL_BLTDATA pBlt ) { HANDLE hSurfaceSrc = (pBlt->lpDDSrcSurface != NULL) ? (HANDLE) pBlt->lpDDSrcSurface->hDDSurface : 0; return(NtGdiDdAlphaBlt((HANDLE) pBlt->lpDDDestSurface->hDDSurface, hSurfaceSrc, (PDD_BLTDATA) pBlt)); } /*****************************Private*Routine******************************\ * DdBlt * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD WINAPI DdBlt( LPDDHAL_BLTDATA pBlt ) { HANDLE hSurfaceSrc = (pBlt->lpDDSrcSurface != NULL) ? (HANDLE) pBlt->lpDDSrcSurface->hDDSurface : 0; return(NtGdiDdBlt((HANDLE) pBlt->lpDDDestSurface->hDDSurface, hSurfaceSrc, (PDD_BLTDATA) pBlt)); } /*****************************Private*Routine******************************\ * DdFlip * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdFlip( LPDDHAL_FLIPDATA pFlip ) { HANDLE hSurfTargLeft=NULL; HANDLE hSurfCurrLeft=NULL; if (pFlip->dwFlags & DDFLIP_STEREO) { if (pFlip->lpSurfTargLeft!=NULL && pFlip->lpSurfCurrLeft!=NULL) { hSurfTargLeft=(HANDLE)pFlip->lpSurfTargLeft->hDDSurface; hSurfCurrLeft=(HANDLE)pFlip->lpSurfCurrLeft->hDDSurface; } } return(NtGdiDdFlip((HANDLE) pFlip->lpSurfCurr->hDDSurface, (HANDLE) pFlip->lpSurfTarg->hDDSurface, hSurfCurrLeft, hSurfTargLeft, (PDD_FLIPDATA) pFlip)); } /*****************************Private*Routine******************************\ * DdLock * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdLock( LPDDHAL_LOCKDATA pLock ) { return(NtGdiDdLock((HANDLE) pLock->lpDDSurface->hDDSurface, (PDD_LOCKDATA) pLock, NULL)); } /*****************************Private*Routine******************************\ * DdUnlock * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdUnlock( LPDDHAL_UNLOCKDATA pUnlock ) { return(NtGdiDdUnlock((HANDLE) pUnlock->lpDDSurface->hDDSurface, (PDD_UNLOCKDATA) pUnlock)); } /*****************************Private*Routine******************************\ * DdLockD3D * * History: * 20-Jan-1998 -by- Anantha Kancherla [anankan] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdLockD3D( LPDDHAL_LOCKDATA pLock ) { return(NtGdiDdLockD3D((HANDLE) pLock->lpDDSurface->hDDSurface, (PDD_LOCKDATA) pLock)); } /*****************************Private*Routine******************************\ * DdUnlockD3D * * History: * 20-Jan-1998 -by- Anantha Kancherla [anankan] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdUnlockD3D( LPDDHAL_UNLOCKDATA pUnlock ) { return(NtGdiDdUnlockD3D((HANDLE) pUnlock->lpDDSurface->hDDSurface, (PDD_UNLOCKDATA) pUnlock)); } /*****************************Private*Routine******************************\ * DdGetBltStatus * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdGetBltStatus( LPDDHAL_GETBLTSTATUSDATA pGetBltStatus ) { return(NtGdiDdGetBltStatus((HANDLE) pGetBltStatus->lpDDSurface->hDDSurface, (PDD_GETBLTSTATUSDATA) pGetBltStatus)); } /*****************************Private*Routine******************************\ * DdGetFlipStatus * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdGetFlipStatus( LPDDHAL_GETFLIPSTATUSDATA pGetFlipStatus ) { return(NtGdiDdGetFlipStatus((HANDLE) pGetFlipStatus->lpDDSurface->hDDSurface, (PDD_GETFLIPSTATUSDATA) pGetFlipStatus)); } /*****************************Private*Routine******************************\ * DdWaitForVerticalBlank * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdWaitForVerticalBlank( LPDDHAL_WAITFORVERTICALBLANKDATA pWaitForVerticalBlank ) { return(NtGdiDdWaitForVerticalBlank(DD_HANDLE(pWaitForVerticalBlank->lpDD->hDD), (PDD_WAITFORVERTICALBLANKDATA) pWaitForVerticalBlank)); } /*****************************Private*Routine******************************\ * DdCanCreateSurface * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdCanCreateSurface( LPDDHAL_CANCREATESURFACEDATA pCanCreateSurface ) { return(NtGdiDdCanCreateSurface(DD_HANDLE(pCanCreateSurface->lpDD->hDD), (PDD_CANCREATESURFACEDATA) pCanCreateSurface)); } /*****************************Private*Routine******************************\ * DdCreateSurface * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdCreateSurface( LPDDHAL_CREATESURFACEDATA pCreateSurface ) { ULONG i; LPDDSURFACEDESC pSurfaceDesc; LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal; LPDDRAWI_DDRAWSURFACE_GBL pSurfaceGlobal; DD_SURFACE_GLOBAL SurfaceGlobal; DD_SURFACE_LOCAL SurfaceLocal; DD_SURFACE_MORE SurfaceMore; HANDLE hInSurface; HANDLE hOutSurface; DD_SURFACE_LOCAL* pDDSurfaceLocal = NULL; DD_SURFACE_GLOBAL* pDDSurfaceGlobal = NULL; DD_SURFACE_MORE* pDDSurfaceMore = NULL; HANDLE* phInSurface = NULL; HANDLE* phOutSurface = NULL; DWORD dwRet; DWORD dwNumToCreate; // For every surface, convert to the kernel's surface data structure, // call the kernel, then convert back: // All video memory heaps are handled in the kernel so if // the kernel call cannot create a surface then user-mode can't // either. Always returns DRIVER_HANDLED to enforce this. dwRet = DDHAL_DRIVER_HANDLED; // If we are only creating one, no need to allocate gobs of memory; otherwise, do it dwNumToCreate = pCreateSurface->dwSCnt; if (pCreateSurface->dwSCnt == 1) { pDDSurfaceLocal = &SurfaceLocal; pDDSurfaceGlobal = &SurfaceGlobal; pDDSurfaceMore = &SurfaceMore; phInSurface = &hInSurface; phOutSurface = &hOutSurface; // // Wow64 genthnk will automatically thunk these structures, however, // since these structures are pointer dependent, we need to make sure // to NULL out these pointers so that Wow64 won't thunk them // RtlZeroMemory(pDDSurfaceLocal, sizeof(*pDDSurfaceLocal)); RtlZeroMemory(pDDSurfaceGlobal, sizeof(*pDDSurfaceGlobal)); RtlZeroMemory(pDDSurfaceMore, sizeof(*pDDSurfaceMore)); } else { pDDSurfaceLocal = (DD_SURFACE_LOCAL*) LocalAlloc(LMEM_ZEROINIT, sizeof(DD_SURFACE_LOCAL) * dwNumToCreate); pDDSurfaceGlobal = (DD_SURFACE_GLOBAL*) LocalAlloc(LMEM_ZEROINIT, sizeof(DD_SURFACE_GLOBAL) * dwNumToCreate); pDDSurfaceMore = (DD_SURFACE_MORE*) LocalAlloc(LMEM_ZEROINIT, sizeof(DD_SURFACE_MORE) * dwNumToCreate); phInSurface = (HANDLE*) LocalAlloc(LMEM_ZEROINIT, sizeof(HANDLE) * dwNumToCreate); phOutSurface = (HANDLE*) LocalAlloc(LMEM_ZEROINIT, sizeof(HANDLE) * dwNumToCreate); if ((pDDSurfaceLocal == NULL) || (pDDSurfaceGlobal == NULL) || (pDDSurfaceMore == NULL) || (phInSurface == NULL) || (phOutSurface == NULL)) { pCreateSurface->ddRVal = DDERR_OUTOFMEMORY; goto CleanupCreate; } } for (i = 0; i < dwNumToCreate; i++) { pSurfaceLocal = pCreateSurface->lplpSList[i]; pSurfaceGlobal = pSurfaceLocal->lpGbl; pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc; // Make sure there's always a valid pixel format for the surface: if (pSurfaceLocal->dwFlags & DDRAWISURF_HASPIXELFORMAT) { pDDSurfaceGlobal[i].ddpfSurface = pSurfaceGlobal->ddpfSurface; pDDSurfaceGlobal[i].ddpfSurface.dwSize = sizeof(DDPIXELFORMAT); } else { pDDSurfaceGlobal[i].ddpfSurface = pSurfaceGlobal->lpDD->vmiData.ddpfDisplay; } pDDSurfaceGlobal[i].wWidth = pSurfaceGlobal->wWidth; pDDSurfaceGlobal[i].wHeight = pSurfaceGlobal->wHeight; pDDSurfaceGlobal[i].lPitch = pSurfaceGlobal->lPitch; pDDSurfaceGlobal[i].fpVidMem = pSurfaceGlobal->fpVidMem; pDDSurfaceGlobal[i].dwBlockSizeX = pSurfaceGlobal->dwBlockSizeX; pDDSurfaceGlobal[i].dwBlockSizeY = pSurfaceGlobal->dwBlockSizeY; pDDSurfaceLocal[i].ddsCaps = pSurfaceLocal->ddsCaps; // Copy the driver managed flag pDDSurfaceLocal[i].dwFlags &= ~DDRAWISURF_DRIVERMANAGED; pDDSurfaceLocal[i].dwFlags |= (pSurfaceLocal->dwFlags & DDRAWISURF_DRIVERMANAGED); // lpSurfMore will be NULL if called from dciman if (pSurfaceLocal->lpSurfMore) { pDDSurfaceMore[i].ddsCapsEx = pSurfaceLocal->lpSurfMore->ddsCapsEx; pDDSurfaceMore[i].dwSurfaceHandle = pSurfaceLocal->lpSurfMore->dwSurfaceHandle; } else { pDDSurfaceMore[i].ddsCapsEx.dwCaps2 = 0; pDDSurfaceMore[i].ddsCapsEx.dwCaps3 = 0; pDDSurfaceMore[i].ddsCapsEx.dwCaps4 = 0; pDDSurfaceMore[i].dwSurfaceHandle = 0; } phInSurface[i] = (HANDLE) pSurfaceLocal->hDDSurface; } // Preset an error in case the kernel can't write status // back for some reason. pCreateSurface->ddRVal = DDERR_GENERIC; dwRet = NtGdiDdCreateSurface(DD_HANDLE(pCreateSurface->lpDD->hDD), phInSurface, pSurfaceDesc, pDDSurfaceGlobal, pDDSurfaceLocal, pDDSurfaceMore, (PDD_CREATESURFACEDATA) pCreateSurface, phOutSurface); ASSERTGDI(dwRet == DDHAL_DRIVER_HANDLED, "NtGdiDdCreateSurface returned NOTHANDLED"); for (i = 0; i < dwNumToCreate; i++) { pSurfaceLocal = pCreateSurface->lplpSList[i]; pSurfaceGlobal = pSurfaceLocal->lpGbl; if (pCreateSurface->ddRVal != DD_OK) { // Surface creation failed. Nothing in user-mode can // create video memory surfaces so this whole call // fails. // Ensure the current surface and all following surfaces // have a zero fpVidMem to indicate they weren't // allocated. pCreateSurface->lplpSList[i]->lpGbl->fpVidMem = 0; // Handle may have been allocated by DdAttachSurface if (pSurfaceLocal->hDDSurface != 0) NtGdiDdDeleteSurfaceObject((HANDLE)pSurfaceLocal->hDDSurface); pSurfaceLocal->hDDSurface = 0; } else { pSurfaceLocal->hDDSurface = (ULONG_PTR) phOutSurface[i]; } pSurfaceGlobal->lPitch = pDDSurfaceGlobal[i].lPitch; pSurfaceGlobal->fpVidMem = pDDSurfaceGlobal[i].fpVidMem; pSurfaceGlobal->dwBlockSizeX = pDDSurfaceGlobal[i].dwBlockSizeX; pSurfaceGlobal->dwBlockSizeY = pDDSurfaceGlobal[i].dwBlockSizeY; if (pSurfaceLocal->dwFlags & DDRAWISURF_HASPIXELFORMAT) { pSurfaceGlobal->ddpfSurface = pDDSurfaceGlobal[i].ddpfSurface; } pSurfaceLocal->ddsCaps = pDDSurfaceLocal[i].ddsCaps; if (pSurfaceLocal->lpSurfMore) { pSurfaceLocal->lpSurfMore->ddsCapsEx = pDDSurfaceMore[i].ddsCapsEx; } } CleanupCreate: if (dwNumToCreate > 1) { if (pDDSurfaceLocal != NULL) { LocalFree(pDDSurfaceLocal); } if (pDDSurfaceGlobal != NULL) { LocalFree(pDDSurfaceGlobal); } if (pDDSurfaceMore != NULL) { LocalFree(pDDSurfaceMore); } if (phInSurface != NULL) { LocalFree(phInSurface); } if (phOutSurface != NULL) { LocalFree(phOutSurface); } } // fpVidMem is the real per-surface return value, so for the function // return value we'll simply return that of the last call: return(dwRet); } /*****************************Private*Routine******************************\ * DdDestroySurface * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdDestroySurface( LPDDHAL_DESTROYSURFACEDATA pDestroySurface ) { DWORD dwRet; LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal; dwRet = DDHAL_DRIVER_NOTHANDLED; pSurfaceLocal = pDestroySurface->lpDDSurface; if (pSurfaceLocal->hDDSurface != 0) { if((pSurfaceLocal->dwFlags & DDRAWISURF_DRIVERMANAGED) && (pSurfaceLocal->dwFlags & DDRAWISURF_INVALID)) dwRet = NtGdiDdDestroySurface((HANDLE) pSurfaceLocal->hDDSurface, FALSE); else dwRet = NtGdiDdDestroySurface((HANDLE) pSurfaceLocal->hDDSurface, TRUE); } return(dwRet); } /*****************************Private*Routine******************************\ * DdCanCreateD3DBuffer * * History: * 20-Jan-1998 -by- Anantha Kancherla [anankan] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdCanCreateD3DBuffer( LPDDHAL_CANCREATESURFACEDATA pCanCreateSurface ) { return(NtGdiDdCanCreateD3DBuffer(DD_HANDLE(pCanCreateSurface->lpDD->hDD), (PDD_CANCREATESURFACEDATA) pCanCreateSurface)); } /*****************************Private*Routine******************************\ * DdCreateD3DBuffer * * History: * 20-Jan-1998 -by- Anantha Kancherla [anankan] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdCreateD3DBuffer( LPDDHAL_CREATESURFACEDATA pCreateSurface ) { ULONG i; LPDDSURFACEDESC pSurfaceDesc; LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal; LPDDRAWI_DDRAWSURFACE_GBL pSurfaceGlobal; DD_SURFACE_GLOBAL SurfaceGlobal; DD_SURFACE_LOCAL SurfaceLocal; DD_SURFACE_MORE SurfaceMore; HANDLE hSurface; DWORD dwRet; // For every surface, convert to the kernel's surface data structure, // call the kernel, then convert back: dwRet = DDHAL_DRIVER_NOTHANDLED; // // Wow64 genthnk will automatically thunk these structures, however, // since these structures are pointer dependent, we need to make sure // to NULL out these pointers so that Wow64 won't thunk them // RtlZeroMemory(&SurfaceLocal, sizeof(SurfaceLocal)); RtlZeroMemory(&SurfaceGlobal, sizeof(SurfaceGlobal)); RtlZeroMemory(&SurfaceMore, sizeof(SurfaceMore)); pSurfaceLocal = pCreateSurface->lplpSList[0]; pSurfaceGlobal = pSurfaceLocal->lpGbl; pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc; pCreateSurface->dwSCnt = 1; SurfaceGlobal.wWidth = pSurfaceGlobal->wWidth; SurfaceGlobal.wHeight = pSurfaceGlobal->wHeight; SurfaceGlobal.lPitch = pSurfaceGlobal->lPitch; SurfaceGlobal.fpVidMem = pSurfaceGlobal->fpVidMem; SurfaceGlobal.dwBlockSizeX = pSurfaceGlobal->dwBlockSizeX; SurfaceGlobal.dwBlockSizeY = pSurfaceGlobal->dwBlockSizeY; SurfaceLocal.dwFlags = pSurfaceLocal->dwFlags; SurfaceLocal.ddsCaps = pSurfaceLocal->ddsCaps; SurfaceMore.ddsCapsEx = pSurfaceLocal->lpSurfMore->ddsCapsEx; SurfaceMore.dwSurfaceHandle = pSurfaceLocal->lpSurfMore->dwSurfaceHandle; dwRet = NtGdiDdCreateD3DBuffer(DD_HANDLE(pCreateSurface->lpDD->hDD), (HANDLE*) &pSurfaceLocal->hDDSurface, pSurfaceDesc, &SurfaceGlobal, &SurfaceLocal, &SurfaceMore, (PDD_CREATESURFACEDATA) pCreateSurface, &hSurface); pSurfaceGlobal->lPitch = SurfaceGlobal.lPitch; pSurfaceGlobal->fpVidMem = SurfaceGlobal.fpVidMem; pSurfaceGlobal->dwBlockSizeX = SurfaceGlobal.dwBlockSizeX; pSurfaceGlobal->dwBlockSizeY = SurfaceGlobal.dwBlockSizeY; if (hSurface) { pCreateSurface->lplpSList[0]->hDDSurface = (ULONG_PTR) hSurface; } // fpVidMem is the real per-surface return value, so for the function // return value we'll simply return that of the last call: return(dwRet); } /*****************************Private*Routine******************************\ * DdDestroyD3DBuffer * * History: * 20-Jan-1998 -by- Anantha Kancherla [anankan] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdDestroyD3DBuffer( LPDDHAL_DESTROYSURFACEDATA pDestroySurface ) { DWORD dwRet; LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal; dwRet = DDHAL_DRIVER_NOTHANDLED; pSurfaceLocal = pDestroySurface->lpDDSurface; if (pSurfaceLocal->hDDSurface != 0) { dwRet = NtGdiDdDestroyD3DBuffer((HANDLE) pSurfaceLocal->hDDSurface); } return(dwRet); } /*****************************Private*Routine******************************\ * DdSetColorKey * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdSetColorKey( LPDDHAL_SETCOLORKEYDATA pSetColorKey ) { return(NtGdiDdSetColorKey((HANDLE) pSetColorKey->lpDDSurface->hDDSurface, (PDD_SETCOLORKEYDATA) pSetColorKey)); } /*****************************Private*Routine******************************\ * DdAddAttachedSurface * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdAddAttachedSurface( LPDDHAL_ADDATTACHEDSURFACEDATA pAddAttachedSurface ) { return(NtGdiDdAddAttachedSurface((HANDLE) pAddAttachedSurface->lpDDSurface->hDDSurface, (HANDLE) pAddAttachedSurface->lpSurfAttached->hDDSurface, (PDD_ADDATTACHEDSURFACEDATA) pAddAttachedSurface)); } /*****************************Private*Routine******************************\ * DdUpdateOverlay * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdUpdateOverlay( LPDDHAL_UPDATEOVERLAYDATA pUpdateOverlay ) { // Kernel doesn't track the color keys in the surface, so we'll always // convert any calls that reference them to ones where we explicitly // pass the key as a parameter, and pull the key out of the user-mode // surface: if (pUpdateOverlay->dwFlags & DDOVER_KEYDEST) { pUpdateOverlay->dwFlags &= ~DDOVER_KEYDEST; pUpdateOverlay->dwFlags |= DDOVER_KEYDESTOVERRIDE; pUpdateOverlay->overlayFX.dckDestColorkey = pUpdateOverlay->lpDDDestSurface->ddckCKDestOverlay; } if (pUpdateOverlay->dwFlags & DDOVER_KEYSRC) { pUpdateOverlay->dwFlags &= ~DDOVER_KEYSRC; pUpdateOverlay->dwFlags |= DDOVER_KEYSRCOVERRIDE; pUpdateOverlay->overlayFX.dckSrcColorkey = pUpdateOverlay->lpDDSrcSurface->ddckCKSrcOverlay; } return(NtGdiDdUpdateOverlay((HANDLE) pUpdateOverlay->lpDDDestSurface->hDDSurface, (HANDLE) pUpdateOverlay->lpDDSrcSurface->hDDSurface, (PDD_UPDATEOVERLAYDATA) pUpdateOverlay)); } /*****************************Private*Routine******************************\ * DdSetOverlayPosition * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdSetOverlayPosition( LPDDHAL_SETOVERLAYPOSITIONDATA pSetOverlayPosition ) { return(NtGdiDdSetOverlayPosition((HANDLE) pSetOverlayPosition->lpDDSrcSurface->hDDSurface, (HANDLE) pSetOverlayPosition->lpDDDestSurface->hDDSurface, (PDD_SETOVERLAYPOSITIONDATA) pSetOverlayPosition)); } /*****************************Private*Routine******************************\ * DdGetScanLine * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdGetScanLine( LPDDHAL_GETSCANLINEDATA pGetScanLine ) { return(NtGdiDdGetScanLine(DD_HANDLE(pGetScanLine->lpDD->hDD), (PDD_GETSCANLINEDATA) pGetScanLine)); } /*****************************Private*Routine******************************\ * DdSetExclusiveMode * * History: * 22-Apr-1998 -by- John Stephens [johnstep] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdSetExclusiveMode( LPDDHAL_SETEXCLUSIVEMODEDATA pSetExclusiveMode ) { return(NtGdiDdSetExclusiveMode( DD_HANDLE(pSetExclusiveMode->lpDD->hDD), (PDD_SETEXCLUSIVEMODEDATA) pSetExclusiveMode)); } /*****************************Private*Routine******************************\ * DdFlipToGDISurface * * History: * 22-Apr-1998 -by- John Stephens [johnstep] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdFlipToGDISurface( LPDDHAL_FLIPTOGDISURFACEDATA pFlipToGDISurface ) { return(NtGdiDdFlipToGDISurface( DD_HANDLE(pFlipToGDISurface->lpDD->hDD), (PDD_FLIPTOGDISURFACEDATA) pFlipToGDISurface)); } /*****************************Private*Routine******************************\ * DdGetAvailDriverMemory * * History: * 16-Feb-1997 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdGetAvailDriverMemory( LPDDHAL_GETAVAILDRIVERMEMORYDATA pGetAvailDriverMemory ) { return(NtGdiDdGetAvailDriverMemory( DD_HANDLE(pGetAvailDriverMemory->lpDD->hDD), (PDD_GETAVAILDRIVERMEMORYDATA) pGetAvailDriverMemory)); } /*****************************Private*Routine******************************\ * DdColorControl * * History: * 16-Feb-1997 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdColorControl( LPDDHAL_COLORCONTROLDATA pColorControl ) { return(NtGdiDdColorControl((HANDLE) pColorControl->lpDDSurface->hDDSurface, (PDD_COLORCONTROLDATA) pColorControl)); } /*****************************Private*Routine******************************\ * DdCreateSurfaceEx * * History: * 19-Feb-1999 -by- Kan Qiu [kanqiu] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdCreateSurfaceEx( LPDDHAL_CREATESURFACEEXDATA pCreateSurfaceExData ) { pCreateSurfaceExData->ddRVal=NtGdiDdCreateSurfaceEx( DD_HANDLE(pCreateSurfaceExData->lpDDLcl->lpGbl->hDD), (HANDLE)(pCreateSurfaceExData->lpDDSLcl->hDDSurface), pCreateSurfaceExData->lpDDSLcl->lpSurfMore->dwSurfaceHandle); return DDHAL_DRIVER_HANDLED; } /*****************************Private*Routine******************************\ * DdGetDriverInfo * * History: * 16-Feb-1997 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ DWORD APIENTRY DdGetDriverInfo( LPDDHAL_GETDRIVERINFODATA lpGetDriverInfoData ) { DD_GETDRIVERINFODATA GetDriverInfoData; DWORD dwRet; HANDLE hDirectDraw; GetDriverInfoData.guidInfo = lpGetDriverInfoData->guidInfo; hDirectDraw = DD_HANDLE( (HANDLE) lpGetDriverInfoData->dwContext ); if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_VideoPortCallbacks)) { DD_VIDEOPORTCALLBACKS VideoPortCallBacks; LPDDHAL_DDVIDEOPORTCALLBACKS lpVideoPortCallBacks; // Translate VideoPort call-backs to user-mode: lpVideoPortCallBacks = lpGetDriverInfoData->lpvData; GetDriverInfoData.lpvData = &VideoPortCallBacks; GetDriverInfoData.dwExpectedSize = sizeof(VideoPortCallBacks); dwRet = NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); RtlZeroMemory(lpVideoPortCallBacks, sizeof(*lpVideoPortCallBacks)); lpGetDriverInfoData->dwActualSize = sizeof(*lpVideoPortCallBacks); lpVideoPortCallBacks->dwSize = sizeof(*lpVideoPortCallBacks); lpVideoPortCallBacks->dwFlags = VideoPortCallBacks.dwFlags | DDHAL_VPORT32_CREATEVIDEOPORT | DDHAL_VPORT32_DESTROY | DDHAL_VPORT32_UPDATE | DDHAL_VPORT32_FLIP; lpVideoPortCallBacks->dwFlags &= ~(DDHAL_VPORT32_GETAUTOFLIPSURF); lpVideoPortCallBacks->CreateVideoPort = DvpCreateVideoPort; lpVideoPortCallBacks->DestroyVideoPort = DvpDestroyVideoPort; lpVideoPortCallBacks->UpdateVideoPort = DvpUpdateVideoPort; lpVideoPortCallBacks->FlipVideoPort = DvpFlipVideoPort; if (VideoPortCallBacks.CanCreateVideoPort) { lpVideoPortCallBacks->CanCreateVideoPort = DvpCanCreateVideoPort; } if (VideoPortCallBacks.GetVideoPortBandwidth) { lpVideoPortCallBacks->GetVideoPortBandwidth = DvpGetVideoPortBandwidth; } if (VideoPortCallBacks.GetVideoPortInputFormats) { lpVideoPortCallBacks->GetVideoPortInputFormats = DvpGetVideoPortInputFormats; } if (VideoPortCallBacks.GetVideoPortOutputFormats) { lpVideoPortCallBacks->GetVideoPortOutputFormats = DvpGetVideoPortOutputFormats; } if (VideoPortCallBacks.GetVideoPortField) { lpVideoPortCallBacks->GetVideoPortField = DvpGetVideoPortField; } if (VideoPortCallBacks.GetVideoPortLine) { lpVideoPortCallBacks->GetVideoPortLine = DvpGetVideoPortLine; } if (VideoPortCallBacks.GetVideoPortConnectInfo) { lpVideoPortCallBacks->GetVideoPortConnectInfo = DvpGetVideoPortConnectInfo; } if (VideoPortCallBacks.GetVideoPortFlipStatus) { lpVideoPortCallBacks->GetVideoPortFlipStatus = DvpGetVideoPortFlipStatus; } if (VideoPortCallBacks.WaitForVideoPortSync) { lpVideoPortCallBacks->WaitForVideoPortSync = DvpWaitForVideoPortSync; } if (VideoPortCallBacks.GetVideoSignalStatus) { lpVideoPortCallBacks->GetVideoSignalStatus = DvpGetVideoSignalStatus; } if (VideoPortCallBacks.ColorControl) { lpVideoPortCallBacks->ColorControl = DvpColorControl; } } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_ColorControlCallbacks)) { DD_COLORCONTROLCALLBACKS ColorControlCallBacks; LPDDHAL_DDCOLORCONTROLCALLBACKS lpColorControlCallBacks; // Translate ColorControl call-backs to user-mode: lpColorControlCallBacks = lpGetDriverInfoData->lpvData; GetDriverInfoData.lpvData = &ColorControlCallBacks; GetDriverInfoData.dwExpectedSize = sizeof(ColorControlCallBacks); dwRet = NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); RtlZeroMemory(lpColorControlCallBacks, sizeof(*lpColorControlCallBacks)); lpGetDriverInfoData->dwActualSize = sizeof(*lpColorControlCallBacks); lpColorControlCallBacks->dwSize = sizeof(*lpColorControlCallBacks); lpColorControlCallBacks->dwFlags = ColorControlCallBacks.dwFlags; if (ColorControlCallBacks.ColorControl) { lpColorControlCallBacks->ColorControl = DdColorControl; } } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_MiscellaneousCallbacks)) { DD_MISCELLANEOUSCALLBACKS MiscellaneousCallBacks; LPDDHAL_DDMISCELLANEOUSCALLBACKS lpMiscellaneousCallBacks; // Translate miscellaneous call-backs to user-mode: lpMiscellaneousCallBacks = lpGetDriverInfoData->lpvData; GetDriverInfoData.lpvData = &MiscellaneousCallBacks; GetDriverInfoData.dwExpectedSize = sizeof(MiscellaneousCallBacks); lpMiscellaneousCallBacks->dwFlags = 0; // Don't return what the driver returns because we always want this // to suceed NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); GetDriverInfoData.dwActualSize = sizeof(MiscellaneousCallBacks); GetDriverInfoData.ddRVal = DD_OK; dwRet = DDHAL_DRIVER_HANDLED; RtlZeroMemory(lpMiscellaneousCallBacks, sizeof(*lpMiscellaneousCallBacks)); lpGetDriverInfoData->dwActualSize = sizeof(*lpMiscellaneousCallBacks); lpMiscellaneousCallBacks->dwSize = sizeof(*lpMiscellaneousCallBacks); lpMiscellaneousCallBacks->dwFlags = MiscellaneousCallBacks.dwFlags; //We always implement this callback now that kernel owns vidmem management lpMiscellaneousCallBacks->GetAvailDriverMemory = DdGetAvailDriverMemory; lpMiscellaneousCallBacks->dwFlags |= DDHAL_MISCCB32_GETAVAILDRIVERMEMORY; } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_Miscellaneous2Callbacks)) { DD_MISCELLANEOUS2CALLBACKS Miscellaneous2CallBacks; LPDDHAL_DDMISCELLANEOUS2CALLBACKS lpMiscellaneous2CallBacks; // Translate miscellaneous call-backs to user-mode: lpMiscellaneous2CallBacks = lpGetDriverInfoData->lpvData; GetDriverInfoData.lpvData = &Miscellaneous2CallBacks; GetDriverInfoData.dwExpectedSize = sizeof(Miscellaneous2CallBacks); dwRet = NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); RtlZeroMemory(lpMiscellaneous2CallBacks, sizeof(*lpMiscellaneous2CallBacks)); lpGetDriverInfoData->dwActualSize = sizeof(*lpMiscellaneous2CallBacks); lpMiscellaneous2CallBacks->dwSize = sizeof(*lpMiscellaneous2CallBacks); lpMiscellaneous2CallBacks->dwFlags = Miscellaneous2CallBacks.dwFlags; if (Miscellaneous2CallBacks.AlphaBlt) { lpMiscellaneous2CallBacks->AlphaBlt = DdAlphaBlt; } if (Miscellaneous2CallBacks.GetDriverState) { lpMiscellaneous2CallBacks->GetDriverState = (LPDDHAL_GETDRIVERSTATE)NtGdiDdGetDriverState; } if (Miscellaneous2CallBacks.CreateSurfaceEx) { lpMiscellaneous2CallBacks->CreateSurfaceEx = (LPDDHAL_CREATESURFACEEX)DdCreateSurfaceEx; } // Dont pass back DestroyDDLocal } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_NTCallbacks)) { DD_NTCALLBACKS NTCallBacks; LPDDHAL_DDNTCALLBACKS lpNTCallBacks; // Translate NT call-backs to user-mode: lpNTCallBacks = lpGetDriverInfoData->lpvData; GetDriverInfoData.lpvData = &NTCallBacks; GetDriverInfoData.dwExpectedSize = sizeof(NTCallBacks); dwRet = NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); RtlZeroMemory(lpNTCallBacks, sizeof(*lpNTCallBacks)); lpGetDriverInfoData->dwActualSize = sizeof(*lpNTCallBacks); lpNTCallBacks->dwSize = sizeof(*lpNTCallBacks); lpNTCallBacks->dwFlags = NTCallBacks.dwFlags; // FreeDriverMemory is also an NTCallback but it will only be called // from kernel-mode, so we don't have a user-mode thunk function. if (NTCallBacks.SetExclusiveMode) { lpNTCallBacks->SetExclusiveMode = DdSetExclusiveMode; } if (NTCallBacks.FlipToGDISurface) { lpNTCallBacks->FlipToGDISurface = DdFlipToGDISurface; } } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_D3DCallbacks2)) { // Fill NULL for D3DCALLBACKS2. LPD3DHAL_CALLBACKS2 lpD3dCallbacks2; lpD3dCallbacks2 = lpGetDriverInfoData->lpvData; RtlZeroMemory(lpD3dCallbacks2, sizeof(*lpD3dCallbacks2)); lpGetDriverInfoData->dwActualSize = sizeof(*lpD3dCallbacks2); lpD3dCallbacks2->dwSize = sizeof(*lpD3dCallbacks2); GetDriverInfoData.ddRVal = DDERR_GENERIC; dwRet = DDHAL_DRIVER_HANDLED; } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_D3DCallbacks3)) { D3DNTHAL_CALLBACKS3 D3dCallbacks3; LPD3DHAL_CALLBACKS3 lpD3dCallbacks3; // Translate D3DNTHAL_CALLBACKS3 to user-mode. lpD3dCallbacks3 = lpGetDriverInfoData->lpvData; GetDriverInfoData.lpvData = &D3dCallbacks3; GetDriverInfoData.dwExpectedSize = sizeof(D3dCallbacks3); dwRet = NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); RtlZeroMemory((PVOID)lpD3dCallbacks3, sizeof(*lpD3dCallbacks3)); lpGetDriverInfoData->dwActualSize = sizeof(*lpD3dCallbacks3); lpD3dCallbacks3->dwSize = sizeof(*lpD3dCallbacks3); lpD3dCallbacks3->dwFlags = D3dCallbacks3.dwFlags; lpD3dCallbacks3->Clear2 = NULL; lpD3dCallbacks3->lpvReserved = NULL; if (D3dCallbacks3.ValidateTextureStageState != NULL) { lpD3dCallbacks3->ValidateTextureStageState = (LPD3DHAL_VALIDATETEXTURESTAGESTATECB)NtGdiD3dValidateTextureStageState; } if (D3dCallbacks3.DrawPrimitives2 != NULL) { lpD3dCallbacks3->DrawPrimitives2 = (LPD3DHAL_DRAWPRIMITIVES2CB)D3dDrawPrimitives2; } } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_D3DParseUnknownCommandCallback)) { // On NT we ignore this callback lpGetDriverInfoData->ddRVal = DD_OK; return DDHAL_DRIVER_HANDLED; } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_MotionCompCallbacks)) { DD_MOTIONCOMPCALLBACKS MotionCompCallbacks; LPDDHAL_DDMOTIONCOMPCALLBACKS lpMotionCompCallbacks; // Translate Video call-backs to user-mode: lpMotionCompCallbacks = lpGetDriverInfoData->lpvData; GetDriverInfoData.lpvData = &MotionCompCallbacks; GetDriverInfoData.dwExpectedSize = sizeof(MotionCompCallbacks); dwRet = NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); RtlZeroMemory(lpMotionCompCallbacks, sizeof(*lpMotionCompCallbacks)); lpGetDriverInfoData->dwActualSize = sizeof(*lpMotionCompCallbacks); lpMotionCompCallbacks->dwSize = sizeof(*lpMotionCompCallbacks); lpMotionCompCallbacks->dwFlags = MotionCompCallbacks.dwFlags | DDHAL_MOCOMP32_CREATE | DDHAL_MOCOMP32_DESTROY; lpMotionCompCallbacks->CreateMoComp = DdCreateMoComp; lpMotionCompCallbacks->DestroyMoComp = DdDestroyMoComp; if (MotionCompCallbacks.GetMoCompGuids) { lpMotionCompCallbacks->GetMoCompGuids = DdGetMoCompGuids; } if (MotionCompCallbacks.GetMoCompFormats) { lpMotionCompCallbacks->GetMoCompFormats = DdGetMoCompFormats; } if (MotionCompCallbacks.GetMoCompBuffInfo) { lpMotionCompCallbacks->GetMoCompBuffInfo = DdGetMoCompBuffInfo; } if (MotionCompCallbacks.GetInternalMoCompInfo) { lpMotionCompCallbacks->GetInternalMoCompInfo = DdGetInternalMoCompInfo; } if (MotionCompCallbacks.BeginMoCompFrame) { lpMotionCompCallbacks->BeginMoCompFrame = DdBeginMoCompFrame; } if (MotionCompCallbacks.EndMoCompFrame) { lpMotionCompCallbacks->EndMoCompFrame = DdEndMoCompFrame; } if (MotionCompCallbacks.RenderMoComp) { lpMotionCompCallbacks->RenderMoComp = DdRenderMoComp; } if (MotionCompCallbacks.QueryMoCompStatus) { lpMotionCompCallbacks->QueryMoCompStatus = DdQueryMoCompStatus; } } else if (IsEqualIID(&lpGetDriverInfoData->guidInfo, &GUID_VPE2Callbacks)) { LPDDHAL_DDVPE2CALLBACKS lpVPE2CallBacks; // Translate NT call-backs to user-mode: lpVPE2CallBacks = lpGetDriverInfoData->lpvData; RtlZeroMemory(lpVPE2CallBacks, sizeof(*lpVPE2CallBacks)); lpGetDriverInfoData->dwActualSize = sizeof(*lpVPE2CallBacks); lpVPE2CallBacks->dwSize = sizeof(*lpVPE2CallBacks); lpVPE2CallBacks->dwFlags = DDHAL_VPE2CB32_ACQUIRENOTIFICATION | DDHAL_VPE2CB32_RELEASENOTIFICATION; lpVPE2CallBacks->AcquireNotification = DvpAcquireNotification; lpVPE2CallBacks->ReleaseNotification = DvpReleaseNotification; GetDriverInfoData.ddRVal = DD_OK; dwRet = DDHAL_DRIVER_HANDLED; } else { // Do data call: GetDriverInfoData.dwExpectedSize = lpGetDriverInfoData->dwExpectedSize; GetDriverInfoData.lpvData = lpGetDriverInfoData->lpvData; dwRet = NtGdiDdGetDriverInfo(hDirectDraw, &GetDriverInfoData); lpGetDriverInfoData->dwActualSize = GetDriverInfoData.dwActualSize; } lpGetDriverInfoData->ddRVal = GetDriverInfoData.ddRVal; return(dwRet); } /******************************Public*Routine******************************\ * DdCreateDirectDrawObject * * When 'hdc' is 0, this function creates a 'global' DirectDraw object that * may be used by any process, as a work-around for the DirectDraw folks. * In reality, we still create a local DirectDraw object that is specific * to this process, and whenever we're called with this 'special' global * handle, we substitute the process-specific handle. See the declaration * of 'ghDirectDraw' for a commonet on why we do this. * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdCreateDirectDrawObject( // AKA 'GdiEntry1' LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, HDC hdc ) { BOOL b; b = FALSE; if (hdc == 0) { // Only one 'global' DirectDraw object may be active at a time. // // Note that this 'ghDirectDraw' assignment isn't thread safe; // DirectDraw must have its own critical section held when making // this call. (Naturally, the kernel always properly synchronizes // itself in the NtGdi call.) if (ghDirectDraw == 0) { hdc = CreateDCW(L"Display", NULL, NULL, NULL); if (hdc != 0) { ghDirectDraw = NtGdiDdCreateDirectDrawObject(hdc); DeleteDC(hdc); } } if (ghDirectDraw) { gcDirectDraw++; b = TRUE; } // Mark the DirectDraw object handle stored in the DirectDraw // object as 'special' by making it zero: pDirectDrawGlobal->hDD = 0; } else { pDirectDrawGlobal->hDD = (ULONG_PTR) NtGdiDdCreateDirectDrawObject(hdc); b = (pDirectDrawGlobal->hDD != 0); } return(b); } /*****************************Private*Routine******************************\ * DdQueryDirectDrawObject * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdQueryDirectDrawObject( // AKA 'GdiEntry2' LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, LPDDHALINFO pHalInfo, LPDDHAL_DDCALLBACKS pDDCallBacks, LPDDHAL_DDSURFACECALLBACKS pDDSurfaceCallBacks, LPDDHAL_DDPALETTECALLBACKS pDDPaletteCallBacks, LPD3DHAL_CALLBACKS pD3dCallbacks, LPD3DHAL_GLOBALDRIVERDATA pD3dDriverData, LPDDHAL_DDEXEBUFCALLBACKS pD3dBufferCallbacks, LPDDSURFACEDESC pD3dTextureFormats, LPDWORD pdwFourCC, // May be NULL LPVIDMEM pvmList // May be NULL ) { DD_HALINFO HalInfo; DWORD adwCallBackFlags[3]; DWORD dwFlags; VIDEOMEMORY* pVideoMemoryList; VIDEOMEMORY* pVideoMemory; DWORD dwNumHeaps; DWORD dwNumFourCC; D3DNTHAL_CALLBACKS D3dCallbacks; D3DNTHAL_GLOBALDRIVERDATA D3dDriverData; DD_D3DBUFCALLBACKS D3dBufferCallbacks; pVideoMemoryList = NULL; if( (pvmList != NULL) && (pHalInfo->vmiData.dwNumHeaps != 0) ) { pVideoMemoryList = (VIDEOMEMORY*) LocalAlloc(LMEM_ZEROINIT, sizeof(VIDEOMEMORY) * pHalInfo->vmiData.dwNumHeaps); if (pVideoMemoryList == NULL) return(FALSE); } // // Initialize to zero, so that Wow64's genthnk won't // thunk bogus pointers. // RtlZeroMemory(&HalInfo, sizeof(HalInfo)); RtlZeroMemory(&D3dCallbacks, sizeof(D3dCallbacks)); RtlZeroMemory(&D3dDriverData, sizeof(D3dDriverData)); RtlZeroMemory(&D3dBufferCallbacks, sizeof(D3dBufferCallbacks)); // // set dwNumTextureFormats in the global driver data so that WoW64 // can thunk the texture formats // if( (NULL != pD3dTextureFormats) && (NULL != pD3dDriverData) ) { D3dDriverData.dwNumTextureFormats = pD3dDriverData->dwNumTextureFormats; } if (!NtGdiDdQueryDirectDrawObject(DD_HANDLE(pDirectDrawGlobal->hDD), &HalInfo, &adwCallBackFlags[0], &D3dCallbacks, &D3dDriverData, &D3dBufferCallbacks, pD3dTextureFormats, &dwNumHeaps, pVideoMemoryList, &dwNumFourCC, pdwFourCC)) { if (pVideoMemoryList != NULL) LocalFree(pVideoMemoryList); return(FALSE); } // Convert from the kernel-mode data structures to the user-mode // ones: memset(pHalInfo, 0, sizeof(DDHALINFO)); pHalInfo->dwSize = sizeof(DDHALINFO); pHalInfo->lpDDCallbacks = pDDCallBacks; pHalInfo->lpDDSurfaceCallbacks = pDDSurfaceCallBacks; pHalInfo->lpDDPaletteCallbacks = pDDPaletteCallBacks; if (D3dCallbacks.dwSize != 0 && D3dDriverData.dwSize != 0) { pHalInfo->lpD3DGlobalDriverData = (LPVOID)pD3dDriverData; pHalInfo->lpD3DHALCallbacks = (LPVOID)pD3dCallbacks; if( D3dBufferCallbacks.dwSize != 0 ) pHalInfo->lpDDExeBufCallbacks = (LPDDHAL_DDEXEBUFCALLBACKS)pD3dBufferCallbacks; } pHalInfo->vmiData.fpPrimary = 0; pHalInfo->vmiData.dwFlags = HalInfo.vmiData.dwFlags; pHalInfo->vmiData.dwDisplayWidth = HalInfo.vmiData.dwDisplayWidth; pHalInfo->vmiData.dwDisplayHeight = HalInfo.vmiData.dwDisplayHeight; pHalInfo->vmiData.lDisplayPitch = HalInfo.vmiData.lDisplayPitch; pHalInfo->vmiData.ddpfDisplay = HalInfo.vmiData.ddpfDisplay; pHalInfo->vmiData.dwOffscreenAlign = HalInfo.vmiData.dwOffscreenAlign; pHalInfo->vmiData.dwOverlayAlign = HalInfo.vmiData.dwOverlayAlign; pHalInfo->vmiData.dwTextureAlign = HalInfo.vmiData.dwTextureAlign; pHalInfo->vmiData.dwZBufferAlign = HalInfo.vmiData.dwZBufferAlign; pHalInfo->vmiData.dwAlphaAlign = HalInfo.vmiData.dwAlphaAlign; pHalInfo->vmiData.dwNumHeaps = dwNumHeaps; pHalInfo->vmiData.pvmList = pvmList; ASSERTGDI(sizeof(pHalInfo->ddCaps) == sizeof(HalInfo.ddCaps), "DdQueryDirectDrawObject():DDCORECAPS structure size is not equal to DDNTCORECAPS\n"); RtlCopyMemory(&(pHalInfo->ddCaps),&(HalInfo.ddCaps),sizeof(HalInfo.ddCaps)); pHalInfo->ddCaps.dwNumFourCCCodes = dwNumFourCC; pHalInfo->ddCaps.dwRops[0xCC / 32] = 1 << (0xCC % 32); // Only SRCCOPY pHalInfo->lpdwFourCC = pdwFourCC; pHalInfo->dwFlags = HalInfo.dwFlags | DDHALINFO_GETDRIVERINFOSET; pHalInfo->GetDriverInfo = DdGetDriverInfo; if (pDDCallBacks != NULL) { memset(pDDCallBacks, 0, sizeof(DDHAL_DDCALLBACKS)); dwFlags = adwCallBackFlags[0]; pDDCallBacks->dwSize = sizeof(DDHAL_DDCALLBACKS); pDDCallBacks->dwFlags = dwFlags; // Always set CreateSurface so that the kernel mode // heap manager has a chance to allocate the surface if // necessary. It will take care of calling the driver // if necessary. pDDCallBacks->CreateSurface = DdCreateSurface; pDDCallBacks->dwFlags |= DDHAL_CB32_CREATESURFACE; if (dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK) pDDCallBacks->WaitForVerticalBlank = DdWaitForVerticalBlank; if (dwFlags & DDHAL_CB32_CANCREATESURFACE) pDDCallBacks->CanCreateSurface = DdCanCreateSurface; if (dwFlags & DDHAL_CB32_GETSCANLINE) pDDCallBacks->GetScanLine = DdGetScanLine; } if (pDDSurfaceCallBacks != NULL) { memset(pDDSurfaceCallBacks, 0, sizeof(DDHAL_DDSURFACECALLBACKS)); dwFlags = adwCallBackFlags[1]; pDDSurfaceCallBacks->dwSize = sizeof(DDHAL_DDSURFACECALLBACKS); pDDSurfaceCallBacks->dwFlags = (DDHAL_SURFCB32_LOCK | DDHAL_SURFCB32_UNLOCK | DDHAL_SURFCB32_SETCOLORKEY | DDHAL_SURFCB32_DESTROYSURFACE) | dwFlags; pDDSurfaceCallBacks->Lock = DdLock; pDDSurfaceCallBacks->Unlock = DdUnlock; pDDSurfaceCallBacks->SetColorKey = DdSetColorKey; pDDSurfaceCallBacks->DestroySurface = DdDestroySurface; if (dwFlags & DDHAL_SURFCB32_FLIP) pDDSurfaceCallBacks->Flip = DdFlip; if (dwFlags & DDHAL_SURFCB32_BLT) pDDSurfaceCallBacks->Blt = DdBlt; if (dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) pDDSurfaceCallBacks->GetBltStatus = DdGetBltStatus; if (dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) pDDSurfaceCallBacks->GetFlipStatus = DdGetFlipStatus; if (dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) pDDSurfaceCallBacks->UpdateOverlay = DdUpdateOverlay; if (dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) pDDSurfaceCallBacks->SetOverlayPosition = DdSetOverlayPosition; if (dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) pDDSurfaceCallBacks->AddAttachedSurface = DdAddAttachedSurface; } if (pDDPaletteCallBacks != NULL) { memset(pDDPaletteCallBacks, 0, sizeof(DDHAL_DDPALETTECALLBACKS)); dwFlags = adwCallBackFlags[2]; pDDPaletteCallBacks->dwSize = sizeof(DDHAL_DDPALETTECALLBACKS); pDDPaletteCallBacks->dwFlags = dwFlags; } if (pD3dCallbacks != NULL) { memset(pD3dCallbacks, 0, sizeof(D3DHAL_CALLBACKS)); if (D3dCallbacks.dwSize > 0) { pD3dCallbacks->dwSize = sizeof(D3DHAL_CALLBACKS); if (D3dCallbacks.ContextCreate != NULL) { pD3dCallbacks->ContextCreate = D3dContextCreate; } if (D3dCallbacks.ContextDestroy != NULL) { pD3dCallbacks->ContextDestroy = (LPD3DHAL_CONTEXTDESTROYCB)NtGdiD3dContextDestroy; } if (D3dCallbacks.ContextDestroyAll != NULL) { pD3dCallbacks->ContextDestroyAll = (LPD3DHAL_CONTEXTDESTROYALLCB)NtGdiD3dContextDestroyAll; } pD3dCallbacks->SceneCapture = NULL; pD3dCallbacks->TextureCreate = NULL; pD3dCallbacks->TextureDestroy = NULL; pD3dCallbacks->TextureSwap = NULL; pD3dCallbacks->TextureGetSurf = NULL; } } if (pD3dDriverData != NULL) { *pD3dDriverData = *(D3DHAL_GLOBALDRIVERDATA *)&D3dDriverData; pD3dDriverData->lpTextureFormats = pD3dTextureFormats; } if (pD3dBufferCallbacks != NULL) { memset( pD3dBufferCallbacks, 0, sizeof(DDHAL_DDEXEBUFCALLBACKS)); if (D3dBufferCallbacks.dwSize > 0) { pD3dBufferCallbacks->dwSize = sizeof(DDHAL_DDEXEBUFCALLBACKS); pD3dBufferCallbacks->dwFlags = D3dBufferCallbacks.dwFlags; if (D3dBufferCallbacks.CanCreateD3DBuffer != NULL) { pD3dBufferCallbacks->CanCreateExecuteBuffer = (LPDDHALEXEBUFCB_CANCREATEEXEBUF)DdCanCreateD3DBuffer; } if (D3dBufferCallbacks.CreateD3DBuffer != NULL) { pD3dBufferCallbacks->CreateExecuteBuffer = (LPDDHALEXEBUFCB_CREATEEXEBUF)DdCreateD3DBuffer; } if (D3dBufferCallbacks.DestroyD3DBuffer != NULL) { pD3dBufferCallbacks->DestroyExecuteBuffer = (LPDDHALEXEBUFCB_DESTROYEXEBUF)DdDestroyD3DBuffer; } if (D3dBufferCallbacks.LockD3DBuffer != NULL) { pD3dBufferCallbacks->LockExecuteBuffer = (LPDDHALEXEBUFCB_LOCKEXEBUF)DdLockD3D; } if (D3dBufferCallbacks.UnlockD3DBuffer != NULL) { pD3dBufferCallbacks->UnlockExecuteBuffer = (LPDDHALEXEBUFCB_UNLOCKEXEBUF)DdUnlockD3D; } } } if (pVideoMemoryList != NULL) { pVideoMemory = pVideoMemoryList; while (dwNumHeaps-- != 0) { pvmList->dwFlags = pVideoMemory->dwFlags; pvmList->fpStart = pVideoMemory->fpStart; pvmList->fpEnd = pVideoMemory->fpEnd; pvmList->ddsCaps = pVideoMemory->ddsCaps; pvmList->ddsCapsAlt = pVideoMemory->ddsCapsAlt; pvmList->dwHeight = pVideoMemory->dwHeight; pvmList++; pVideoMemory++; } LocalFree(pVideoMemoryList); } return(TRUE); } /*****************************Private*Routine******************************\ * DdDeleteDirectDrawObject * * Note that all associated surface objects must be deleted before the * DirectDrawObject can be deleted. * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdDeleteDirectDrawObject( // AKA 'GdiEntry3' LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal ) { BOOL b = FALSE; if (pDirectDrawGlobal->hDD != 0) { b = NtGdiDdDeleteDirectDrawObject((HANDLE) pDirectDrawGlobal->hDD); } else if (ghDirectDraw != 0) { b = TRUE; if (--gcDirectDraw == 0) { b = NtGdiDdDeleteDirectDrawObject(ghDirectDraw); ghDirectDraw = 0; } } return(b); } /*****************************Private*Routine******************************\ * bDdCreateSurfaceObject * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL bDdCreateSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, BOOL bComplete ) { LPDDRAWI_DDRAWSURFACE_GBL pSurfaceGlobal; DD_SURFACE_GLOBAL SurfaceGlobal; DD_SURFACE_LOCAL SurfaceLocal; DD_SURFACE_MORE SurfaceMore; LPATTACHLIST pAttach; BOOL bAttached; // // Wow64 genthnk will automatically thunk these structures, however, // since these structures are pointer dependent, we need to make sure // to NULL out these pointers so that Wow64 won't thunk them // RtlZeroMemory(&SurfaceLocal, sizeof(SurfaceLocal)); RtlZeroMemory(&SurfaceGlobal, sizeof(SurfaceGlobal)); RtlZeroMemory(&SurfaceMore, sizeof(SurfaceMore)); SurfaceLocal.dwFlags = pSurfaceLocal->dwFlags; SurfaceLocal.ddsCaps = pSurfaceLocal->ddsCaps; SurfaceMore.ddsCapsEx = pSurfaceLocal->lpSurfMore->ddsCapsEx; SurfaceMore.dwSurfaceHandle = pSurfaceLocal->lpSurfMore->dwSurfaceHandle; pSurfaceGlobal = pSurfaceLocal->lpGbl; SurfaceGlobal.fpVidMem = pSurfaceGlobal->fpVidMem; SurfaceGlobal.lPitch = pSurfaceGlobal->lPitch; SurfaceGlobal.wHeight = pSurfaceGlobal->wHeight; SurfaceGlobal.wWidth = pSurfaceGlobal->wWidth; // If HASPIXELFORMAT is not set, we have to get the pixel format out // of the global DirectDraw object: if (pSurfaceLocal->dwFlags & DDRAWISURF_HASPIXELFORMAT) { SurfaceGlobal.ddpfSurface = pSurfaceGlobal->ddpfSurface; } else { SurfaceGlobal.ddpfSurface = pSurfaceGlobal->lpDD->vmiData.ddpfDisplay; } pSurfaceLocal->hDDSurface = (ULONG_PTR) NtGdiDdCreateSurfaceObject(DD_HANDLE(pSurfaceGlobal->lpDD->hDD), (HANDLE) pSurfaceLocal->hDDSurface, &SurfaceLocal, &SurfaceMore, &SurfaceGlobal, bComplete); return(pSurfaceLocal->hDDSurface != 0); } /*****************************Private*Routine******************************\ * DdCreateSurfaceObject * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdCreateSurfaceObject( // AKA 'GdiEntry4' LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, BOOL bUnused ) { // TRUE means surface is now complete: return(bDdCreateSurfaceObject(pSurfaceLocal, TRUE)); } /*****************************Private*Routine******************************\ * DdDeleteSurfaceObject * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdDeleteSurfaceObject( // AKA 'GdiEntry5' LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal ) { BOOL b; b = TRUE; if (pSurfaceLocal->hDDSurface != 0) { b = NtGdiDdDeleteSurfaceObject((HANDLE) pSurfaceLocal->hDDSurface); pSurfaceLocal->hDDSurface = 0; // Needed so CreateSurfaceObject works } return(b); } /*****************************Private*Routine******************************\ * DdResetVisrgn * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdResetVisrgn( // AKA 'GdiEntry6' LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, HWND hWnd ) { return(NtGdiDdResetVisrgn((HANDLE) pSurfaceLocal->hDDSurface, hWnd)); } /*****************************Private*Routine******************************\ * DdGetDC * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ HDC APIENTRY DdGetDC( // AKA 'GdiEntry7' LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, LPPALETTEENTRY pPalette ) { return(NtGdiDdGetDC((HANDLE) pSurfaceLocal->hDDSurface, pPalette)); } /*****************************Private*Routine******************************\ * DdReleaseDC * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdReleaseDC( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal // AKA 'GdiEntry8' ) { return(NtGdiDdReleaseDC((HANDLE) pSurfaceLocal->hDDSurface)); } /******************************Public*Routine******************************\ * DdCreateDIBSection * * Cloned from CreateDIBSection. * * The only difference from CreateDIBSection is that at 8bpp, we create the * DIBSection to act like a device-dependent bitmap and don't create a palette. * This way, the application is always ensured an identity translate on a blt, * and doesn't have to worry about GDI's goofy colour matching. * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ HBITMAP APIENTRY DdCreateDIBSection( // AKA 'GdiEntry9' HDC hdc, CONST BITMAPINFO* pbmi, UINT iUsage, VOID** ppvBits, HANDLE hSectionApp, DWORD dwOffset ) { HBITMAP hbm = NULL; PVOID pjBits = NULL; BITMAPINFO * pbmiNew = NULL; INT cjHdr; pbmiNew = pbmiConvertInfo(pbmi, iUsage, &cjHdr, FALSE); // dwOffset has to be a multiple of 4 (sizeof(DWORD)) // if there is a section. If the section is NULL we do // not care if ( (hSectionApp == NULL) || ((dwOffset & 3) == 0) ) { hbm = NtGdiCreateDIBSection( hdc, hSectionApp, dwOffset, (LPBITMAPINFO) pbmiNew, iUsage, cjHdr, CDBI_NOPALETTE, 0, (PVOID *)&pjBits); if ((hbm == NULL) || (pjBits == NULL)) { hbm = 0; pjBits = NULL; } #if TRACE_SURFACE_ALLOCS else { PULONG pUserAlloc; PSHARED_GET_VALIDATE(pUserAlloc, hbm, SURF_TYPE); if (pUserAlloc != NULL) { pUserAlloc[1] = RtlWalkFrameChain((PVOID *)&pUserAlloc[2], pUserAlloc[0], 0); } } #endif } // Assign the appropriate value to the caller's pointer if (ppvBits != NULL) { *ppvBits = pjBits; } if (pbmiNew && (pbmiNew != pbmi)) LocalFree(pbmiNew); return(hbm); } /*****************************Private*Routine******************************\ * DdReenableDirectDrawObject * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdReenableDirectDrawObject( // AKA 'GdiEntry10' LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, BOOL* pbNewMode ) { return(NtGdiDdReenableDirectDrawObject(DD_HANDLE(pDirectDrawGlobal->hDD), pbNewMode)); } /*****************************Private*Routine******************************\ * DdAttachSurface * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL APIENTRY DdAttachSurface( // AKA 'GdiEntry11' LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom, LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo ) { BOOL bRet = TRUE; // We may be called to attach the surfaces before the kernel objects // have been created; if so, create a kernel surface on the fly but // mark it as incomplete: // must test failure case for leak if (pSurfaceFrom->hDDSurface == 0) { bRet &= bDdCreateSurfaceObject(pSurfaceFrom, FALSE); } if (pSurfaceTo->hDDSurface == 0) { bRet &= bDdCreateSurfaceObject(pSurfaceTo, FALSE); } if (bRet) { bRet = NtGdiDdAttachSurface((HANDLE) pSurfaceFrom->hDDSurface, (HANDLE) pSurfaceTo->hDDSurface); } return(bRet); } /*****************************Private*Routine******************************\ * DdUnattachSurface * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ VOID APIENTRY DdUnattachSurface( // AKA 'GdiEntry12' LPDDRAWI_DDRAWSURFACE_LCL pSurface, LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached ) { NtGdiDdUnattachSurface((HANDLE) pSurface->hDDSurface, (HANDLE) pSurfaceAttached->hDDSurface); } /*****************************Private*Routine******************************\ * DdQueryDisplaySettingsUniqueness * * History: * 3-Dec-1995 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ ULONG APIENTRY DdQueryDisplaySettingsUniqueness( // AKA 'GdiEntry13' VOID ) { return(pGdiSharedMemory->iDisplaySettingsUniqueness); } /*****************************Private*Routine******************************\ * DdGetDxHandle * * History: * 18-Oct-1997 -by- smac * Wrote it. \**************************************************************************/ HANDLE APIENTRY DdGetDxHandle( // AKA 'GdiEntry14' LPDDRAWI_DIRECTDRAW_LCL pDDraw, LPDDRAWI_DDRAWSURFACE_LCL pSurface, BOOL bRelease ) { if( pSurface != NULL ) { return( NtGdiDdGetDxHandle( NULL, (HANDLE)(pSurface->hDDSurface), bRelease ) ); } return( NtGdiDdGetDxHandle( DD_HANDLE(pDDraw->lpGbl->hDD), NULL, bRelease ) ); } /*****************************Private*Routine******************************\ * DdSetGammaRamp * * History: * 18-Oct-1997 -by- smac * Wrote it. \**************************************************************************/ BOOL APIENTRY DdSetGammaRamp( // AKA 'GdiEntry15' LPDDRAWI_DIRECTDRAW_LCL pDDraw, HDC hdc, LPVOID lpGammaRamp ) { return( NtGdiDdSetGammaRamp( DD_HANDLE(pDDraw->lpGbl->hDD), hdc, lpGammaRamp ) ); } /*****************************Private*Routine******************************\ * DdSwapTextureHandles * * History: * 17-Nov-1998 -by- anankan * Wrote it. \**************************************************************************/ ULONG APIENTRY DdSwapTextureHandles( // AKA 'GdiEntry16' LPDDRAWI_DIRECTDRAW_LCL pDDLcl, LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl1, LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl2 ) { //this entry is going away now that CreateSurfaceEx is added return DDHAL_DRIVER_HANDLED; }