ReactOS 0.4.16-dev-1946-g52006dd
monitor.c File Reference
#include <win32k.h>
#include <debug.h>
Include dependency graph for monitor.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

 DBG_DEFAULT_CHANNEL (UserMonitor)
 
static PMONITOR IntCreateMonitorObject (VOID)
 
static void IntDestroyMonitorObject (IN PMONITOR pMonitor)
 
PMONITOR NTAPI UserGetMonitorObject (IN HMONITOR hMonitor)
 
PMONITOR NTAPI UserGetPrimaryMonitor (VOID)
 
NTSTATUS NTAPI UserAttachMonitor (IN HDEV hDev)
 
NTSTATUS NTAPI UserDetachMonitor (IN HDEV hDev)
 
NTSTATUS NTAPI UserUpdateMonitorSize (IN HDEV hDev)
 
static UINT IntGetMonitorsFromRect (OPTIONAL IN LPCRECTL pRect, OPTIONAL OUT HMONITOR *phMonitorList, OPTIONAL OUT PRECTL prcMonitorList, OPTIONAL IN DWORD dwListSize, OPTIONAL IN DWORD dwFlags)
 
HMONITOR FASTCALL IntGetMonitorFromRect (_In_ LPCRECTL pRect, _In_ DWORD dwFlags)
 
PMONITOR NTAPI UserMonitorFromRect (PRECTL pRect, DWORD dwFlags)
 
PMONITOR FASTCALL UserMonitorFromPoint (IN POINT pt, IN DWORD dwFlags)
 
INT APIENTRY NtUserEnumDisplayMonitors (OPTIONAL IN HDC hdc, OPTIONAL IN LPCRECTL pUnsafeRect, OPTIONAL OUT HMONITOR *phUnsafeMonitorList, OPTIONAL OUT PRECTL prcUnsafeMonitorList, OPTIONAL IN DWORD dwListSize)
 
BOOL APIENTRY NtUserGetMonitorInfo (IN HMONITOR hMonitor, OUT LPMONITORINFO pMonitorInfoUnsafe)
 
HMONITOR APIENTRY NtUserMonitorFromPoint (_In_ POINT pt, _In_ DWORD dwFlags)
 
HMONITOR APIENTRY NtUserMonitorFromRect (_In_ LPCRECTL pRectUnsafe, _In_ DWORD dwFlags)
 
HMONITOR APIENTRY NtUserMonitorFromWindow (_In_ HWND hWnd, _In_ DWORD dwFlags)
 

Variables

static PMONITOR gMonitorList = NULL
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file monitor.c.

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserMonitor  )

◆ IntCreateMonitorObject()

static PMONITOR IntCreateMonitorObject ( VOID  )
static

Definition at line 33 of file monitor.c.

34{
36}
#define NULL
Definition: types.h:112
@ TYPE_MONITOR
Definition: ntuser.h:52
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
Definition: object.c:568

Referenced by UserAttachMonitor().

◆ IntDestroyMonitorObject()

static void IntDestroyMonitorObject ( IN PMONITOR  pMonitor)
static

Definition at line 50 of file monitor.c.

51{
52 /* Remove monitor region */
53 if (pMonitor->hrgnMonitor)
54 {
55 GreSetObjectOwner(pMonitor->hrgnMonitor, GDI_OBJ_HMGR_POWNED);
56 GreDeleteObject(pMonitor->hrgnMonitor);
57 }
58
59 /* Destroy monitor object */
60 UserDereferenceObject(pMonitor);
62}
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
Definition: gdiobj.c:1268
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1165
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:717

Referenced by UserDetachMonitor().

◆ IntGetMonitorFromRect()

HMONITOR FASTCALL IntGetMonitorFromRect ( _In_ LPCRECTL  pRect,
_In_ DWORD  dwFlags 
)

Definition at line 405 of file monitor.c.

