ReactOS  0.4.13-dev-92-gf251225
pdevobj.c File Reference
#include <win32k.h>
#include <debug.h>
Include dependency graph for pdevobj.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

INIT_FUNCTION NTSTATUS NTAPI InitPDEVImpl (VOID)
 
PPDEVOBJ PDEVOBJ_AllocPDEV (VOID)
 
static VOID PDEVOBJ_vDeletePDEV (PPDEVOBJ ppdev)
 
VOID NTAPI PDEVOBJ_vRelease (PPDEVOBJ ppdev)
 
BOOL NTAPI PDEVOBJ_bEnablePDEV (PPDEVOBJ ppdev, PDEVMODEW pdevmode, PWSTR pwszLogAddress)
 
VOID NTAPI PDEVOBJ_vCompletePDEV (PPDEVOBJ ppdev)
 
PSURFACE NTAPI PDEVOBJ_pSurface (PPDEVOBJ ppdev)
 
VOID NTAPI PDEVOBJ_vRefreshModeList (PPDEVOBJ ppdev)
 
PDEVMODEW NTAPI PDEVOBJ_pdmMatchDevMode (PPDEVOBJ ppdev, PDEVMODEW pdm)
 
static PPDEVOBJ EngpCreatePDEV (PUNICODE_STRING pustrDeviceName, PDEVMODEW pdm)
 
FORCEINLINE VOID SwitchPointer (_Inout_ PVOID pvPointer1, _Inout_ PVOID pvPointer2)
 
VOID NTAPI PDEVOBJ_vSwitchPdev (PPDEVOBJ ppdev, PPDEVOBJ ppdev2)
 
BOOL NTAPI PDEVOBJ_bSwitchMode (PPDEVOBJ ppdev, PDEVMODEW pdm)
 
PPDEVOBJ NTAPI EngpGetPDEV (_In_opt_ PUNICODE_STRING pustrDeviceName)
 
INT NTAPI PDEVOBJ_iGetColorManagementCaps (PPDEVOBJ ppdev)
 
VOID NTAPI PDEVOBJ_vGetDeviceCaps (IN PPDEVOBJ ppdev, OUT PDEVCAPS pDevCaps)
 
_Must_inspect_result_ _Ret_z_ LPWSTR APIENTRY EngGetDriverName (_In_ HDEV hdev)
 
INT APIENTRY NtGdiGetDeviceCaps (HDC hdc, INT Index)
 
 _Success_ (return!=FALSE)
 
DHPDEV APIENTRY NtGdiGetDhpdev (IN HDEV hdev)
 
PSIZEL FASTCALL PDEVOBJ_sizl (PPDEVOBJ ppdev, PSIZEL psizl)
 

Variables

PPDEVOBJ gppdevPrimary = NULL
 
static PPDEVOBJ gppdevList = NULL
 
static HSEMAPHORE ghsemPDEV
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file pdevobj.c.

Function Documentation

◆ _Success_()

_Success_ ( return!  = FALSE)

Definition at line 897 of file pdevobj.c.

903 {
904  PDC pdc;
905  DEVCAPS devcaps;
906  BOOL bResult = TRUE;
907 
908  /* Lock the given DC */
909  pdc = DC_LockDc(hDC);
910  if (!pdc)
911  {
913  return FALSE;
914  }
915 
916  /* Get the data */
917  PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps);
918 
919  /* Unlock the DC */
920  DC_UnlockDc(pdc);
921 
922  /* Copy data to caller */
923  _SEH2_TRY
924  {
925  ProbeForWrite(pDevCaps, sizeof(DEVCAPS), 1);
926  RtlCopyMemory(pDevCaps, &devcaps, sizeof(DEVCAPS));
927  }
929  {
931  bResult = FALSE;
932  }
933  _SEH2_END;
934 
935  return bResult;
936 }
_Out_ PDEVCAPS pDevCaps
Definition: ntgdi.h:2664
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
FORCEINLINE PDC DC_LockDc(HDC hdc)
Definition: dc.h:219
#define ERROR_INVALID_HANDLE
Definition: compat.h:88
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
_SEH2_TRY
Definition: create.c:4250
unsigned int BOOL
Definition: ntddk_ex.h:94
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
VOID NTAPI PDEVOBJ_vGetDeviceCaps(IN PPDEVOBJ ppdev, OUT PDEVCAPS pDevCaps)
Definition: pdevobj.c:679
Definition: polytest.cpp:40
VOID FASTCALL SetLastNtError(NTSTATUS Status)
Definition: error.c:36
static HDC hDC
Definition: 3dtext.c:33
_SEH2_END
Definition: create.c:4424
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
Definition: dc.h:237
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:12
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

◆ EngGetDriverName()

_Must_inspect_result_ _Ret_z_ LPWSTR APIENTRY EngGetDriverName ( _In_ HDEV  hdev)

Exported functions

Definition at line 736 of file pdevobj.c.

737 {
738  PPDEVOBJ ppdev = (PPDEVOBJ)hdev;
739 
740  ASSERT(ppdev);
741  ASSERT(ppdev->pldev);
742  ASSERT(ppdev->pldev->pGdiDriverInfo);
743  ASSERT(ppdev->pldev->pGdiDriverInfo->DriverName.Buffer);
744 
745  return ppdev->pldev->pGdiDriverInfo->DriverName.Buffer;
746 }
struct _LDEVOBJ * pldev
Definition: pdevobj.h:120
struct _PDEVOBJ * PPDEVOBJ
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
_In_ HDEV hdev
Definition: winddi.h:3449

◆ EngpCreatePDEV()

static PPDEVOBJ EngpCreatePDEV ( PUNICODE_STRING  pustrDeviceName,
PDEVMODEW  pdm 
)
static

Definition at line 343 of file pdevobj.c.

