52 if (ppdev->
dhpdev == dhpdev)
break;
113 ASSERT(ppdev->cPdevRefs >= 0);
116 if (ppdev->cPdevRefs == 0)
123 TRACE(
"DrvDisableSurface(dhpdev %p)\n", ppdev->dhpdev);
124 ppdev->pfn.DisableSurface(ppdev->dhpdev);
134 if (ppdev->dhpdev !=
NULL)
137 TRACE(
"DrvDisablePDEV(dhpdev %p)\n", ppdev->dhpdev);
138 ppdev->pfn.DisablePDEV(ppdev->dhpdev);
150 while (!found && ppdevCurrent->
ppdevNext)
158 ppdevCurrent->
ppdevNext = ppdev->ppdevNext;
183 pfnEnablePDEV = ppdev->pfn.EnablePDEV;
186 TRACE(
"DrvEnablePDEV(pdevmode %p (%dx%dx%d %d Hz) hdev %p (%S))\n",
188 ppdev->pGraphicsDevice ? pdevmode->dmPelsWidth : 0,
189 ppdev->pGraphicsDevice ? pdevmode->dmPelsHeight : 0,
190 ppdev->pGraphicsDevice ? pdevmode->dmBitsPerPel : 0,
191 ppdev->pGraphicsDevice ? pdevmode->dmDisplayFrequency : 0,
193 ppdev->pGraphicsDevice ? ppdev->pGraphicsDevice->szNtDeviceName :
L"");
194 ppdev->dhpdev = pfnEnablePDEV(pdevmode,
203 ppdev->pGraphicsDevice ? ppdev->pGraphicsDevice->pwszDescription :
NULL,
204 ppdev->pGraphicsDevice ? ppdev->pGraphicsDevice->DeviceObject :
NULL);
205 TRACE(
"DrvEnablePDEV(pdevmode %p hdev %p) => dhpdev %p\n", pdevmode, ppdev, ppdev->dhpdev);
206 if (ppdev->dhpdev ==
NULL)
208 ERR(
"Failed to enable PDEV\n");
213 if (ppdev->gdiinfo.ulLogPixelsX == 0)
214 ppdev->gdiinfo.ulLogPixelsX = 96;
216 if (ppdev->gdiinfo.ulLogPixelsY == 0)
217 ppdev->gdiinfo.ulLogPixelsY = 96;
234 if (ppdev->ahsurf[
i] ==
NULL)
238 TRACE(
"PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev);
249 TRACE(
"DrvCompletePDEV(dhpdev %p hdev %p)\n", ppdev->
dhpdev, ppdev);
259 ULONG dwAccelerationLevel = ppdev->dwAccelerationLevel;
266 if (dwAccelerationLevel >= 1)
272 if (dwAccelerationLevel >= 2)
283 if (dwAccelerationLevel >= 3)
290 if (dwAccelerationLevel >= 4)
293 ppdev->pSurface->flags &= ~HOOK_FLAGS |
302 if (dwAccelerationLevel >= 5)
320 TRACE(
"DrvEnableSurface(dhpdev %p)\n", ppdev->
dhpdev);
322 TRACE(
"DrvEnableSurface(dhpdev %p) => hsurf %p\n", ppdev->
dhpdev, hsurf);
325 ERR(
"Failed to create PDEV surface!\n");
348 TRACE(
"DxDdEnableDirectDraw(ppdev %p)\n", ppdev);
349 Success = pfnDdEnableDirectDraw((HDEV)ppdev,
TRUE);
350 TRACE(
"DxDdEnableDirectDraw(ppdev %p) => %d\n", ppdev,
Success);
362 TRACE(
"DxDdResumeDirectDraw(ppdev %p)\n", ppdev);
363 pfnDdResumeDirectDraw((HDEV)ppdev, 0);
373 TRACE(
"DxDdSuspendDirectDraw(ppdev %p)\n", ppdev);
374 pfnDdSuspendDirectDraw((HDEV)ppdev, 0);
385 TRACE(
"DxDdDynamicModeChange(ppdev %p, ppdev2 %p)\n", ppdev, ppdev2);
386 pfnDdDynamicModeChange((HDEV)ppdev, (HDEV)ppdev2, 0);
401 TRACE(
"DrvAssertMode(dhpdev %p, TRUE)\n", ppdev->dhpdev);
402 assertVal = ppdev->pfn.AssertMode(ppdev->dhpdev,
TRUE);
403 TRACE(
"DrvAssertMode(dhpdev %p, TRUE) => %d\n", ppdev->dhpdev, assertVal);
404 }
while (!assertVal);
406 ppdev->flFlags &= ~PDEV_DISABLED;
420 TRACE(
"DrvAssertMode(dhpdev %p, FALSE)\n", ppdev->dhpdev);
421 assertVal = ppdev->pfn.AssertMode(ppdev->dhpdev,
FALSE);
422 TRACE(
"DrvAssertMode(dhpdev %p, FALSE) => %d\n", ppdev->dhpdev, assertVal);
473 TRACE(
"PDEVOBJ_Create(%p %p %d)\n", pGraphicsDevice, pdm, ldevtype);
518 ERR(
"Could not load display driver '%S'\n",
527 ERR(
"failed to allocate a PDEV\n");
557 ppdev->
pldev = pldev;
568 pdm->dmPanningWidth = pdm->dmPelsWidth;
570 pdm->dmPanningHeight = pdm->dmPelsHeight;
584 ERR(
"Failed to enable PDEV!\n");
597 ERR(
"Failed to create surface\n");
606 ERR(
"Failed to enable DirectDraw\n");
634 PVOID *ppvPointer1 = pvPointer1;
635 PVOID *ppvPointer2 = pvPointer2;
638 pvTemp = *ppvPointer1;
639 *ppvPointer1 = *ppvPointer2;
640 *ppvPointer2 = pvTemp;
718 DPRINT1(
"PDEVOBJ_bSwitchMode, ppdev = %p, pSurface = %p\n", ppdev, ppdev->
pSurface);
726 DPRINT1(
"PDEVOBJ_bDisableDisplay() failed\n");
736 DPRINT1(
"Failed to create a new PDEV\n");
744 DPRINT1(
"PDEVOBJ_pSurface failed\n");
756 DPRINT1(
"PDEVOBJ_bDynamicModeChange() failed\n");
769 ppdev->
pEDDgpl->hDev = (HDEV)ppdev;
862 TRACE(
"PDEVOBJ_lChangeDisplaySettings('%wZ' '%dx%dx%d (%d Hz)' %p %p)\n",
864 RequestedMode ? RequestedMode->dmPelsWidth : 0,
865 RequestedMode ? RequestedMode->dmPelsHeight : 0,
866 RequestedMode ? RequestedMode->dmBitsPerPel : 0,
867 RequestedMode ? RequestedMode->dmDisplayFrequency : 0,
868 pmdevOld, ppmdevNew);
873 if (!pGraphicsDevice)
875 ERR(
"Wrong device name provided: '%wZ'\n", pustrDeviceName);
880 else if (RequestedMode)
883 if (!pGraphicsDevice)
885 ERR(
"Wrong device'\n");
895 ERR(
"DrvProbeAndCaptureDevmode() failed\n");
926 ERR(
"Failed to create new MDEV\n");
936 if (pustrDeviceName && pmdevOld)
939 for (
i = 0;
i < pmdevOld->cDev;
i++)
941 for (
j = 0;
j < pmdev->
cDev;
j++)
953 ERR(
"Failed to apply new settings\n");
960 if (
j == pmdev->
cDev)
969 if (pmdev->
cDev == 1)
977 if (!pmdev->ppdevGlobal)
979 WARN(
"Failed to create meta-device. Using only first display\n");
981 pmdev->ppdevGlobal = pmdev->dev[0].ppdev;
988 for (
i = 0;
i < pmdevOld->cDev;
i++)
990 for (
j = 0;
j < pmdev->
cDev;
j++)
995 if (
j == pmdev->
cDev)
1007 if (pdm && pdm != RequestedMode)
1024 ret = CM_GAMMA_RAMP;
1028 ret |= CM_CMYK_COLOR;
1030 ret |= CM_DEVICE_ICM;
1041 PGDIINFO pGdiInfo = &ppdev->gdiinfo;
1109 if (cjOutSize >=
sizeof(
DWORD))
1129 ASSERT(ppdev->
pldev->pGdiDriverInfo->DriverName.Buffer);
1131 return ppdev->
pldev->pGdiDriverInfo->DriverName.Buffer;
1233 case SHADEBLENDCAPS:
1286NtGdiGetDeviceCapsAll(
#define InterlockedDecrement
#define DBG_DEFAULT_CHANNEL(ch)
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
FORCEINLINE PDC DC_LockDc(HDC hdc)
#define ERROR_INVALID_HANDLE
static void cleanup(void)
PPDEVOBJ NTAPI DbgLookupDHPDEV(DHPDEV dhpdev)
#define DXG_INDEX_DxDdDynamicModeChange
BOOLEAN(NTAPI * PGD_DXDDENABLEDIRECTDRAW)(PVOID, BOOLEAN)
#define DXG_INDEX_DxDdResumeDirectDraw
#define DXG_INDEX_DxDdEnableDirectDraw
#define DXG_INDEX_DxDdSuspendDirectDraw
HSURF gahsurfHatch[HS_DDI_MAX]
#define ExAllocatePoolWithTag(hernya, size, tag)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
HSEMAPHORE WINAPI EngCreateSemaphore(VOID)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define EXCEPTION_EXECUTE_HANDLER
VOID(APIENTRY * PGD_DXDDSUSPENDDIRECTDRAW)(HDEV, ULONG_PTR)
VOID(APIENTRY * PGD_DXDDRESUMEDIRECTDRAW)(HDEV, ULONG_PTR)
VOID(APIENTRY * PGD_DXDDDYNAMICMODECHANGE)(HDEV, HDEV, ULONG_PTR)
#define RtlEqualMemory(dst, src, len)
PLDEVOBJ NTAPI LDEVOBJ_pLoadDriver(_In_z_ LPWSTR pwszDriverName, _In_ ULONG ldevtype)
BOOL LDEVOBJ_bBuildDevmodeList(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice)
BOOL LDEVOBJ_bProbeAndCaptureDevmode(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice, _In_ PDEVMODEW RequestedMode, _Out_ PDEVMODEW *pSelectedMode, _In_ BOOL bSearchClosestMode)
PLDEVOBJ LDEVOBJ_pLoadInternal(_In_ PFN_DrvEnableDriver pfnEnableDriver, _In_ ULONG ldevtype)
VOID MDEVOBJ_vDestroy(_Inout_ PMDEVOBJ pmdev)
PMDEVOBJ MDEVOBJ_Create(_In_opt_ PUNICODE_STRING pustrDeviceName, _In_opt_ PDEVMODEW pdm)
BOOL MDEVOBJ_bDisable(_Inout_ PMDEVOBJ pmdev)
VOID MDEVOBJ_vEnable(_Inout_ PMDEVOBJ pmdev)
struct _PDEVOBJ * PPDEVOBJ
#define ExFreePoolWithTag(_P, _T)
#define _Inout_bytecount_(size)
#define _In_reads_bytes_(s)
#define _Must_inspect_result_
#define _Out_writes_bytes_(s)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define MmSystemRangeStart
PPDEVOBJ NTAPI EngpGetPDEV(_In_opt_ PUNICODE_STRING pustrDeviceName)
BOOL NTAPI PDEVOBJ_bEnablePDEV(_In_ PPDEVOBJ ppdev, _In_ PDEVMODEW pdevmode, _In_ PWSTR pwszLogAddress)
BOOL APIENTRY MultiEnableDriver(_In_ ULONG iEngineVersion, _In_ ULONG cj, _Inout_bytecount_(cj) PDRVENABLEDATA pded)
VOID PDEVOBJ_vResumeDirectDraw(_Inout_ PPDEVOBJ ppdev)
static VOID PDEVOBJ_vFilterDriverHooks(_In_ PPDEVOBJ ppdev)
BOOL PDEVOBJ_bDisableDisplay(_Inout_ PPDEVOBJ ppdev)
BOOL APIENTRY EngQueryDeviceAttribute(_In_ HDEV hdev, _In_ ENG_DEVICE_ATTRIBUTE devAttr, _In_reads_bytes_(cjInSize) PVOID pvIn, _In_ ULONG cjInSize, _Out_writes_bytes_(cjOutSize) PVOID pvOut, _In_ ULONG cjOutSize)
_Must_inspect_result_ _Ret_z_ LPWSTR APIENTRY EngGetDriverName(_In_ HDEV hdev)
BOOL PDEVOBJ_bEnableDirectDraw(_Inout_ PPDEVOBJ ppdev)
LONG PDEVOBJ_lChangeDisplaySettings(_In_opt_ PUNICODE_STRING pustrDeviceName, _In_opt_ PDEVMODEW RequestedMode, _In_opt_ PMDEVOBJ pmdevOld, _Out_ PMDEVOBJ *ppmdevNew, _In_ BOOL bSearchClosestMode)
static HSEMAPHORE ghsemPDEV
VOID PDEVOBJ_vSuspendDirectDraw(_Inout_ PPDEVOBJ ppdev)
PPDEVOBJ PDEVOBJ_Create(_In_opt_ PGRAPHICS_DEVICE pGraphicsDevice, _In_opt_ PDEVMODEW pdm, _In_ ULONG dwAccelerationLevel, _In_ ULONG ldevtype)
BOOL NTAPI PDEVOBJ_bDynamicModeChange(PPDEVOBJ ppdev, PPDEVOBJ ppdev2)
static PPDEVOBJ gppdevList
PSIZEL FASTCALL PDEVOBJ_sizl(PPDEVOBJ ppdev, PSIZEL psizl)
DHPDEV APIENTRY NtGdiGetDhpdev(IN HDEV hdev)
INT NTAPI PDEVOBJ_iGetColorManagementCaps(PPDEVOBJ ppdev)
VOID NTAPI PDEVOBJ_vRefreshModeList(PPDEVOBJ ppdev)
BOOL NTAPI PDEVOBJ_bSwitchMode(PPDEVOBJ ppdev, PDEVMODEW pdm)
INT APIENTRY NtGdiGetDeviceCaps(HDC hdc, INT Index)
VOID NTAPI PDEVOBJ_vRelease(_Inout_ PPDEVOBJ ppdev)
VOID NTAPI PDEVOBJ_vGetDeviceCaps(IN PPDEVOBJ ppdev, OUT PDEVCAPS pDevCaps)
PSURFACE NTAPI PDEVOBJ_pSurface(PPDEVOBJ ppdev)
VOID PDEVOBJ_vEnableDisplay(_Inout_ PPDEVOBJ ppdev)
PPDEVOBJ PDEVOBJ_AllocPDEV(VOID)
static VOID PDEVOBJ_vDeletePDEV(PPDEVOBJ ppdev)
VOID PDEVOBJ_vSwitchDirectDraw(_Inout_ PPDEVOBJ ppdev, _Inout_ PPDEVOBJ ppdev2)
FORCEINLINE VOID SwitchPointer(_Inout_ PVOID pvPointer1, _Inout_ PVOID pvPointer2)
NTSTATUS NTAPI InitPDEVImpl(VOID)
VOID NTAPI PDEVOBJ_vCompletePDEV(PPDEVOBJ ppdev)
FORCEINLINE VOID PDEVOBJ_vReference(_In_ PPDEVOBJ ppdev)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
struct _DEVMODEINFO * pdmiNext
PFN_DrvMovePointer MovePointer
PFN_DrvCompletePDEV CompletePDEV
PFN_DrvEnableSurface EnableSurface
PDEVMODEENTRY pDevModeList
WCHAR szWinDeviceName[CCHDEVICENAME/2]
PDEVMODEINFO pdevmodeInfo
PDEVICE_OBJECT DeviceObject
SYSTEM_GDI_DRIVER_INFORMATION * pGdiDriverInfo
struct _PDEVOBJ * ppdevNext
DWORD dwAccelerationLevel
struct _EDD_DIRECTDRAW_GLOBAL * pEDDgpl
PGRAPHICS_DEVICE pGraphicsDevice
PFN_DrvMovePointer pfnMovePointer
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCOLLECTION _In_ ULONG Index
PGRAPHICS_DEVICE NTAPI EngpFindGraphicsDevice(_In_opt_ PUNICODE_STRING pustrDevice, _In_ ULONG iDevNum)
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
#define SURFACE_ShareUnlockSurface(pBMObj)
#define SURFACE_ShareLockSurface(hBMObj)
VOID NTAPI GDIOBJ_vReferenceObjectByPointer(POBJ pobj)
#define PALETTE_ShareLockPalette(hpal)
#define PALETTE_ShareUnlockPalette(ppal)
DRVFN gpDxFuncs[DXG_INDEX_DxDdIoctl+1]
#define INDEX_DrvSetPointerShape
#define GCAPS2_CHANGEGAMMARAMP
_Requires_lock_not_held_ hsem ENGAPI VOID APIENTRY EngDeleteSemaphore(_Inout_ __drv_freesMem(Mem) HSEMAPHORE hsem)
typedef DHPDEV(APIENTRY FN_DrvEnablePDEV)(_In_ DEVMODEW *pdm
#define HOOK_TRANSPARENTBLT
_In_ DD_SURFACE_LOCAL * pSurface
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
ENGAPI VOID APIENTRY EngMovePointer(_In_ SURFOBJ *pso, _In_ LONG x, _In_ LONG y, _In_ RECTL *prcl)
_In_ LPWSTR pwszLogAddress
#define HOOK_GRADIENTFILL
typedef HSURF(APIENTRY FN_DrvEnableSurface)(_In_ DHPDEV dhpdev)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
FN_DrvEnablePDEV * PFN_DrvEnablePDEV
ENGAPI VOID APIENTRY EngUnloadImage(_In_ HANDLE hModule)
#define INDEX_DrvCreateDeviceBitmap
enum _ENG_DEVICE_ATTRIBUTE ENG_DEVICE_ATTRIBUTE
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
#define DISP_CHANGE_BADMODE
#define DISP_CHANGE_SUCCESSFUL
#define DISP_CHANGE_BADPARAM
#define DISP_CHANGE_FAILED