408{
409 ULONG cMonitors, LargestArea = 0, i;
410 PRECTL prcMonitorList = NULL;
411 HMONITOR *phMonitorList = NULL;
412 HMONITOR hMonitor = NULL;
413
414 /* Find intersecting monitors */
415 cMonitors = IntGetMonitorsFromRect(pRect, &hMonitor, NULL, 1, dwFlags);
416 if (cMonitors <= 1)
417 {
418 /* No or one monitor found. Just return handle. */
419 goto cleanup;
420 }
421
422 /* There is more than one monitor. Find monitor with largest intersection.
423 Temporary reset hMonitor */
424 hMonitor = NULL;
425
426 /* Allocate helper buffers */
427 phMonitorList = ExAllocatePoolWithTag(PagedPool,
428 sizeof(HMONITOR) * cMonitors,
430 if (phMonitorList == NULL)
431 {
433 goto cleanup;
434 }
435
436 prcMonitorList = ExAllocatePoolWithTag(PagedPool,
437 sizeof(RECT) * cMonitors,
439 if (prcMonitorList == NULL)
440 {
442 goto cleanup;
443 }
444
445 /* Get intersecting monitors again but now with rectangle list */
446 cMonitors = IntGetMonitorsFromRect(pRect, phMonitorList, prcMonitorList, cMonitors, 0);
447
448 /* Find largest intersection */
449 for (i = 0; i < cMonitors; i++)
450 {
451 ULONG Area = (prcMonitorList[i].right - prcMonitorList[i].left) *
452 (prcMonitorList[i].bottom - prcMonitorList[i].top);
453 if (Area >= LargestArea)
454 {
455 hMonitor = phMonitorList[i];
456 LargestArea = Area;
457 }
458 }
459
460cleanup:
461 if (phMonitorList)
463 if (prcMonitorList)
465 return hMonitor;
466}
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
static void cleanup(void)
Definition: main.c:1335
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLint GLint bottom
Definition: glext.h:7726
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
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
long right
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
Definition: windef.h:99
uint32_t ULONG
Definition: typedefs.h:59
static UINT IntGetMonitorsFromRect(OPTIONAL IN LPCRECTL pRect, OPTIONAL OUT HMONITOR *phMonitorList, OPTIONAL OUT PRECTL prcMonitorList, OPTIONAL IN DWORD dwListSize, OPTIONAL IN DWORD dwFlags)
Definition: monitor.c:310
#define USERTAG_MONITORRECTS
Definition: tags.h:254
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22

Referenced by NtUserMonitorFromRect(), NtUserMonitorFromWindow(), and UserMonitorFromRect().

◆ IntGetMonitorsFromRect()

static UINT IntGetMonitorsFromRect ( OPTIONAL IN LPCRECTL  pRect,
OPTIONAL OUT HMONITOR phMonitorList,
OPTIONAL OUT PRECTL  prcMonitorList,
OPTIONAL IN DWORD  dwListSize,
OPTIONAL IN DWORD  dwFlags 
)
static

Definition at line 310 of file monitor.c.

315{
316 PMONITOR pMonitor, pNearestMonitor = NULL, pPrimaryMonitor = NULL;
317 UINT cMonitors = 0;
318 ULONG iNearestDistance = 0xffffffff;
319
320 /* Find monitors which intersects the rectangle */
321 for (pMonitor = gMonitorList; pMonitor != NULL; pMonitor = pMonitor->pMonitorNext)
322 {
323 RECTL MonitorRect, IntersectionRect;
324
325 MonitorRect = pMonitor->rcMonitor;
326
327 TRACE("MonitorRect: left = %d, top = %d, right = %d, bottom = %d\n",
328 MonitorRect.left, MonitorRect.top, MonitorRect.right, MonitorRect.bottom);
329
330 /* Save primary monitor for later usage */
331 if (dwFlags == MONITOR_DEFAULTTOPRIMARY && pMonitor->IsPrimary)
332 pPrimaryMonitor = pMonitor;
333
334 /* Check if a rect is given */
335 if (pRect == NULL)
336 {
337 /* No rect given, so use the full monitor rect */
338 IntersectionRect = MonitorRect;
339 }
340 /* We have a rect, calculate intersection */
341 else if (!RECTL_bIntersectRect(&IntersectionRect, &MonitorRect, pRect))
342 {
343 /* Rects did not intersect */
344 if (dwFlags == MONITOR_DEFAULTTONEAREST)
345 {
346 ULONG cx, cy, iDistance;
347
348 /* Get x and y distance */
349 cx = min(abs(MonitorRect.left - pRect->right),
350 abs(pRect->left - MonitorRect.right));
351 cy = min(abs(MonitorRect.top - pRect->bottom),
352 abs(pRect->top - MonitorRect.bottom));
353
354 /* Calculate distance square */
355 iDistance = cx * cx + cy * cy;
356
357 /* Check if this is the new nearest monitor */
358 if (iDistance < iNearestDistance)
359 {
360 iNearestDistance = iDistance;
361 pNearestMonitor = pMonitor;
362 }
363 }
364
365 continue;
366 }
367
368 /* Check if there's space in the buffer */
369 if (cMonitors < dwListSize)
370 {
371 /* Save monitor data */
372 if (phMonitorList != NULL)
373 phMonitorList[cMonitors] = UserHMGetHandle(pMonitor);
374 if (prcMonitorList != NULL)
375 prcMonitorList[cMonitors] = IntersectionRect;
376 }
377
378 /* Increase count of found monitors */
379 cMonitors++;
380 }
381
382 /* Nothing has been found? */
383 if (cMonitors == 0)
384 {
385 /* Check if we shall default to the nearest monitor */
386 if (dwFlags == MONITOR_DEFAULTTONEAREST && pNearestMonitor)
387 {
388 if (phMonitorList && dwListSize > 0)
389 phMonitorList[cMonitors] = UserHMGetHandle(pNearestMonitor);
390 cMonitors++;
391 }
392 /* Check if we shall default to the primary monitor */
393 else if (dwFlags == MONITOR_DEFAULTTOPRIMARY && pPrimaryMonitor)
394 {
395 if (phMonitorList != NULL && dwListSize > 0)
396 phMonitorList[cMonitors] = UserHMGetHandle(pPrimaryMonitor);
397 cMonitors++;
398 }
399 }
400
401 return cMonitors;
402}
#define abs(i)
Definition: fconv.c:206
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define TRACE(s)
Definition: solgame.cpp:4
long bottom
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
RECT rcMonitor
Definition: monitor.h:18
DWORD IsPrimary
Definition: monitor.h:15
struct _MONITOR * pMonitorNext
Definition: monitor.h:7
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
Definition: rect.c:55
static PMONITOR gMonitorList
Definition: monitor.c:19

Referenced by IntGetMonitorFromRect(), NtUserEnumDisplayMonitors(), NtUserMonitorFromPoint(), and UserMonitorFromPoint().

◆ NtUserEnumDisplayMonitors()

INT APIENTRY NtUserEnumDisplayMonitors ( OPTIONAL IN HDC  hdc,
OPTIONAL IN LPCRECTL  pUnsafeRect,
OPTIONAL OUT HMONITOR phUnsafeMonitorList,
OPTIONAL OUT PRECTL  prcUnsafeMonitorList,
OPTIONAL IN DWORD  dwListSize 
)

Definition at line 552 of file monitor.c.

558{
559 UINT cMonitors, i;
560 INT iRet = -1;
561 HMONITOR *phMonitorList = NULL;
562 PRECTL prcMonitorList = NULL;
563 RECTL rc, *pRect;
564 RECTL DcRect = {0};
566
567 /* Get rectangle */
568 if (pUnsafeRect != NULL)
569 {
570 Status = MmCopyFromCaller(&rc, pUnsafeRect, sizeof(RECT));
571 if (!NT_SUCCESS(Status))
572 {
573 TRACE("MmCopyFromCaller() failed!\n");
575 return -1;
576 }
577 }
578
579 if (hdc != NULL)
580 {
581 PDC pDc;
582 INT iRgnType;
583
584 /* Get visible region bounding rect */
585 pDc = DC_LockDc(hdc);
586 if (pDc == NULL)
587 {
588 TRACE("DC_LockDc() failed!\n");
589 /* FIXME: setlasterror? */
590 return -1;
591 }
592 iRgnType = REGION_GetRgnBox(pDc->prgnVis, &DcRect);
593 DC_UnlockDc(pDc);
594
595 if (iRgnType == 0)
596 {
597 TRACE("NtGdiGetRgnBox() failed!\n");
598 return -1;
599 }
600 if (iRgnType == NULLREGION)
601 return 0;
602 if (iRgnType == COMPLEXREGION)
603 {
604 /* TODO: Warning */
605 }
606
607 /* If hdc and pRect are given the area of interest is pRect with
608 coordinate origin at the DC position */
609 if (pUnsafeRect != NULL)
610 {
611 rc.left += DcRect.left;
612 rc.right += DcRect.left;
613 rc.top += DcRect.top;
614 rc.bottom += DcRect.top;
615 }
616 /* If hdc is given and pRect is not the area of interest is the
617 bounding rect of hdc */
618 else
619 {
620 rc = DcRect;
621 }
622 }
623
624 if (hdc == NULL && pUnsafeRect == NULL)
625 pRect = NULL;
626 else
627 pRect = &rc;
628
630
631 /* Find intersecting monitors */
632 cMonitors = IntGetMonitorsFromRect(pRect, NULL, NULL, 0, MONITOR_DEFAULTTONULL);
633 if (cMonitors == 0 || dwListSize == 0 ||
634 (phUnsafeMonitorList == NULL && prcUnsafeMonitorList == NULL))
635 {
636 /* Simple case - just return monitors count */
637 TRACE("cMonitors = %u\n", cMonitors);
638 iRet = cMonitors;
639 goto cleanup;
640 }
641
642 /* Allocate safe buffers */
643 if (phUnsafeMonitorList != NULL && dwListSize != 0)
644 {
645 phMonitorList = ExAllocatePoolWithTag(PagedPool, sizeof (HMONITOR) * dwListSize, USERTAG_MONITORRECTS);
646 if (phMonitorList == NULL)
647 {
649 goto cleanup;
650 }
651 }
652 if (prcUnsafeMonitorList != NULL && dwListSize != 0)
653 {
654 prcMonitorList = ExAllocatePoolWithTag(PagedPool, sizeof(RECT) * dwListSize,USERTAG_MONITORRECTS);
655 if (prcMonitorList == NULL)
656 {
658 goto cleanup;
659 }
660 }
661
662 /* Get intersecting monitors */
663 cMonitors = IntGetMonitorsFromRect(pRect, phMonitorList, prcMonitorList,
664 dwListSize, MONITOR_DEFAULTTONULL);
665
666 if (hdc != NULL && pRect != NULL && prcMonitorList != NULL)
667 {
668 for (i = 0; i < min(cMonitors, dwListSize); i++)
669 {
670 _Analysis_assume_(i < dwListSize);
671 prcMonitorList[i].left -= DcRect.left;
672 prcMonitorList[i].right -= DcRect.left;
673 prcMonitorList[i].top -= DcRect.top;
674 prcMonitorList[i].bottom -= DcRect.top;
675 }
676 }
677
678 /* Output result */
679 if (phUnsafeMonitorList != NULL && dwListSize != 0)
680 {
681 Status = MmCopyToCaller(phUnsafeMonitorList, phMonitorList, sizeof(HMONITOR) * dwListSize);
682 if (!NT_SUCCESS(Status))
683 {
685 goto cleanup;
686 }
687 }
688 if (prcUnsafeMonitorList != NULL && dwListSize != 0)
689 {
690 Status = MmCopyToCaller(prcUnsafeMonitorList, prcMonitorList, sizeof(RECT) * dwListSize);
691 if (!NT_SUCCESS(Status))
692 {
694 goto cleanup;
695 }
696 }
697
698 /* Return monitors count on success */
699 iRet = cMonitors;
700
701cleanup:
702 if (phMonitorList)
704 if (prcMonitorList)
706
707 UserLeave();
708 return iRet;
709}
LONG NTSTATUS
Definition: precomp.h:26
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
Definition: dc.h:238
FORCEINLINE PDC DC_LockDc(HDC hdc)
Definition: dc.h:220
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
Status
Definition: gdiplustypes.h:25
#define MmCopyToCaller(x, y, z)
Definition: mmcopy.h:19
HDC hdc
Definition: main.c:9
#define _Analysis_assume_
Definition: no_sal2.h:388
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:242
#define MmCopyFromCaller
Definition: polytest.cpp:29
Definition: polytest.cpp:41
int32_t INT
Definition: typedefs.h:58
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
INT FASTCALL REGION_GetRgnBox(PREGION Rgn, PRECTL pRect)
Definition: region.c:2543
#define COMPLEXREGION
Definition: wingdi.h:363
#define NULLREGION
Definition: wingdi.h:361

◆ NtUserGetMonitorInfo()

BOOL APIENTRY NtUserGetMonitorInfo ( IN HMONITOR  hMonitor,
OUT LPMONITORINFO  pMonitorInfoUnsafe 
)

Definition at line 737 of file monitor.c.

740{
741 PMONITOR pMonitor;
742 MONITORINFOEXW MonitorInfo;
744 BOOL bRet = FALSE;
745 PWCHAR pwstrDeviceName;
746
747 TRACE("Enter NtUserGetMonitorInfo\n");
749
750 /* Get monitor object */
751 pMonitor = UserGetMonitorObject(hMonitor);
752 if (!pMonitor)
753 {
754 TRACE("Couldnt find monitor %p\n", hMonitor);
755 goto cleanup;
756 }
757
758 /* Check if pMonitorInfoUnsafe is valid */
759 if(pMonitorInfoUnsafe == NULL)
760 {
762 goto cleanup;
763 }
764
765 pwstrDeviceName = ((PPDEVOBJ)(pMonitor->hDev))->pGraphicsDevice->szWinDeviceName;
766
767 /* Get size of pMonitorInfoUnsafe */
768 Status = MmCopyFromCaller(&MonitorInfo.cbSize, &pMonitorInfoUnsafe->cbSize, sizeof(MonitorInfo.cbSize));
769 if (!NT_SUCCESS(Status))
770 {
772 goto cleanup;
773 }
774
775 /* Check if size of struct is valid */
776 if (MonitorInfo.cbSize != sizeof(MONITORINFO) &&
777 MonitorInfo.cbSize != sizeof(MONITORINFOEXW))
778 {
780 goto cleanup;
781 }
782
783 /* Fill monitor info */
784 MonitorInfo.rcMonitor = pMonitor->rcMonitor;
785 MonitorInfo.rcWork = pMonitor->rcWork;
786 MonitorInfo.dwFlags = 0;
787 if (pMonitor->IsPrimary)
788 MonitorInfo.dwFlags |= MONITORINFOF_PRIMARY;
789
790 /* Fill device name */
791 if (MonitorInfo.cbSize == sizeof(MONITORINFOEXW))
792 {
793 RtlStringCbCopyNExW(MonitorInfo.szDevice,
794 sizeof(MonitorInfo.szDevice),
795 pwstrDeviceName,
796 (wcslen(pwstrDeviceName)+1) * sizeof(WCHAR),
798 }
799
800 /* Output data */
801 Status = MmCopyToCaller(pMonitorInfoUnsafe, &MonitorInfo, MonitorInfo.cbSize);
802 if (!NT_SUCCESS(Status))
803 {
804 TRACE("GetMonitorInfo: MmCopyToCaller failed\n");
806 goto cleanup;
807 }
808
809 TRACE("GetMonitorInfo: success\n");
810 bRet = TRUE;
811
812cleanup:
813 TRACE("Leave NtUserGetMonitorInfo, ret=%i\n", bRet);
814 UserLeave();
815 return bRet;
816}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
struct _PDEVOBJ * PPDEVOBJ
Definition: mdevobj.h:6
NTSTRSAFEAPI RtlStringCbCopyNExW(_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, _In_ size_t cbToCopy, _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, _Out_opt_ size_t *pcbRemaining, _In_ STRSAFE_DWORD dwFlags)
Definition: ntstrsafe.h:547
#define STRSAFE_FILL_BEHIND_NULL
Definition: ntstrsafe.h:32
RECT rcWork
Definition: monitor.h:19
HDEV hDev
Definition: monitor.h:23
WCHAR szDevice[CCHDEVICENAME]
Definition: winuser.h:3906
uint16_t * PWCHAR
Definition: typedefs.h:56
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
PMONITOR NTAPI UserGetMonitorObject(IN HMONITOR hMonitor)
Definition: monitor.c:74
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by GetMonitorInfoA(), and GetMonitorInfoW().

◆ NtUserMonitorFromPoint()

HMONITOR APIENTRY NtUserMonitorFromPoint ( _In_ POINT  pt,
_In_ DWORD  dwFlags 
)

Definition at line 836 of file monitor.c.

839{
840 RECTL rc;
841 HMONITOR hMonitor = NULL;
842
843 /* Check if flags are valid */
844 if (dwFlags != MONITOR_DEFAULTTONULL &&
845 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
846 dwFlags != MONITOR_DEFAULTTONEAREST)
847 {
849 return NULL;
850 }
851
852 /* Fill rect (bottom-right exclusive) */
853 rc.left = pt.x;
854 rc.right = pt.x + 1;
855 rc.top = pt.y;
856 rc.bottom = pt.y + 1;
857
859
860 /* Find intersecting monitor */
861 IntGetMonitorsFromRect(&rc, &hMonitor, NULL, 1, dwFlags);
862
863 UserLeave();
864 return hMonitor;
865}
#define pt(x, y)
Definition: drawing.c:79
#define ERROR_INVALID_FLAGS
Definition: winerror.h:907

Referenced by MonitorFromPoint().

◆ NtUserMonitorFromRect()

HMONITOR APIENTRY NtUserMonitorFromRect ( _In_ LPCRECTL  pRectUnsafe,
_In_ DWORD  dwFlags 
)

Definition at line 886 of file monitor.c.

889{
890 RECTL Rect;
892 HMONITOR hMonitor;
893
894 /* Check if flags are valid */
895 if (dwFlags != MONITOR_DEFAULTTONULL &&
896 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
897 dwFlags != MONITOR_DEFAULTTONEAREST)
898 {
900 return NULL;
901 }
902
903 /* Copy rectangle to safe buffer */
904 Status = MmCopyFromCaller(&Rect, pRectUnsafe, sizeof (RECT));
905 if (!NT_SUCCESS(Status))
906 {
908 return NULL;
909 }
910
912 {
913 Rect.right = Rect.left + 1;
914 Rect.bottom = Rect.top + 1;
915 }
916
918 hMonitor = IntGetMonitorFromRect(&Rect, dwFlags);
919 UserLeave();
920
921 return hMonitor;
922}
FORCEINLINE BOOL RECTL_bIsEmptyRect(_In_ const RECTL *prcl)
Definition: rect.h:44
HMONITOR FASTCALL IntGetMonitorFromRect(_In_ LPCRECTL pRect, _In_ DWORD dwFlags)
Definition: monitor.c:405

◆ NtUserMonitorFromWindow()

HMONITOR APIENTRY NtUserMonitorFromWindow ( _In_ HWND  hWnd,
_In_ DWORD  dwFlags 
)

Definition at line 927 of file monitor.c.

930{
931 PWND pWnd;
932 HMONITOR hMonitor = NULL;
933 RECTL Rect = {0, 0, 0, 0};
934
935 TRACE("Enter NtUserMonitorFromWindow\n");
936
937 /* Check if flags are valid */
938 if (dwFlags != MONITOR_DEFAULTTONULL &&
939 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
940 dwFlags != MONITOR_DEFAULTTONEAREST)
941 {
943 return NULL;
944 }
945
947
948 if (hWnd)
949 {
950 /* Get window object */
952 if (pWnd)
953 {
954 Rect = ((pWnd->style & WS_MINIMIZE) ? pWnd->InternalPos.NormalRect : pWnd->rcWindow);
956 {
957 Rect.right = Rect.left + 1;
958 Rect.bottom = Rect.top + 1;
959 }
960 }
961 }
962
963 hMonitor = IntGetMonitorFromRect(&Rect, dwFlags);
964
965 UserLeave();
966
967 TRACE("Leave NtUserMonitorFromWindow, ret=%p\n", hMonitor);
968 return hMonitor;
969}
HWND hWnd
Definition: settings.c:17
#define WS_MINIMIZE
Definition: pedump.c:622
Definition: ntuser.h:694
DWORD style
Definition: ntuser.h:706
struct _WND::@5443 InternalPos
RECT rcWindow
Definition: ntuser.h:716
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:124

Referenced by MonitorFromWindow().

◆ UserAttachMonitor()

NTSTATUS NTAPI UserAttachMonitor ( IN HDEV  hDev)

Definition at line 129 of file monitor.c.

130{
131 PMONITOR pMonitor;
132
133 TRACE("Attaching monitor...\n");
134
135 /* Create new monitor object */
136 pMonitor = IntCreateMonitorObject();
137 if (pMonitor == NULL)
138 {
139 TRACE("Couldnt create monitor object\n");
141 }
142
143 pMonitor->hDev = hDev;
144 pMonitor->cWndStack = 0;
145
146 if (gMonitorList == NULL)
147 {
148 TRACE("Primary monitor is beeing attached\n");
149 pMonitor->IsPrimary = TRUE;
150 gMonitorList = pMonitor;
151 }
152 else
153 {
154 PMONITOR pmonLast = gMonitorList;
155 TRACE("Additional monitor is beeing attached\n");
156 while (pmonLast->pMonitorNext != NULL)
157 pmonLast = pmonLast->pMonitorNext;
158
159 pmonLast->pMonitorNext = pMonitor;
160 }
161
163
164 return STATUS_SUCCESS;
165}
#define STATUS_SUCCESS
Definition: shellext.h:65
SHORT cWndStack
Definition: monitor.h:22
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
static PMONITOR IntCreateMonitorObject(VOID)
Definition: monitor.c:33
NTSTATUS NTAPI UserUpdateMonitorSize(IN HDEV hDev)
Definition: monitor.c:225

Referenced by co_IntInitializeDesktopGraphics().

◆ UserDetachMonitor()

NTSTATUS NTAPI UserDetachMonitor ( IN HDEV  hDev)

Definition at line 179 of file monitor.c.

180{
181 PMONITOR pMonitor = gMonitorList, *pLink = &gMonitorList;
182
183 /* Find monitor attached to given device */
184 while (pMonitor != NULL)
185 {
186 if (pMonitor->hDev == hDev)
187 break;
188
189 pLink = &pMonitor->pMonitorNext;
190 pMonitor = pMonitor->pMonitorNext;
191 }
192
193 if (pMonitor == NULL)
194 {
195 /* No monitor has been found */
197 }
198
199 /* We destroy primary monitor - set next as primary */
200 if (pMonitor->IsPrimary && pMonitor->pMonitorNext != NULL)
201 pMonitor->pMonitorNext->IsPrimary = TRUE;
202
203 /* Update Next ptr in previous monitor */
204 *pLink = pMonitor->pMonitorNext;
205
206 /* Finally destroy monitor */
207 IntDestroyMonitorObject(pMonitor);
208
209 return STATUS_SUCCESS;
210}
static void IntDestroyMonitorObject(IN PMONITOR pMonitor)
Definition: monitor.c:50

◆ UserGetMonitorObject()

PMONITOR NTAPI UserGetMonitorObject ( IN HMONITOR  hMonitor)

Definition at line 74 of file monitor.c.

75{
76 PMONITOR pMonitor;
77
78 if (!hMonitor)
79 {
81 return NULL;
82 }
83
84 pMonitor = (PMONITOR)UserGetObject(gHandleTable, hMonitor, TYPE_MONITOR);
85 if (!pMonitor)
86 {
88 return NULL;
89 }
90
91 return pMonitor;
92}
struct _MONITOR * PMONITOR
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:495
#define ERROR_INVALID_MONITOR_HANDLE
Definition: winerror.h:1287

Referenced by InitThreadCallback(), IntFixWindowCoordinates(), NtUserGetMonitorInfo(), UserMonitorFromPoint(), and UserMonitorFromRect().

◆ UserGetPrimaryMonitor()

PMONITOR NTAPI UserGetPrimaryMonitor ( VOID  )

Definition at line 102 of file monitor.c.

103{
104 PMONITOR pMonitor;
105
106 /* Find primary monitor */
107 for (pMonitor = gMonitorList; pMonitor != NULL; pMonitor = pMonitor->pMonitorNext)
108 {
109 if (pMonitor->IsPrimary)
110 break;
111 }
112
113 return pMonitor;
114}

Referenced by co_UserExcludeUpdateRgn(), co_WinPosGetMinMaxInfo(), IntFixWindowCoordinates(), IntIsWindowFullscreen(), SpiGetSet(), and UserGetDesktopDC().

◆ UserMonitorFromPoint()

PMONITOR FASTCALL UserMonitorFromPoint ( IN POINT  pt,
IN DWORD  dwFlags 
)

Definition at line 490 of file monitor.c.

493{
494 RECTL rc;
495 HMONITOR hMonitor = NULL;
496
497 /* Check if flags are valid */
498 if (dwFlags != MONITOR_DEFAULTTONULL &&
499 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
500 dwFlags != MONITOR_DEFAULTTONEAREST)
501 {
503 return NULL;
504 }
505
506 /* Fill rect (bottom-right exclusive) */
507 rc.left = pt.x;
508 rc.right = pt.x + 1;
509 rc.top = pt.y;
510 rc.bottom = pt.y + 1;
511
512 /* Find intersecting monitor */
513 IntGetMonitorsFromRect(&rc, &hMonitor, NULL, 1, dwFlags);
514
515 return UserGetMonitorObject(hMonitor);
516}

Referenced by MENU_ShowPopup().

◆ UserMonitorFromRect()

PMONITOR NTAPI UserMonitorFromRect ( PRECTL  pRect,
DWORD  dwFlags 
)

Definition at line 469 of file monitor.c.

472{
473 HMONITOR hMonitor;
474
475 /* Check if flags are valid */
476 if (dwFlags != MONITOR_DEFAULTTONULL &&
477 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
478 dwFlags != MONITOR_DEFAULTTONEAREST)
479 {
481 return NULL;
482 }
483
484 hMonitor = IntGetMonitorFromRect(pRect, dwFlags);
485 return UserGetMonitorObject(hMonitor);
486}

Referenced by IntGetWindowPlacement(), make_rect_onscreen(), SpiGetSet(), and WinPosInitInternalPos().

◆ UserUpdateMonitorSize()

NTSTATUS NTAPI UserUpdateMonitorSize ( IN HDEV  hDev)

Definition at line 225 of file monitor.c.

226{
227 PMONITOR pMonitor;
228 SIZEL DeviceSize;
229
230 /* Find monitor attached to given device */
231 for (pMonitor = gMonitorList; pMonitor != NULL; pMonitor = pMonitor->pMonitorNext)
232 {
233 if (pMonitor->hDev == hDev)
234 break;
235 }
236
237 if (pMonitor == NULL)
238 {
239 /* No monitor has been found */
241 }
242
243 /* Get the size of the hdev */
244 PDEVOBJ_sizl((PPDEVOBJ)hDev, &DeviceSize);
245
246 /* Update monitor size */
247 pMonitor->rcMonitor.left = 0;
248 pMonitor->rcMonitor.top = 0;
249 pMonitor->rcMonitor.right = pMonitor->rcMonitor.left + DeviceSize.cx;
250 pMonitor->rcMonitor.bottom = pMonitor->rcMonitor.top + DeviceSize.cy;
251 pMonitor->rcWork = pMonitor->rcMonitor;
252
253 /* Destroy monitor region... */
254 if (pMonitor->hrgnMonitor)
255 {
257 GreDeleteObject(pMonitor->hrgnMonitor);
258 }
259
260 /* ...and create new one */
262 pMonitor->rcMonitor.left,
263 pMonitor->rcMonitor.top,
264 pMonitor->rcMonitor.right,
265 pMonitor->rcMonitor.bottom);
266 if (pMonitor->hrgnMonitor)
268
269 //
270 // Should be Virtual accumulation of all the available monitors.
271 //
272 gpsi->rcScreenReal = pMonitor->rcMonitor;
273
274 return STATUS_SUCCESS;
275}
PSERVERINFO gpsi
Definition: imm.c:18
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
#define GDI_OBJ_HMGR_PUBLIC
Definition: ntgdihdl.h:116
PSIZEL FASTCALL PDEVOBJ_sizl(PPDEVOBJ ppdev, PSIZEL psizl)
Definition: pdevobj.c:1375
HRGN hrgnMonitor
Definition: monitor.h:20
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
LONG right
Definition: windef.h:102
LONG bottom
Definition: windef.h:103
LONG top
Definition: windef.h:101
LONG left
Definition: windef.h:100
BOOL FASTCALL IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask)
Definition: region.c:2459

Referenced by co_IntInitializeDesktopGraphics(), UserAttachMonitor(), and UserChangeDisplaySettings().

Variable Documentation

◆ gMonitorList