346 {
347  PGRAPHICS_DEVICE pGraphicsDevice;
348  PPDEVOBJ ppdev;
349  DPRINT("EngpCreatePDEV(%wZ, %p)\n", pustrDeviceName, pdm);
350 
351  /* Try to find the GRAPHICS_DEVICE */
352  if (pustrDeviceName)
353  {
354  pGraphicsDevice = EngpFindGraphicsDevice(pustrDeviceName, 0, 0);
355  if (!pGraphicsDevice)
356  {
357  DPRINT1("No GRAPHICS_DEVICE found for %ls!\n",
358  pustrDeviceName ? pustrDeviceName->Buffer : 0);
359  return NULL;
360  }
361  }
362  else
363  {
364  pGraphicsDevice = gpPrimaryGraphicsDevice;
365  }
366 
367  /* Allocate a new PDEVOBJ */
368  ppdev = PDEVOBJ_AllocPDEV();
369  if (!ppdev)
370  {
371  DPRINT1("failed to allocate a PDEV\n");
372  return NULL;
373  }
374 
375  /* If no DEVMODEW is given, ... */
376  if (!pdm)
377  {
378  /* ... use the device's default one */
379  pdm = pGraphicsDevice->pDevModeList[pGraphicsDevice->iDefaultMode].pdm;
380  DPRINT("Using iDefaultMode = %lu\n", pGraphicsDevice->iDefaultMode);
381  }
382 
383  /* Try to get a diplay driver */
385  if (!ppdev->pldev)
386  {
387  DPRINT1("Could not load display driver '%ls', '%ls'\n",
388  pGraphicsDevice->pDiplayDrivers,
389  pdm->dmDeviceName);
390  PDEVOBJ_vRelease(ppdev);
391  return NULL;
392  }
393 
394  /* Copy the function table */
395  ppdev->pfn = ppdev->pldev->pfn;
396 
397  /* Set MovePointer function */
398  ppdev->pfnMovePointer = ppdev->pfn.MovePointer;
399  if (!ppdev->pfnMovePointer)
401 
402  ppdev->pGraphicsDevice = pGraphicsDevice;
403 
404  // DxEngGetHdevData asks for Graphics DeviceObject in hSpooler field
405  ppdev->hSpooler = ppdev->pGraphicsDevice->DeviceObject;
406 
407  // Should we change the ative mode of pGraphicsDevice ?
408  ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ;
409 
410  /* FIXME! */
411  ppdev->flFlags = PDEV_DISPLAY;
412 
413  /* HACK: Don't use the pointer */
414  ppdev->Pointer.Exclude.right = -1;
415 
416  /* Call the driver to enable the PDEV */
417  if (!PDEVOBJ_bEnablePDEV(ppdev, pdm, NULL))
418  {
419  DPRINT1("Failed to enable PDEV!\n");
420  PDEVOBJ_vRelease(ppdev);
421  return NULL;
422  }
423 
424  /* FIXME: this must be done in a better way */
426 
427  /* Tell the driver that the PDEV is ready */
428  PDEVOBJ_vCompletePDEV(ppdev);
429 
430  /* Return the PDEV */
431  return ppdev;
432 }
BOOL NTAPI PDEVOBJ_bEnablePDEV(PPDEVOBJ ppdev, PDEVMODEW pdevmode, PWSTR pwszLogAddress)
Definition: pdevobj.c:160
PDEVICE_OBJECT DeviceObject
Definition: pdevobj.h:63
struct _LDEVOBJ * pldev
Definition: pdevobj.h:120
PFN_DrvMovePointer pfnMovePointer
Definition: pdevobj.h:114
DWORD StateFlags
Definition: pdevobj.h:66
PDEVMODEENTRY pDevModeList
Definition: pdevobj.h:70
PGRAPHICS_DEVICE gpPrimaryGraphicsDevice
Definition: device.c:13
PDEVMODEW pdm
Definition: pdevobj.h:53
PLDEVOBJ NTAPI EngLoadImageEx(_In_z_ LPWSTR pwszDriverName, _In_ ULONG ldevtype)
Definition: ldevobj.c:328
long right
Definition: polytest.cpp:53
PGRAPHICS_DEVICE NTAPI EngpFindGraphicsDevice(_In_opt_ PUNICODE_STRING pustrDevice, _In_ ULONG iDevNum, _In_ DWORD dwFlags)
Definition: device.c:281
FLONG flFlags
Definition: pdevobj.h:89
RECTL Exclude
Definition: pdevobj.h:39
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
PDEVMODEW pdmwDev
Definition: pdevobj.h:130
DRIVER_FUNCTIONS pfn
Definition: pdevobj.h:139
VOID NTAPI PDEVOBJ_vCompletePDEV(PPDEVOBJ ppdev)
Definition: pdevobj.c:224
LPWSTR pDiplayDrivers
Definition: pdevobj.h:71
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
Definition: wingdi.h:1378
WCHAR dmDeviceName[CCHDEVICENAME]
Definition: wingdi.h:1595
HANDLE hSpooler
Definition: pdevobj.h:126
PDEVMODEW NTAPI PDEVOBJ_pdmMatchDevMode(PPDEVOBJ ppdev, PDEVMODEW pdm)
Definition: pdevobj.c:304
PFN_DrvMovePointer MovePointer
Definition: ntgdityp.h:593
PPDEVOBJ PDEVOBJ_AllocPDEV(VOID)
Definition: pdevobj.c:53
GDIPOINTER Pointer
Definition: pdevobj.h:145
#define DPRINT1
Definition: precomp.h:8
ENGAPI VOID APIENTRY EngMovePointer(_In_ SURFOBJ *pso, _In_ LONG x, _In_ LONG y, _In_ RECTL *prcl)
Definition: mouse.c:566
PGRAPHICS_DEVICE pGraphicsDevice
Definition: pdevobj.h:128
ULONG iDefaultMode
Definition: pdevobj.h:77
VOID NTAPI PDEVOBJ_vRelease(PPDEVOBJ ppdev)
Definition: pdevobj.c:93

Referenced by EngpGetPDEV(), and PDEVOBJ_bSwitchMode().

◆ EngpGetPDEV()

PPDEVOBJ NTAPI EngpGetPDEV ( _In_opt_ PUNICODE_STRING  pustrDeviceName)

Definition at line 591 of file pdevobj.c.

593 {
594  UNICODE_STRING ustrCurrent;
595  PPDEVOBJ ppdev;
596  PGRAPHICS_DEVICE pGraphicsDevice;
597 
598  /* Acquire PDEV lock */
600 
601  /* Did the caller pass a device name? */
602  if (pustrDeviceName)
603  {
604  /* Loop all present PDEVs */
605  for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
606  {
607  /* Get a pointer to the GRAPHICS_DEVICE */
608  pGraphicsDevice = ppdev->pGraphicsDevice;
609 
610  /* Compare the name */
611  RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
612  if (RtlEqualUnicodeString(pustrDeviceName, &ustrCurrent, FALSE))
613  {
614  /* Found! */
615  break;
616  }
617  }
618  }
619  else
620  {
621  /* Otherwise use the primary PDEV */
622  ppdev = gppdevPrimary;
623  }
624 
625  /* Did we find one? */
626  if (ppdev)
627  {
628  /* Yes, reference the PDEV */
630  }
631  else
632  {
633  /* No, create a new PDEV for the given device */
634  ppdev = EngpCreatePDEV(pustrDeviceName, NULL);
635  if (ppdev)
636  {
637  /* Insert the PDEV into the list */
638  ppdev->ppdevNext = gppdevList;
639  gppdevList = ppdev;
640 
641  /* Set as primary PDEV, if we don't have one yet */
642  if (!gppdevPrimary)
643  {
644  gppdevPrimary = ppdev;
646  }
647  }
648  }
649 
650  /* Release PDEV lock */
652 
653  return ppdev;
654 }
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
Definition: eng.c:235
LONG cPdevRefs
Definition: pdevobj.h:86
WCHAR szWinDeviceName[CCHDEVICENAME/2]
Definition: pdevobj.h:60
PPDEVOBJ gppdevPrimary
Definition: pdevobj.c:13
DWORD StateFlags
Definition: pdevobj.h:66
static PPDEVOBJ EngpCreatePDEV(PUNICODE_STRING pustrDeviceName, PDEVMODEW pdm)
Definition: pdevobj.c:343
struct _PDEVOBJ * ppdevNext
Definition: pdevobj.h:85
static HSEMAPHORE ghsemPDEV
Definition: pdevobj.c:16
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
smooth NULL
Definition: ftsmooth.c:416
#define DISPLAY_DEVICE_PRIMARY_DEVICE
Definition: wingdi.h:1380
static PPDEVOBJ gppdevList
Definition: pdevobj.c:15
#define InterlockedIncrement
Definition: armddk.h:53
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
PGRAPHICS_DEVICE pGraphicsDevice
Definition: pdevobj.h:128
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)

Referenced by GreCreateCompatibleDC(), GreOpenDCW(), NtGdiExtEscape(), UserChangeDisplaySettings(), UserEnumCurrentDisplaySettings(), and UserEnumDisplaySettings().

◆ InitPDEVImpl()

INIT_FUNCTION NTSTATUS NTAPI InitPDEVImpl ( VOID  )

Definition at line 21 of file pdevobj.c.

