diff --git a/reactos/subsystems/win32/win32k/ntddraw/dd.c b/reactos/subsystems/win32/win32k/ntddraw/dd.c index 5676feb5bdb..1d192fb18a1 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dd.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dd.c @@ -18,15 +18,11 @@ extern PDRVFN gpDxFuncs; -/* is not longer in use PDD_DESTROYDRIVER DestroyDriver */ typedef DWORD (NTAPI *PGD_DDCREATESURFACE)(HANDLE, HANDLE *, DDSURFACEDESC *, DD_SURFACE_GLOBAL *, DD_SURFACE_LOCAL *, DD_SURFACE_MORE *, PDD_CREATESURFACEDATA , HANDLE *); -/* see ddsurf.c for PDD_SETCOLORKEY SetColorKey; */ -/* is not longer in use PDD_SETMODE SetMode; */ typedef DWORD (NTAPI *PGD_DXDDWAITFORVERTICALBLANK)(HANDLE, PDD_WAITFORVERTICALBLANKDATA); typedef DWORD (NTAPI *PGD_DDCANCREATESURFACE)(HANDLE hDirectDrawLocal, PDD_CANCREATESURFACEDATA puCanCreateSurfaceData); -/* is not longer in use PDD_CREATEPALETTE CreatePalette; */ typedef DWORD (NTAPI *PGD_DXDDGETSCANLINE)(HANDLE, PDD_GETSCANLINEDATA); -/* is not longer in use PDD_MAPMEMORY MapMemory; */ +typedef DWORD (NTAPI *PGD_DXDDCREATESURFACEEX)(HANDLE,HANDLE,DWORD); #define DXG_GET_INDEX_FUNCTION(INDEX, FUNCTION) \ if (gpDxFuncs) \ @@ -142,3 +138,34 @@ NtGdiDdGetScanLine(HANDLE hDirectDrawLocal, } +/************************************************************************/ +/* This is not part of the ddsurface interface but it have */ +/* deal with the surface */ +/************************************************************************/ + +/************************************************************************/ +/* NtGdiDdCreateSurfaceEx */ +/************************************************************************/ +DWORD +STDCALL +NtGdiDdCreateSurfaceEx(HANDLE hDirectDraw, + HANDLE hSurface, + DWORD dwSurfaceHandle) +{ + PGD_DXDDCREATESURFACEEX pfnDdCreateSurfaceEx = NULL; + INT i; + + DXG_GET_INDEX_FUNCTION(DXG_INDEX_DxDdCreateSurfaceEx, pfnDdCreateSurfaceEx); + + if (pfnDdCreateSurfaceEx == NULL) + { + DPRINT1("Warring no pfnDdCreateSurfaceEx"); + return DDHAL_DRIVER_NOTHANDLED; + } + + DPRINT1("Calling on dxg.sys pfnDdCreateSurfaceEx"); + return pfnDdCreateSurfaceEx(hDirectDrawLocal,puGetScanLineData); + +} + + diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c index 5a2d059d167..cb857278dbe 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c @@ -22,6 +22,10 @@ +typedef DWORD (NTAPI *PGD_DXDDREENABLEDIRECTDRAWOBJECT)(HANDLE, BOOL); +typedef DWORD (NTAPI *PGD_DXDDGETDRIVERINFO)(HANDLE, PDD_GETDRIVERINFODATA); +typedef DWORD (NTAPI *PGD_DXDDGETAVAILDRIVERMEMORY(HANDLE, PDD_GETAVAILDRIVERMEMORYDATA); +typedef DWORD (NTAPI *PGD_DXDDSETEXCLUSIVEMODE)(HANDLE, PDD_SETEXCLUSIVEMODEDATA); typedef NTSTATUS (NTAPI *PGD_DXDDSTARTUPDXGRAPHICS) (ULONG, PDRVENABLEDATA, ULONG, PDRVENABLEDATA, PULONG, PEPROCESS); typedef NTSTATUS (NTAPI *PGD_DXDDCLEANUPDXGRAPHICS) (VOID); typedef HANDLE (NTAPI *PGD_DDCREATEDIRECTDRAWOBJECT) (HDC hdc); @@ -354,169 +358,107 @@ NtGdiDdQueryDirectDrawObject(HANDLE hDirectDrawLocal, } - +/************************************************************************/ +/* NtGdiDdReenableDirectDrawObject */ +/************************************************************************/ BOOL -STDCALL NtGdiDdReenableDirectDrawObject( - HANDLE hDirectDrawLocal, - BOOL *pubNewMode -) +STDCALL +NtGdiDdReenableDirectDrawObject(HANDLE hDirectDrawLocal, + BOOL *pubNewMode) { - BOOL Ret=FALSE; - NTSTATUS Status = FALSE; - PDD_DIRECTDRAW pDirectDraw; + PGD_DXDDREENABLEDIRECTDRAWOBJECT pfnDdReenableDirectDrawObject = NULL; + INT i; - if (hDirectDrawLocal == NULL) - { - return Ret; - } - - pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, - GDI_OBJECT_TYPE_DIRECTDRAW); - - if (!pDirectDraw) - { - return Ret; - } - - /* - * FIXME detect mode change thic code maybe are not correct - * if we call on intEnableDriver it will cause some memory leak - * we need free the alloc memory before we call on it - */ - Ret = intEnableDriver(pDirectDraw); - - _SEH_TRY - { - ProbeForWrite(pubNewMode, sizeof(BOOL), 1); - *pubNewMode = Ret; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return Ret; - } - - GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); - - return Ret; - -} - - - -DWORD STDCALL NtGdiDdGetDriverInfo( - HANDLE hDirectDrawLocal, - PDD_GETDRIVERINFODATA puGetDriverInfoData) - -{ - DWORD ddRVal = 0; - PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, - GDI_OBJECT_TYPE_DIRECTDRAW); - - DPRINT1("NtGdiDdGetDriverInfo\n"); - - if (pDirectDraw == NULL) + DXG_GET_INDEX_FUNCTION(DXG_INDEX_DxDdReenableDirectDrawObject, pfnDdReenableDirectDrawObject); + + if (pfnDdReenableDirectDrawObject == NULL) { + DPRINT1("Warring no pfnDdReenableDirectDrawObject"); return DDHAL_DRIVER_NOTHANDLED; } - /* it exsist two version of NtGdiDdGetDriverInfo we need check for both flags */ - if (!(pDirectDraw->Hal.dwFlags & DDHALINFO_GETDRIVERINFOSET)) - ddRVal++; - - if (!(pDirectDraw->Hal.dwFlags & DDHALINFO_GETDRIVERINFO2)) - ddRVal++; - - /* Now we are doing the call to drv DrvGetDriverInfo */ - if (ddRVal == 2) - { - DPRINT1("NtGdiDdGetDriverInfo DDHAL_DRIVER_NOTHANDLED"); - ddRVal = DDHAL_DRIVER_NOTHANDLED; - } - else - { - ddRVal = pDirectDraw->Hal.GetDriverInfo(puGetDriverInfoData); - } - - GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); - - return ddRVal; + DPRINT1("Calling on dxg.sys pfnDdReenableDirectDrawObject"); + return pfnDdReenableDirectDrawObject(hDirectDrawLocal, pubNewMode); } +/************************************************************************/ +/* NtGdiDdGetDriverInfo */ +/************************************************************************/ +DWORD +STDCALL +NtGdiDdGetDriverInfo(HANDLE hDirectDrawLocal, + PDD_GETDRIVERINFODATA puGetDriverInfoData) - -DWORD STDCALL NtGdiDdGetAvailDriverMemory( - HANDLE hDirectDrawLocal, - PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData -) { - DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED; - PDD_DIRECTDRAW_GLOBAL lgpl; + PGD_DXDDGETDRIVERINFO pfnDdGetDriverInfo = NULL; + INT i; - PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); -#ifdef DX_DEBUG - DPRINT1("NtGdiDdGetAvailDriverMemory\n"); -#endif + DXG_GET_INDEX_FUNCTION(DXG_INDEX_DxDdGetDriverInfo, pfnDdGetDriverInfo); - /* backup the orignal PDev and info */ - lgpl = puGetAvailDriverMemoryData->lpDD; + if (pfnDdGetDriverInfo == NULL) + { + DPRINT1("Warring no pfnDdGetDriverInfo"); + return DDHAL_DRIVER_NOTHANDLED; + } - /* use our cache version instead */ - puGetAvailDriverMemoryData->lpDD = &pDirectDraw->Global; - - /* make the call */ - // ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData); - - GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); + DPRINT1("Calling on dxg.sys pfnDdGetDriverInfo"); + return pfnDdGetDriverInfo(hDirectDrawLocal, puGetDriverInfoData); - /* But back the orignal PDev */ - puGetAvailDriverMemoryData->lpDD = lgpl; - - return ddRVal; } - - -DWORD STDCALL NtGdiDdSetExclusiveMode( - HANDLE hDirectDraw, - PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData -) +/************************************************************************/ +/* NtGdiDdGetAvailDriverMemory */ +/************************************************************************/ +DWORD +STDCALL +NtGdiDdGetAvailDriverMemory(HANDLE hDirectDrawLocal, + PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData) { - DWORD ddRVal; - PDD_DIRECTDRAW_GLOBAL lgpl; + PGD_DXDDGETAVAILDRIVERMEMORY pfnDdGetAvailDriverMemory = NULL; + INT i; - PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDraw, GDI_OBJECT_TYPE_DIRECTDRAW); + DXG_GET_INDEX_FUNCTION(DXG_INDEX_DxDdGetAvailDriverMemory, pfnDdGetAvailDriverMemory); -#ifdef DX_DEBUG - DPRINT1("NtGdiDdSetExclusiveMode\n"); -#endif + if (pfnDdGetAvailDriverMemory == NULL) + { + DPRINT1("Warring no pfnDdGetAvailDriverMemory"); + return DDHAL_DRIVER_NOTHANDLED; + } - /* backup the orignal PDev and info */ - lgpl = puSetExclusiveModeData->lpDD; + DPRINT1("Calling on dxg.sys pfnDdGetAvailDriverMemory"); + return pfnDdGetAvailDriverMemory(hDirectDrawLocal, puGetAvailDriverMemoryData); +} - /* use our cache version instead */ - puSetExclusiveModeData->lpDD = &pDirectDraw->Global; - /* make the call */ - ddRVal = pDirectDraw->DdSetExclusiveMode(puSetExclusiveModeData); +/************************************************************************/ +/* NtGdiDdSetExclusiveMode */ +/************************************************************************/ - GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); +DWORD +STDCALL +NtGdiDdSetExclusiveMode(HANDLE hDirectDraw, + PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData) +{ + PGD_DXDDSETEXCLUSIVEMODE pfnDdSetExclusiveMode = NULL; + INT i; + + DXG_GET_INDEX_FUNCTION(DXG_INDEX_DxDdSetExclusiveMode, pfnDdSetExclusiveMode); + + if (pfnDdSetExclusiveMode == NULL) + { + DPRINT1("Warring no pfnDdSetExclusiveMode"); + return DDHAL_DRIVER_NOTHANDLED; + } + + DPRINT1("Calling on dxg.sys pfnDdSetExclusiveMode"); + return pfnDdSetExclusiveMode(hDirectDrawLocal, puGetAvailDriverMemoryData); - /* But back the orignal PDev */ - puSetExclusiveModeData->lpDD = lgpl; - - return ddRVal; } diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c index 7c29a703e4e..fa464343326 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c @@ -16,6 +16,7 @@ extern PDRVFN gpDxFuncs; +typedef DWORD (NTAPI *PGD_DXDDUNATTACHSURFACE)(HANDLE, HANDLE); typedef DWORD (NTAPI *PGD_DXDDDESTROYSURFACE)(HANDLE, BOOL); typedef DWORD (NTAPI *PGD_DXDDFLIP)(HANDLE, HANDLE, HANDLE, HANDLE, PDD_FLIPDATA); /* Does not exists in win32k or dxg.sys PDD_SURFCB_SETCLIPLIST SetClipList; */ @@ -361,3 +362,27 @@ NtGdiDdAttachSurface(HANDLE hSurfaceFrom, return pfnDdAttachSurface(hSurfaceFrom,hSurfaceTo); } +/************************************************************************/ +/* NtGdiDdUnattachSurface */ +/************************************************************************/ +VOID +STDCALL +NtGdiDdUnattachSurface(HANDLE hSurface, + HANDLE hSurfaceAttached) +{ + PGD_DXDDUNATTACHSURFACE pfnDdUnattachSurface = NULL; + INT i; + + DXG_GET_INDEX_FUNCTION(DXG_INDEX_DxDdUnattachSurface, pfnDdUnattachSurface); + + if (pfnDdUnattachSurface == NULL) + { + DPRINT1("Warring no pfnDdUnattachSurface"); + return DDHAL_DRIVER_NOTHANDLED; + } + + DPRINT1("Calling on dxg.sys pfnDdUnattachSurface"); + return pfnDdUnattachSurface(hSurface,hSurfaceAttached); +} + + diff --git a/reactos/subsystems/win32/win32k/ntddraw/stubs.c b/reactos/subsystems/win32/win32k/ntddraw/stubs.c index 13b84e3897d..b3b575eef60 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/stubs.c +++ b/reactos/subsystems/win32/win32k/ntddraw/stubs.c @@ -13,16 +13,7 @@ #define NDEBUG #include -DWORD STDCALL NtGdiDdCreateSurfaceEx( - HANDLE hDirectDraw, - HANDLE hSurface, - DWORD dwSurfaceHandle -) -{ - UNIMPLEMENTED - return 0; -} DWORD STDCALL NtGdiDdFlipToGDISurface( HANDLE hDirectDraw, @@ -86,13 +77,7 @@ BOOL STDCALL NtGdiDdSetGammaRamp( return 0; } -VOID STDCALL NtGdiDdUnattachSurface( - HANDLE hSurface, - HANDLE hSurfaceAttached -) -{ - UNIMPLEMENTED -} +