22 {
25  return STATUS_SUCCESS;
26 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
static HSEMAPHORE ghsemPDEV
Definition: pdevobj.c:16
HSEMAPHORE WINAPI EngCreateSemaphore(VOID)
Definition: eng.c:75
return STATUS_SUCCESS
Definition: btrfs.c:2725

Referenced by DriverEntry().

◆ NtGdiGetDeviceCaps()

INT APIENTRY NtGdiGetDeviceCaps ( HDC  hdc,
INT  Index 
)

Definition at line 751 of file pdevobj.c.

754 {
755  PDC pdc;
756  DEVCAPS devcaps;
757 
758  /* Lock the given DC */
759  pdc = DC_LockDc(hdc);
760  if (!pdc)
761  {
763  return 0;
764  }
765 
766  /* Get the data */
767  PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps);
768 
769  /* Unlock the DC */
770  DC_UnlockDc(pdc);
771 
772  /* Return capability */
773  switch (Index)
774  {
775  case DRIVERVERSION:
776  return devcaps.ulVersion;
777 
778  case TECHNOLOGY:
779  return devcaps.ulTechnology;
780 
781  case HORZSIZE:
782  return devcaps.ulHorzSize;
783 
784  case VERTSIZE:
785  return devcaps.ulVertSize;
786 
787  case HORZRES:
788  return devcaps.ulHorzRes;
789 
790  case VERTRES:
791  return devcaps.ulVertRes;
792 
793  case LOGPIXELSX:
794  return devcaps.ulLogPixelsX;
795 
796  case LOGPIXELSY:
797  return devcaps.ulLogPixelsY;
798 
799  case BITSPIXEL:
800  return devcaps.ulBitsPixel;
801 
802  case PLANES:
803  return devcaps.ulPlanes;
804 
805  case NUMBRUSHES:
806  return -1;
807 
808  case NUMPENS:
809  return devcaps.ulNumPens;
810 
811  case NUMFONTS:
812  return devcaps.ulNumFonts;
813 
814  case NUMCOLORS:
815  return devcaps.ulNumColors;
816 
817  case ASPECTX:
818  return devcaps.ulAspectX;
819 
820  case ASPECTY:
821  return devcaps.ulAspectY;
822 
823  case ASPECTXY:
824  return devcaps.ulAspectXY;
825 
826  case CLIPCAPS:
827  return CP_RECTANGLE;
828 
829  case SIZEPALETTE:
830  return devcaps.ulSizePalette;
831 
832  case NUMRESERVED:
833  return 20;
834 
835  case COLORRES:
836  return devcaps.ulColorRes;
837 
838  case DESKTOPVERTRES:
839  return devcaps.ulVertRes;
840 
841  case DESKTOPHORZRES:
842  return devcaps.ulHorzRes;
843 
844  case BLTALIGNMENT:
845  return devcaps.ulBltAlignment;
846 
847  case SHADEBLENDCAPS:
848  return devcaps.ulShadeBlend;
849 
850  case COLORMGMTCAPS:
851  return devcaps.ulColorMgmtCaps;
852 
853  case PHYSICALWIDTH:
854  return devcaps.ulPhysicalWidth;
855 
856  case PHYSICALHEIGHT:
857  return devcaps.ulPhysicalHeight;
858 
859  case PHYSICALOFFSETX:
860  return devcaps.ulPhysicalOffsetX;
861 
862  case PHYSICALOFFSETY:
863  return devcaps.ulPhysicalOffsetY;
864 
865  case VREFRESH:
866  return devcaps.ulVRefresh;
867 
868  case RASTERCAPS:
869  return devcaps.ulRasterCaps;
870 
871  case CURVECAPS:
872  return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE |
874 
875  case LINECAPS:
878 
879  case POLYGONALCAPS:
882 
883  case TEXTCAPS:
884  return devcaps.ulTextCaps;
885 
886  case CAPS1:
887  case PDEVICESIZE:
888  case SCALINGFACTORX:
889  case SCALINGFACTORY:
890  default:
891  return 0;
892  }
893 
894  return 0;
895 }
#define CP_RECTANGLE
Definition: wingdi.h:825
#define DESKTOPHORZRES
Definition: wingdi.h:741
#define CC_PIE
Definition: wingdi.h:761
#define DESKTOPVERTRES
Definition: wingdi.h:742
#define NUMBRUSHES
Definition: wingdi.h:721
#define CC_CHORD
Definition: wingdi.h:762
#define BITSPIXEL
Definition: wingdi.h:719
#define HORZRES
Definition: wingdi.h:715
#define LOGPIXELSX
Definition: wingdi.h:717
ULONG ulBltAlignment
Definition: ntgdityp.h:321
#define NUMRESERVED
Definition: wingdi.h:732
#define LC_WIDE
Definition: wingdi.h:774
ULONG ulHorzRes
Definition: ntgdityp.h:298
FORCEINLINE PDC DC_LockDc(HDC hdc)
Definition: dc.h:219
#define PC_INTERIORS
Definition: wingdi.h:803
#define ASPECTX
Definition: wingdi.h:726
ULONG ulRasterCaps
Definition: ntgdityp.h:305
#define LC_POLYLINE
Definition: wingdi.h:771
#define CC_STYLED
Definition: wingdi.h:765
ULONG ulNumFonts
Definition: ntgdityp.h:303
#define ERROR_INVALID_HANDLE
Definition: compat.h:88
#define COLORRES
Definition: wingdi.h:733
#define DRIVERVERSION
Definition: wingdi.h:704
#define PDEVICESIZE
Definition: wingdi.h:729
#define BLTALIGNMENT
Definition: wingdi.h:743
ULONG ulHorzSize
Definition: ntgdityp.h:296
#define SCALINGFACTORX
Definition: wingdi.h:738
#define LC_POLYMARKER
Definition: wingdi.h:773
#define POLYGONALCAPS
Definition: wingdi.h:778
ULONG ulBitsPixel
Definition: ntgdityp.h:300
#define PC_WINDPOLYGON
Definition: wingdi.h:797
ULONG ulPhysicalHeight
Definition: ntgdityp.h:314
#define RASTERCAPS
Definition: wingdi.h:744
#define TECHNOLOGY
Definition: wingdi.h:705
ULONG ulVRefresh
Definition: ntgdityp.h:318
#define TEXTCAPS
Definition: wingdi.h:805
#define PHYSICALHEIGHT
Definition: wingdi.h:735
ULONG ulShadeBlend
Definition: ntgdityp.h:326
#define PC_WIDESTYLED
Definition: wingdi.h:802
#define NUMCOLORS
Definition: wingdi.h:724
ULONG ulNumPens
Definition: ntgdityp.h:302
ULONG ulVertRes
Definition: ntgdityp.h:299
#define VREFRESH
Definition: wingdi.h:740
#define CC_INTERIORS
Definition: wingdi.h:767
ULONG ulVertSize
Definition: ntgdityp.h:297
ULONG ulAspectXY
Definition: ntgdityp.h:308
#define LC_MARKER
Definition: wingdi.h:772
VOID NTAPI PDEVOBJ_vGetDeviceCaps(IN PPDEVOBJ ppdev, OUT PDEVCAPS pDevCaps)
Definition: pdevobj.c:679
#define SCALINGFACTORY
Definition: wingdi.h:739
#define PC_STYLED
Definition: wingdi.h:801
#define CC_WIDE
Definition: wingdi.h:764
ULONG ulColorRes
Definition: ntgdityp.h:312
ULONG ulPhysicalOffsetY
Definition: ntgdityp.h:316
#define LC_STYLED
Definition: wingdi.h:775
ULONG ulAspectY
Definition: ntgdityp.h:307
#define PC_WIDE
Definition: wingdi.h:800
ULONG ulPlanes
Definition: ntgdityp.h:301
Definition: polytest.cpp:40
#define ASPECTXY
Definition: wingdi.h:728
ULONG ulVersion
Definition: ntgdityp.h:292
#define PHYSICALOFFSETY
Definition: wingdi.h:737
#define CC_ROUNDRECT
Definition: wingdi.h:768
#define ASPECTY
Definition: wingdi.h:727
static const UCHAR Index[8]
Definition: usbohci.c:18
#define CLIPCAPS
Definition: wingdi.h:730
#define LC_WIDESTYLED
Definition: wingdi.h:776
#define SIZEPALETTE
Definition: wingdi.h:731
ULONG ulLogPixelsY
Definition: ntgdityp.h:310
HDC hdc
Definition: main.c:9
#define CC_ELLIPSES
Definition: wingdi.h:763
ULONG ulPhysicalOffsetX
Definition: ntgdityp.h:315
#define CAPS1
Definition: mmsystem.h:934
#define HORZSIZE
Definition: wingdi.h:713
#define PHYSICALOFFSETX
Definition: wingdi.h:736
#define PHYSICALWIDTH
Definition: wingdi.h:734
#define PC_RECTANGLE
Definition: wingdi.h:796
#define VERTSIZE
Definition: wingdi.h:714
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
Definition: dc.h:237
#define NUMPENS
Definition: wingdi.h:722
#define LINECAPS
Definition: wingdi.h:769
ULONG ulTextCaps
Definition: ntgdityp.h:317
ULONG ulPhysicalWidth
Definition: ntgdityp.h:313
#define VERTRES
Definition: wingdi.h:716
#define PC_POLYGON
Definition: wingdi.h:793
#define PC_SCANLINE
Definition: wingdi.h:798
ULONG ulAspectX
Definition: ntgdityp.h:306
ULONG ulColorMgmtCaps
Definition: ntgdityp.h:327
#define LOGPIXELSY
Definition: wingdi.h:718
ULONG ulNumColors
Definition: ntgdityp.h:304
#define CC_WIDESTYLED
Definition: wingdi.h:766
ULONG ulSizePalette
Definition: ntgdityp.h:311
#define CC_CIRCLES
Definition: wingdi.h:760
ULONG ulLogPixelsX
Definition: ntgdityp.h:309
#define LC_INTERIORS
Definition: wingdi.h:777
#define CURVECAPS
Definition: wingdi.h:758
#define NUMFONTS
Definition: wingdi.h:723
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
ULONG ulTechnology
Definition: ntgdityp.h:293
#define PLANES
Definition: wingdi.h:720

◆ NtGdiGetDhpdev()

DHPDEV APIENTRY NtGdiGetDhpdev ( IN HDEV  hdev)

Definition at line 940 of file pdevobj.c.

942 {
943  PPDEVOBJ ppdev;
944  DHPDEV dhpdev = NULL;
945 
946  /* Check parameter */
947  if (!hdev || (PCHAR)hdev < (PCHAR)MmSystemRangeStart)
948  return NULL;
949 
950  /* Lock PDEV list */
951  EngAcquireSemaphoreShared(ghsemPDEV);
952 
953  /* Walk through the list of PDEVs */
954  for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
955  {
956  /* Compare with the given HDEV */
957  if (ppdev == (PPDEVOBJ)hdev)
958  {
959  /* Found the PDEV! Get it's dhpdev and break */
960  dhpdev = ppdev->dhpdev;
961  break;
962  }
963  }
964 
965  /* Unlock PDEV list */
967 
968  return dhpdev;
969 }
DHPDEV dhpdev
Definition: pdevobj.h:121
signed char * PCHAR
Definition: retypes.h:7
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
Definition: eng.c:235
typedef DHPDEV(APIENTRY FN_DrvEnablePDEV)(_In_ DEVMODEW *pdm
struct _PDEVOBJ * ppdevNext
Definition: pdevobj.h:85
static HSEMAPHORE ghsemPDEV
Definition: pdevobj.c:16
smooth NULL
Definition: ftsmooth.c:416
static PPDEVOBJ gppdevList
Definition: pdevobj.c:15
#define MmSystemRangeStart
Definition: mm.h:32
_In_ HDEV hdev
Definition: winddi.h:3449

◆ PDEVOBJ_AllocPDEV()

PPDEVOBJ PDEVOBJ_AllocPDEV ( VOID  )

Definition at line 53 of file pdevobj.c.

54 {
55  PPDEVOBJ ppdev;
56 
58  if (!ppdev)
59  return NULL;
60 
61  RtlZeroMemory(ppdev, sizeof(PDEVOBJ));
62 
64  if (ppdev->hsemDevLock == NULL)
65  {
67  return NULL;
68  }
69 
70  /* Allocate EDD_DIRECTDRAW_GLOBAL for our ReactX driver */
72  if (ppdev->pEDDgpl)
74 
75  ppdev->cPdevRefs = 1;
76 
77  return ppdev;
78 }
LONG cPdevRefs
Definition: pdevobj.h:86
smooth NULL
Definition: ftsmooth.c:416
HSEMAPHORE hsemDevLock
Definition: pdevobj.h:91
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
struct _EDD_DIRECTDRAW_GLOBAL * pEDDgpl
Definition: pdevobj.h:150
HSEMAPHORE WINAPI EngCreateSemaphore(VOID)
Definition: eng.c:75
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define GDITAG_PDEV
Definition: tags.h:74

Referenced by EngpCreatePDEV().

◆ PDEVOBJ_bEnablePDEV()

BOOL NTAPI PDEVOBJ_bEnablePDEV ( PPDEVOBJ  ppdev,
PDEVMODEW  pdevmode,
PWSTR  pwszLogAddress 
)

Definition at line 160 of file pdevobj.c.

164 {
165  PFN_DrvEnablePDEV pfnEnablePDEV;
166  ULONG i;
167 
168  DPRINT("PDEVOBJ_bEnablePDEV()\n");
169 
170  /* Get the DrvEnablePDEV function */
171  pfnEnablePDEV = ppdev->pldev->pfn.EnablePDEV;
172 
173  /* Call the drivers DrvEnablePDEV function */
174  ppdev->dhpdev = pfnEnablePDEV(pdevmode,
176  HS_DDI_MAX,
177  ppdev->ahsurf,
178  sizeof(GDIINFO),
179  (PULONG)&ppdev->gdiinfo,
180  sizeof(DEVINFO),
181  &ppdev->devinfo,
182  (HDEV)ppdev,
183  ppdev->pGraphicsDevice->pwszDescription,
184  ppdev->pGraphicsDevice->DeviceObject);
185  if (ppdev->dhpdev == NULL)
186  {
187  DPRINT1("Failed to enable PDEV\n");
188  return FALSE;
189  }
190 
191  /* Fix up some values */
192  if (ppdev->gdiinfo.ulLogPixelsX == 0)
193  ppdev->gdiinfo.ulLogPixelsX = 96;
194 
195  if (ppdev->gdiinfo.ulLogPixelsY == 0)
196  ppdev->gdiinfo.ulLogPixelsY = 96;
197 
198  /* Set raster caps */
200  if ((ppdev->gdiinfo.ulTechnology != DT_PLOTTER) && (ppdev->gdiinfo.ulTechnology != DT_CHARSTREAM))
202  if (ppdev->gdiinfo.ulTechnology == DT_RASDISPLAY)
203  ppdev->gdiinfo.flRaster |= RC_FLOODFILL;
205  ppdev->gdiinfo.flRaster |= RC_PALETTE;
206 
207  /* Setup Palette */
209 
210  /* Setup hatch brushes */
211  for (i = 0; i < HS_DDI_MAX; i++)
212  {
213  if (ppdev->ahsurf[i] == NULL)
214  ppdev->ahsurf[i] = gahsurfHatch[i];
215  }
216 
217  DPRINT("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev);
218 
219  return TRUE;
220 }
DHPDEV dhpdev
Definition: pdevobj.h:121
#define RC_STRETCHBLT
Definition: wingdi.h:754
#define TRUE
Definition: types.h:120
#define HS_DDI_MAX
Definition: winddi.h:3954
struct _LDEVOBJ * pldev
Definition: pdevobj.h:120
#define RC_BIGFONT
Definition: wingdi.h:780
#define RC_GDI20_OUTPUT
Definition: wingdi.h:785
GDIINFO gdiinfo
Definition: pdevobj.h:124
#define RC_BITMAP64
Definition: wingdi.h:782
ULONG ulLogPixelsY
Definition: winddi.h:889
#define DT_RASDISPLAY
Definition: wingdi.h:707
#define RC_FLOODFILL
Definition: wingdi.h:750
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
Definition: glfuncs.h:248
HPALETTE hpalDefault
Definition: winddi.h:398
struct _PALETTE * ppalSurf
Definition: pdevobj.h:122
smooth NULL
Definition: ftsmooth.c:416
ULONG ulTechnology
Definition: winddi.h:879
void DPRINT(...)
Definition: polytest.cpp:61
HSURF gahsurfHatch[HS_DDI_MAX]
Definition: engbrush.c:24
#define PALETTE_ShareLockPalette(hpal)
Definition: palette.h:57
#define RC_OP_DX_OUTPUT
Definition: wingdi.h:788
DEVINFO devinfo
Definition: pdevobj.h:123
#define RC_PALETTE
Definition: wingdi.h:789
#define RC_BITBLT
Definition: wingdi.h:781
#define DT_PLOTTER
Definition: wingdi.h:706
_In_ LPWSTR pwszLogAddress
Definition: winddi.h:3548
#define DT_CHARSTREAM
Definition: wingdi.h:710
ULONG flRaster
Definition: winddi.h:887
#define RC_DI_BITMAP
Definition: wingdi.h:784
#define RC_STRETCHDIB
Definition: wingdi.h:755
FLONG flGraphicsCaps
Definition: winddi.h:390
unsigned int * PULONG
Definition: retypes.h:1
#define RC_DIBTODEV
Definition: wingdi.h:749
#define DPRINT1
Definition: precomp.h:8
FN_DrvEnablePDEV * PFN_DrvEnablePDEV
Definition: winddi.h:3558
unsigned int ULONG
Definition: retypes.h:1
ULONG ulLogPixelsX
Definition: winddi.h:888
#define GCAPS_PALMANAGED
Definition: winddi.h:341
HSURF ahsurf[HS_DDI_MAX]
Definition: pdevobj.h:99

Referenced by EngpCreatePDEV().

◆ PDEVOBJ_bSwitchMode()

BOOL NTAPI PDEVOBJ_bSwitchMode ( PPDEVOBJ  ppdev,
PDEVMODEW  pdm 
)

Definition at line 505 of file pdevobj.c.

508 {
509  UNICODE_STRING ustrDevice;
510  PPDEVOBJ ppdevTmp;
512  BOOL retval = FALSE;
513 
514  /* Lock the PDEV */
516 
517  /* And everything else */
519 
520  DPRINT1("PDEVOBJ_bSwitchMode, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
521 
522  // Lookup the GraphicsDevice + select DEVMODE
523  // pdm = PDEVOBJ_pdmMatchDevMode(ppdev, pdm);
524 
525  /* 1. Temporarily disable the current PDEV and reset video to its default mode */
526  if (!ppdev->pfn.AssertMode(ppdev->dhpdev, FALSE))
527  {
528  DPRINT1("DrvAssertMode(FALSE) failed\n");
529  goto leave;
530  }
531 
532  /* 2. Create new PDEV */
534  ppdevTmp = EngpCreatePDEV(&ustrDevice, pdm);
535  if (!ppdevTmp)
536  {
537  DPRINT1("Failed to create a new PDEV\n");
538  goto leave2;
539  }
540 
541  /* 3. Create a new surface */
542  pSurface = PDEVOBJ_pSurface(ppdevTmp);
543  if (!pSurface)
544  {
545  DPRINT1("PDEVOBJ_pSurface failed\n");
546  PDEVOBJ_vRelease(ppdevTmp);
547  goto leave2;
548  }
549 
550  /* 4. Get DirectDraw information */
551  /* 5. Enable DirectDraw Not traced */
552  /* 6. Copy old PDEV state to new PDEV instance */
553 
554  /* 7. Switch the PDEVs */
555  PDEVOBJ_vSwitchPdev(ppdev, ppdevTmp);
556 
557  /* 8. Disable DirectDraw */
558 
559  PDEVOBJ_vRelease(ppdevTmp);
560 
561  /* Update primary display capabilities */
562  if(ppdev == gppdevPrimary)
563  {
564  PDEVOBJ_vGetDeviceCaps(ppdev, &GdiHandleTable->DevCaps);
565  }
566 
567  /* Success! */
568  retval = TRUE;
569 
570 leave2:
571  /* Set the new video mode, or restore the original one in case of failure */
572  if (!ppdev->pfn.AssertMode(ppdev->dhpdev, TRUE))
573  {
574  DPRINT1("DrvAssertMode(TRUE) failed\n");
575  }
576 
577 leave:
578  /* Unlock everything else */
580  /* Unlock the PDEV */
582 
583  DPRINT1("leave, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
584 
585  return retval;
586 }
DHPDEV dhpdev
Definition: pdevobj.h:121
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
Definition: eng.c:235
#define TRUE
Definition: types.h:120
WCHAR szWinDeviceName[CCHDEVICENAME/2]
Definition: pdevobj.h:60
PSURFACE NTAPI PDEVOBJ_pSurface(PPDEVOBJ ppdev)
Definition: pdevobj.c:233
PPDEVOBJ gppdevPrimary
Definition: pdevobj.c:13
static PPDEVOBJ EngpCreatePDEV(PUNICODE_STRING pustrDeviceName, PDEVMODEW pdm)
Definition: pdevobj.c:343
unsigned int BOOL
Definition: ntddk_ex.h:94
static HSEMAPHORE ghsemPDEV
Definition: pdevobj.c:16
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
HSEMAPHORE hsemDevLock
Definition: pdevobj.h:91
DRIVER_FUNCTIONS pfn
Definition: pdevobj.h:139
VOID NTAPI PDEVOBJ_vGetDeviceCaps(IN PPDEVOBJ ppdev, OUT PDEVCAPS pDevCaps)
Definition: pdevobj.c:679
#define GdiHandleTable
Definition: win32nt.h:36
_In_ DD_SURFACE_LOCAL * pSurface
Definition: winddi.h:3481
VOID NTAPI PDEVOBJ_vSwitchPdev(PPDEVOBJ ppdev, PPDEVOBJ ppdev2)
Definition: pdevobj.c:451
PFN_DrvAssertMode AssertMode
Definition: ntgdityp.h:568
PSURFACE pSurface
Definition: pdevobj.h:125
#define DPRINT1
Definition: precomp.h:8
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
PGRAPHICS_DEVICE pGraphicsDevice
Definition: pdevobj.h:128
VOID NTAPI PDEVOBJ_vRelease(PPDEVOBJ ppdev)
Definition: pdevobj.c:93

Referenced by UserChangeDisplaySettings().

◆ PDEVOBJ_iGetColorManagementCaps()

INT NTAPI PDEVOBJ_iGetColorManagementCaps ( PPDEVOBJ  ppdev)

Definition at line 658 of file pdevobj.c.

659 {
660  INT ret = CM_NONE;
661 
662  if (ppdev->flFlags & PDEV_DISPLAY)
663  {
664  if (ppdev->devinfo.iDitherFormat == BMF_8BPP ||
666  ret = CM_GAMMA_RAMP;
667  }
668 
670  ret |= CM_CMYK_COLOR;
671  if (ppdev->devinfo.flGraphicsCaps & GCAPS_ICM)
672  ret |= CM_DEVICE_ICM;
673 
674  return ret;
675 }
#define GCAPS_CMYKCOLOR
Definition: winddi.h:347
Definition: xlate.c:10
int32_t INT
Definition: typedefs.h:56
FLONG flFlags
Definition: pdevobj.h:89
ULONG iDitherFormat
Definition: winddi.h:395
#define GCAPS2_CHANGEGAMMARAMP
Definition: winddi.h:370
DEVINFO devinfo
Definition: pdevobj.h:123
int ret
#define GCAPS_ICM
Definition: winddi.h:346
FLONG flGraphicsCaps
Definition: winddi.h:390
FLONG flGraphicsCaps2
Definition: winddi.h:399

Referenced by PDEVOBJ_vGetDeviceCaps().

◆ PDEVOBJ_pdmMatchDevMode()

PDEVMODEW NTAPI PDEVOBJ_pdmMatchDevMode ( PPDEVOBJ  ppdev,
PDEVMODEW  pdm 
)

Definition at line 304 of file pdevobj.c.

307 {
308  PGRAPHICS_DEVICE pGraphicsDevice;
309  PDEVMODEW pdmCurrent;
310  ULONG i;
311  DWORD dwFields;
312 
313  pGraphicsDevice = ppdev->pGraphicsDevice;
314 
315  for (i = 0; i < pGraphicsDevice->cDevModes; i++)
316  {
317  pdmCurrent = pGraphicsDevice->pDevModeList[i].pdm;
318 
319  /* Compare asked DEVMODE fields
320  * Only compare those that are valid in both DEVMODE structs */
321  dwFields = pdmCurrent->dmFields & pdm->dmFields ;
322 
323  /* For now, we only need those */
324  if ((dwFields & DM_BITSPERPEL) &&
325  (pdmCurrent->dmBitsPerPel != pdm->dmBitsPerPel)) continue;
326  if ((dwFields & DM_PELSWIDTH) &&
327  (pdmCurrent->dmPelsWidth != pdm->dmPelsWidth)) continue;
328  if ((dwFields & DM_PELSHEIGHT) &&
329  (pdmCurrent->dmPelsHeight != pdm->dmPelsHeight)) continue;
330  if ((dwFields & DM_DISPLAYFREQUENCY) &&
331  (pdmCurrent->dmDisplayFrequency != pdm->dmDisplayFrequency)) continue;
332 
333  /* Match! Return the DEVMODE */
334  return pdmCurrent;
335  }
336 
337  /* Nothing found */
338  return NULL;
339 }
DWORD dmFields
Definition: wingdi.h:1600
PDEVMODEENTRY pDevModeList
Definition: pdevobj.h:70
DWORD dmBitsPerPel
Definition: wingdi.h:1625
PDEVMODEW pdm
Definition: pdevobj.h:53
#define DM_PELSWIDTH
Definition: wingdi.h:1251
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
Definition: glfuncs.h:248
smooth NULL
Definition: ftsmooth.c:416
ULONG cDevModes
Definition: pdevobj.h:69
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD dmPelsWidth
Definition: wingdi.h:1626
#define DM_DISPLAYFREQUENCY
Definition: wingdi.h:1254
DWORD dmDisplayFrequency
Definition: wingdi.h:1632
#define DM_PELSHEIGHT
Definition: wingdi.h:1252
DWORD dmPelsHeight
Definition: wingdi.h:1627
unsigned int ULONG
Definition: retypes.h:1
#define DM_BITSPERPEL
Definition: wingdi.h:1250
PGRAPHICS_DEVICE pGraphicsDevice
Definition: pdevobj.h:128

Referenced by EngpCreatePDEV(), and UserChangeDisplaySettings().

◆ PDEVOBJ_pSurface()

PSURFACE NTAPI PDEVOBJ_pSurface ( PPDEVOBJ  ppdev)

Definition at line 233 of file pdevobj.c.

235 {
236  HSURF hsurf;
237 
238  /* Check if there is no surface for this PDEV yet */
239  if (ppdev->pSurface == NULL)
240  {
241  /* Call the drivers DrvEnableSurface */
242  hsurf = ppdev->pldev->pfn.EnableSurface(ppdev->dhpdev);
243  if (hsurf== NULL)
244  {
245  DPRINT1("Failed to create PDEV surface!\n");
246  return NULL;
247  }
248 
249  /* Get a reference to the surface */
250  ppdev->pSurface = SURFACE_ShareLockSurface(hsurf);
251  NT_ASSERT(ppdev->pSurface != NULL);
252  }
253 
254  /* Increment reference count */
256 
257  DPRINT("PDEVOBJ_pSurface() returning %p\n", ppdev->pSurface);
258  return ppdev->pSurface;
259 }
DHPDEV dhpdev
Definition: pdevobj.h:121
struct _LDEVOBJ * pldev
Definition: pdevobj.h:120
#define SURFACE_ShareLockSurface(hBMObj)
Definition: surface.h:91
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
typedef HSURF(APIENTRY FN_DrvEnableSurface)(_In_ DHPDEV dhpdev)
BASEOBJECT BaseObject
Definition: surface.h:6
VOID NTAPI GDIOBJ_vReferenceObjectByPointer(POBJ pobj)
Definition: gdiobj.c:729
PSURFACE pSurface
Definition: pdevobj.h:125
#define DPRINT1
Definition: precomp.h:8
#define NT_ASSERT
Definition: rtlfuncs.h:3312

Referenced by DC_vInitDc(), DC_vUpdateDC(), IntCreatePrimarySurface(), and PDEVOBJ_bSwitchMode().

◆ PDEVOBJ_sizl()

PSIZEL FASTCALL PDEVOBJ_sizl ( PPDEVOBJ  ppdev,
PSIZEL  psizl 
)

Definition at line 973 of file pdevobj.c.

974 {
975  if (ppdev->flFlags & PDEV_META_DEVICE)
976  {
977  psizl->cx = ppdev->ulHorzRes;
978  psizl->cy = ppdev->ulVertRes;
979  }
980  else
981  {
982  psizl->cx = ppdev->gdiinfo.ulHorzRes;
983  psizl->cy = ppdev->gdiinfo.ulVertRes;
984  }
985  return psizl;
986 }
GDIINFO gdiinfo
Definition: pdevobj.h:124
FLONG flFlags
Definition: pdevobj.h:89
ULONG ulHorzRes
Definition: winddi.h:882
LONG cx
Definition: windef.h:319
ULONG ulHorzRes
Definition: pdevobj.h:110
ULONG ulVertRes
Definition: pdevobj.h:111
ULONG ulVertRes
Definition: winddi.h:883
LONG cy
Definition: windef.h:320

Referenced by DC_vUpdateDC(), MakeInfoDC(), and UserUpdateMonitorSize().

◆ PDEVOBJ_vCompletePDEV()

VOID NTAPI PDEVOBJ_vCompletePDEV ( PPDEVOBJ  ppdev)

Definition at line 224 of file pdevobj.c.

226 {
227  /* Call the drivers DrvCompletePDEV function */
228  ppdev->pldev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
229 }
DHPDEV dhpdev
Definition: pdevobj.h:121
struct _LDEVOBJ * pldev
Definition: pdevobj.h:120

Referenced by EngpCreatePDEV().

◆ PDEVOBJ_vDeletePDEV()

static VOID PDEVOBJ_vDeletePDEV ( PPDEVOBJ  ppdev)
static

Definition at line 82 of file pdevobj.c.

84 {
86  if (ppdev->pEDDgpl)
89 }
_Requires_lock_not_held_ hsem ENGAPI VOID APIENTRY EngDeleteSemaphore(_Inout_ __drv_freesMem(Mem) HSEMAPHORE hsem)
Definition: semaphor.c:106
HSEMAPHORE hsemDevLock
Definition: pdevobj.h:91
struct _EDD_DIRECTDRAW_GLOBAL * pEDDgpl
Definition: pdevobj.h:150
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define GDITAG_PDEV
Definition: tags.h:74

Referenced by PDEVOBJ_vRelease().

◆ PDEVOBJ_vGetDeviceCaps()

VOID NTAPI PDEVOBJ_vGetDeviceCaps ( IN PPDEVOBJ  ppdev,
OUT PDEVCAPS  pDevCaps 
)

Definition at line 679 of file pdevobj.c.

682 {
683  PGDIINFO pGdiInfo = &ppdev->gdiinfo;
684 
685  pDevCaps->ulVersion = pGdiInfo->ulVersion;
686  pDevCaps->ulTechnology = pGdiInfo->ulTechnology;
687  pDevCaps->ulHorzSizeM = (pGdiInfo->ulHorzSize + 500) / 1000;
688  pDevCaps->ulVertSizeM = (pGdiInfo->ulVertSize + 500) / 1000;
689  pDevCaps->ulHorzSize = pGdiInfo->ulHorzSize;
690  pDevCaps->ulVertSize = pGdiInfo->ulVertSize;
691  pDevCaps->ulHorzRes = pGdiInfo->ulHorzRes;
692  pDevCaps->ulVertRes = pGdiInfo->ulVertRes;
693  pDevCaps->ulBitsPixel = pGdiInfo->cBitsPixel;
694  if (pDevCaps->ulBitsPixel == 15) pDevCaps->ulBitsPixel = 16;
695  pDevCaps->ulPlanes = pGdiInfo->cPlanes;
696  pDevCaps->ulNumPens = pGdiInfo->ulNumColors;
697  if (pDevCaps->ulNumPens != -1) pDevCaps->ulNumPens *= 5;
698  pDevCaps->ulNumFonts = 0; // PDEVOBJ_cFonts(ppdev);
699  pDevCaps->ulNumColors = pGdiInfo->ulNumColors;
700  pDevCaps->ulRasterCaps = pGdiInfo->flRaster;
701  pDevCaps->ulAspectX = pGdiInfo->ulAspectX;
702  pDevCaps->ulAspectY = pGdiInfo->ulAspectY;
703  pDevCaps->ulAspectXY = pGdiInfo->ulAspectXY;
704  pDevCaps->ulLogPixelsX = pGdiInfo->ulLogPixelsX;
705  pDevCaps->ulLogPixelsY = pGdiInfo->ulLogPixelsY;
706  pDevCaps->ulSizePalette = pGdiInfo->ulNumPalReg;
707  pDevCaps->ulColorRes = pGdiInfo->ulDACRed +
708  pGdiInfo->ulDACGreen +
709  pGdiInfo->ulDACBlue;
710  pDevCaps->ulPhysicalWidth = pGdiInfo->szlPhysSize.cx;
714  pDevCaps->ulTextCaps = pGdiInfo->flTextCaps;
716  if (pGdiInfo->ulTechnology != DT_PLOTTER)
718  pDevCaps->ulVRefresh = pGdiInfo->ulVRefresh;
719  pDevCaps->ulDesktopHorzRes = pGdiInfo->ulHorzRes;
720  pDevCaps->ulDesktopVertRes = pGdiInfo->ulVertRes;
726  pDevCaps->ulShadeBlend = pGdiInfo->flShadeBlend;
728 }
SIZEL szlPhysSize
Definition: winddi.h:901
_Out_ PDEVCAPS pDevCaps
Definition: ntgdi.h:2664
#define TC_UA_ABLE
Definition: wingdi.h:817
ULONG flShadeBlend
Definition: winddi.h:920
ULONG ulBltAlignment
Definition: ntgdityp.h:321
ULONG ulHorzRes
Definition: ntgdityp.h:298
INT NTAPI PDEVOBJ_iGetColorManagementCaps(PPDEVOBJ ppdev)
Definition: pdevobj.c:658
ULONG ulDACRed
Definition: winddi.h:891
ULONG ulVertSizeM
Definition: ntgdityp.h:295
ULONG ulRasterCaps
Definition: ntgdityp.h:305
ULONG ulNumFonts
Definition: ntgdityp.h:303
ULONG yPanningAlignment
Definition: winddi.h:914
ULONG ulAspectY
Definition: winddi.h:895
ULONG ulDesktopVertRes
Definition: ntgdityp.h:320
ULONG ulHorzSize
Definition: ntgdityp.h:296
ULONG ulLogPixelsY
Definition: winddi.h:889
ULONG ulPanningHorzRes
Definition: winddi.h:911
ULONG ulBitsPixel
Definition: ntgdityp.h:300
ULONG cPlanes
Definition: winddi.h:885
ULONG flTextCaps
Definition: winddi.h:890
#define TC_SO_ABLE
Definition: wingdi.h:818
ULONG ulPhysicalHeight
Definition: ntgdityp.h:314
ULONG ulVRefresh
Definition: ntgdityp.h:318
LONG y
Definition: windef.h:315
ULONG ulPanningVertRes
Definition: ntgdityp.h:323
ULONG ulNumPalReg
Definition: winddi.h:902
ULONG ulShadeBlend
Definition: ntgdityp.h:326
ULONG ulVertSize
Definition: winddi.h:881
ULONG ulDACGreen
Definition: winddi.h:892
POINTL ptlPhysOffset
Definition: winddi.h:900
ULONG ulVersion
Definition: winddi.h:878
ULONG ulNumPens
Definition: ntgdityp.h:302
ULONG ulVertRes
Definition: ntgdityp.h:299
ULONG ulVertSize
Definition: ntgdityp.h:297
ULONG ulHorzRes
Definition: winddi.h:882
ULONG xPanningAlignment
Definition: ntgdityp.h:324
ULONG ulAspectXY
Definition: ntgdityp.h:308
LONG cx
Definition: windef.h:319
ULONG ulTechnology
Definition: winddi.h:879
ULONG ulAspectXY
Definition: winddi.h:896
ULONG xPanningAlignment
Definition: winddi.h:913
#define TC_VA_ABLE
Definition: wingdi.h:820
#define TC_OP_STROKE
Definition: wingdi.h:807
ULONG ulColorRes
Definition: ntgdityp.h:312
ULONG ulPhysicalOffsetY
Definition: ntgdityp.h:316
ULONG ulAspectY
Definition: ntgdityp.h:307
ULONG ulPlanes
Definition: ntgdityp.h:301
ULONG ulVersion
Definition: ntgdityp.h:292
ULONG ulBltAlignment
Definition: winddi.h:910
ULONG ulDACBlue
Definition: winddi.h:893
LONG x
Definition: windef.h:314
#define DT_PLOTTER
Definition: wingdi.h:706
ULONG ulHorzSize
Definition: winddi.h:880
ULONG ulPanningHorzRes
Definition: ntgdityp.h:322
ULONG ulDesktopHorzRes
Definition: ntgdityp.h:319
ULONG ulLogPixelsY
Definition: ntgdityp.h:310
ULONG flRaster
Definition: winddi.h:887
ULONG ulVRefresh
Definition: winddi.h:909
#define TC_OP_CHARACTER
Definition: wingdi.h:806
ULONG ulPhysicalOffsetX
Definition: ntgdityp.h:315
ULONG cBitsPixel
Definition: winddi.h:884
ULONG ulAspectX
Definition: winddi.h:894
ULONG ulTextCaps
Definition: ntgdityp.h:317
ULONG ulPhysicalWidth
Definition: ntgdityp.h:313
ULONG ulPanningVertRes
Definition: winddi.h:912
ULONG ulNumColors
Definition: winddi.h:886
ULONG ulAspectX
Definition: ntgdityp.h:306
ULONG ulColorMgmtCaps
Definition: ntgdityp.h:327
ULONG ulHorzSizeM
Definition: ntgdityp.h:294
ULONG ulNumColors
Definition: ntgdityp.h:304
ULONG ulLogPixelsX
Definition: winddi.h:888
ULONG ulVertRes
Definition: winddi.h:883
ULONG ulSizePalette
Definition: ntgdityp.h:311
ULONG yPanningAlignment
Definition: ntgdityp.h:325
ULONG ulLogPixelsX
Definition: ntgdityp.h:309
#define TC_CP_STROKE
Definition: wingdi.h:808
LONG cy
Definition: windef.h:320
ULONG ulTechnology
Definition: ntgdityp.h:293

Referenced by _Success_(), IntCreatePrimarySurface(), NtGdiGetDeviceCaps(), and PDEVOBJ_bSwitchMode().

◆ PDEVOBJ_vRefreshModeList()

VOID NTAPI PDEVOBJ_vRefreshModeList ( PPDEVOBJ  ppdev)

Definition at line 263 of file pdevobj.c.

265 {
266  PGRAPHICS_DEVICE pGraphicsDevice;
267  PDEVMODEINFO pdminfo, pdmiNext;
268  DEVMODEW dmDefault;
269 
270  /* Lock the PDEV */
272 
273  pGraphicsDevice = ppdev->pGraphicsDevice;
274 
275  /* Remember our default mode */
276  dmDefault = *pGraphicsDevice->pDevModeList[pGraphicsDevice->iDefaultMode].pdm;
277 
278  /* Clear out the modes */
279  for (pdminfo = pGraphicsDevice->pdevmodeInfo;
280  pdminfo;
281  pdminfo = pdmiNext)
282  {
283  pdmiNext = pdminfo->pdmiNext;
285  }
286  pGraphicsDevice->pdevmodeInfo = NULL;
287  ExFreePoolWithTag(pGraphicsDevice->pDevModeList, GDITAG_GDEVICE);
288  pGraphicsDevice->pDevModeList = NULL;
289 
290  /* Now re-populate the list */
291  if (!EngpPopulateDeviceModeList(pGraphicsDevice, &dmDefault))
292  {
293  DPRINT1("FIXME: EngpPopulateDeviceModeList failed, we just destroyed a perfectly good mode list\n");
294  }
295 
296  ppdev->pdmwDev = pGraphicsDevice->pDevModeList[pGraphicsDevice->iCurrentMode].pdm;
297 
298  /* Unlock PDEV */
300 }
BOOLEAN EngpPopulateDeviceModeList(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice, _In_ PDEVMODEW pdmDefault)
Definition: device.c:34
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
Definition: eng.c:235
#define GDITAG_DEVMODE
Definition: tags.h:73
PDEVMODEENTRY pDevModeList
Definition: pdevobj.h:70
PDEVMODEW pdm
Definition: pdevobj.h:53
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
smooth NULL
Definition: ftsmooth.c:416
PDEVMODEW pdmwDev
Definition: pdevobj.h:130
HSEMAPHORE hsemDevLock
Definition: pdevobj.h:91
ULONG iCurrentMode
Definition: pdevobj.h:78
struct _DEVMODEINFO * pdmiNext
Definition: pdevobj.h:44
#define GDITAG_GDEVICE
Definition: tags.h:98
#define DPRINT1
Definition: precomp.h:8
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
PDEVMODEINFO pdevmodeInfo
Definition: pdevobj.h:68
PGRAPHICS_DEVICE pGraphicsDevice
Definition: pdevobj.h:128
ULONG iDefaultMode
Definition: pdevobj.h:77

Referenced by UserEnumDisplaySettings().

◆ PDEVOBJ_vRelease()

VOID NTAPI PDEVOBJ_vRelease ( PPDEVOBJ  ppdev)

Definition at line 93 of file pdevobj.c.

94 {
95  /* Lock loader */
97 
98  /* Decrease reference count */
99  --ppdev->cPdevRefs;
100 
101  ASSERT(ppdev->cPdevRefs >= 0) ;
102 
103  /* Check if references are left */
104  if (ppdev->cPdevRefs == 0)
105  {
106  /* Do we have a surface? */
107  if (ppdev->pSurface)
108  {
109  /* Release the surface and let the driver free it */
111  ppdev->pfn.DisableSurface(ppdev->dhpdev);
112  }
113 
114  /* Do we have a palette? */
115  if(ppdev->ppalSurf)
116  {
118  }
119 
120  /* Check if the PDEV was enabled */
121  if (ppdev->dhpdev != NULL)
122  {
123  /* Disable the PDEV */
124  ppdev->pfn.DisablePDEV(ppdev->dhpdev);
125  }
126 
127  /* Remove it from list */
128  if( ppdev == gppdevList )
129  gppdevList = ppdev->ppdevNext ;
130  else
131  {
132  PPDEVOBJ ppdevCurrent = gppdevList;
133  BOOL found = FALSE ;
134  while (!found && ppdevCurrent->ppdevNext)
135  {
136  if (ppdevCurrent->ppdevNext == ppdev)
137  found = TRUE;
138  else
139  ppdevCurrent = ppdevCurrent->ppdevNext ;
140  }
141  if(found)
142  ppdevCurrent->ppdevNext = ppdev->ppdevNext;
143  }
144 
145  /* Is this the primary one ? */
146  if (ppdev == gppdevPrimary)
148 
149  /* Free it */
150  PDEVOBJ_vDeletePDEV(ppdev);
151  }
152 
153  /* Unlock loader */
155 
156 }
DHPDEV dhpdev
Definition: pdevobj.h:121
PFN_DrvDisablePDEV DisablePDEV
Definition: ntgdityp.h:565
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
Definition: eng.c:235
LONG cPdevRefs
Definition: pdevobj.h:86
#define TRUE
Definition: types.h:120
#define SURFACE_ShareUnlockSurface(pBMObj)
Definition: surface.h:102
PPDEVOBJ gppdevPrimary
Definition: pdevobj.c:13
struct _PDEVOBJ * ppdevNext
Definition: pdevobj.h:85
unsigned int BOOL
Definition: ntddk_ex.h:94
static HSEMAPHORE ghsemPDEV
Definition: pdevobj.c:16
struct _PALETTE * ppalSurf
Definition: pdevobj.h:122
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
smooth NULL
Definition: ftsmooth.c:416
DRIVER_FUNCTIONS pfn
Definition: pdevobj.h:139
static PPDEVOBJ gppdevList
Definition: pdevobj.c:15
PFN_DrvDisableSurface DisableSurface
Definition: ntgdityp.h:567
static VOID PDEVOBJ_vDeletePDEV(PPDEVOBJ ppdev)
Definition: pdevobj.c:82
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define PALETTE_ShareUnlockPalette(ppal)
Definition: palette.h:59
PSURFACE pSurface
Definition: pdevobj.h:125

Referenced by DC_vCleanup(), EngpCreatePDEV(), GreCreateCompatibleDC(), GreOpenDCW(), NtGdiExtEscape(), PDEVOBJ_bSwitchMode(), UserChangeDisplaySettings(), UserEnumCurrentDisplaySettings(), and UserEnumDisplaySettings().

◆ PDEVOBJ_vSwitchPdev()

VOID NTAPI PDEVOBJ_vSwitchPdev ( PPDEVOBJ  ppdev,
PPDEVOBJ  ppdev2 
)

Definition at line 451 of file pdevobj.c.

454 {
455  union
456  {
457  DRIVER_FUNCTIONS pfn;
458  GDIINFO gdiinfo;
459  DEVINFO devinfo;
460  DWORD StateFlags;
461  } temp;
462 
463  /* Exchange driver functions */
464  temp.pfn = ppdev->pfn;
465  ppdev->pfn = ppdev2->pfn;
466  ppdev2->pfn = temp.pfn;
467 
468  /* Exchange LDEVs */
469  SwitchPointer(&ppdev->pldev, &ppdev2->pldev);
470 
471  /* Exchange DHPDEV */
472  SwitchPointer(&ppdev->dhpdev, &ppdev2->dhpdev);
473 
474  /* Exchange surfaces and associate them with their new PDEV */
475  SwitchPointer(&ppdev->pSurface, &ppdev2->pSurface);
476  ppdev->pSurface->SurfObj.hdev = (HDEV)ppdev;
477  ppdev2->pSurface->SurfObj.hdev = (HDEV)ppdev2;
478 
479  /* Exchange devinfo */
480  temp.devinfo = ppdev->devinfo;
481  ppdev->devinfo = ppdev2->devinfo;
482  ppdev2->devinfo = temp.devinfo;
483 
484  /* Exchange gdiinfo */
485  temp.gdiinfo = ppdev->gdiinfo;
486  ppdev->gdiinfo = ppdev2->gdiinfo;
487  ppdev2->gdiinfo = temp.gdiinfo;
488 
489  /* Exchange DEVMODE */
490  SwitchPointer(&ppdev->pdmwDev, &ppdev2->pdmwDev);
491 
492  /* Exchange state flags */
493  temp.StateFlags = ppdev->pGraphicsDevice->StateFlags;
495  ppdev2->pGraphicsDevice->StateFlags = temp.StateFlags;
496 
497  /* Notify each driver instance of its new HDEV association */
498  ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
499  ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2);
500 }
DHPDEV dhpdev
Definition: pdevobj.h:121
struct _LDEVOBJ * pldev
Definition: pdevobj.h:120
GDIINFO gdiinfo
Definition: pdevobj.h:124
DWORD StateFlags
Definition: pdevobj.h:66
SURFOBJ SurfObj
Definition: surface.h:8
PDEVMODEW pdmwDev
Definition: pdevobj.h:130
DRIVER_FUNCTIONS pfn
Definition: pdevobj.h:139
DEVINFO devinfo
Definition: pdevobj.h:123
unsigned long DWORD
Definition: ntddk_ex.h:95
HDEV hdev
Definition: winddi.h:1208
static calc_node_t temp
Definition: rpn_ieee.c:38
PSURFACE pSurface
Definition: pdevobj.h:125
PFN_DrvCompletePDEV CompletePDEV
Definition: ntgdityp.h:564
PGRAPHICS_DEVICE pGraphicsDevice
Definition: pdevobj.h:128
FORCEINLINE VOID SwitchPointer(_Inout_ PVOID pvPointer1, _Inout_ PVOID pvPointer2)
Definition: pdevobj.c:436

Referenced by PDEVOBJ_bSwitchMode().

◆ SwitchPointer()

FORCEINLINE VOID SwitchPointer ( _Inout_ PVOID  pvPointer1,
_Inout_ PVOID  pvPointer2 
)

Definition at line 436 of file pdevobj.c.

439 {
440  PVOID *ppvPointer1 = pvPointer1;
441  PVOID *ppvPointer2 = pvPointer2;
442  PVOID pvTemp;
443 
444  pvTemp = *ppvPointer1;
445  *ppvPointer1 = *ppvPointer2;
446  *ppvPointer2 = pvTemp;
447 }

Referenced by PDEVOBJ_vSwitchPdev().

Variable Documentation

◆ ghsemPDEV

HSEMAPHORE ghsemPDEV
static

◆ gppdevList

PPDEVOBJ gppdevList = NULL
static

Definition at line 15 of file pdevobj.c.

Referenced by EngpGetPDEV(), NtGdiGetDhpdev(), and PDEVOBJ_vRelease().

◆ gppdevPrimary