53 if (pMonitor->hrgnMonitor)
133 TRACE(
"Attaching monitor...\n");
137 if (pMonitor ==
NULL)
139 TRACE(
"Couldnt create monitor object\n");
143 pMonitor->
hDev = hDev;
148 TRACE(
"Primary monitor is beeing attached\n");
155 TRACE(
"Additional monitor is beeing attached\n");
184 while (pMonitor !=
NULL)
186 if (pMonitor->
hDev == hDev)
193 if (pMonitor ==
NULL)
233 if (pMonitor->
hDev == hDev)
237 if (pMonitor ==
NULL)
318 ULONG iNearestDistance = 0xffffffff;
323 RECTL MonitorRect, IntersectionRect;
327 TRACE(
"MonitorRect: left = %d, top = %d, right = %d, bottom = %d\n",
332 pPrimaryMonitor = pMonitor;
338 IntersectionRect = MonitorRect;
344 if (
dwFlags == MONITOR_DEFAULTTONEAREST)
350 abs(pRect->left - MonitorRect.
right));
358 if (iDistance < iNearestDistance)
360 iNearestDistance = iDistance;
361 pNearestMonitor = pMonitor;
369 if (cMonitors < dwListSize)
372 if (phMonitorList !=
NULL)
374 if (prcMonitorList !=
NULL)
375 prcMonitorList[cMonitors] = IntersectionRect;
386 if (
dwFlags == MONITOR_DEFAULTTONEAREST && pNearestMonitor)
388 if (phMonitorList && dwListSize > 0)
393 else if (
dwFlags == MONITOR_DEFAULTTOPRIMARY && pPrimaryMonitor)
395 if (phMonitorList !=
NULL && dwListSize > 0)
409 ULONG cMonitors, LargestArea = 0,
i;
430 if (phMonitorList ==
NULL)
437 sizeof(
RECT) * cMonitors,
439 if (prcMonitorList ==
NULL)
449 for (
i = 0;
i < cMonitors;
i++)
452 (prcMonitorList[
i].
bottom - prcMonitorList[
i].
top);
453 if (Area >= LargestArea)
455 hMonitor = phMonitorList[
i];
476 if (
dwFlags != MONITOR_DEFAULTTONULL &&
477 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
478 dwFlags != MONITOR_DEFAULTTONEAREST)
498 if (
dwFlags != MONITOR_DEFAULTTONULL &&
499 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
500 dwFlags != MONITOR_DEFAULTTONEAREST)
568 if (pUnsafeRect !=
NULL)
573 TRACE(
"MmCopyFromCaller() failed!\n");
588 TRACE(
"DC_LockDc() failed!\n");
597 TRACE(
"NtGdiGetRgnBox() failed!\n");
609 if (pUnsafeRect !=
NULL)
633 if (cMonitors == 0 || dwListSize == 0 ||
634 (phUnsafeMonitorList ==
NULL && prcUnsafeMonitorList ==
NULL))
637 TRACE(
"cMonitors = %u\n", cMonitors);
643 if (phUnsafeMonitorList !=
NULL && dwListSize != 0)
646 if (phMonitorList ==
NULL)
652 if (prcUnsafeMonitorList !=
NULL && dwListSize != 0)
655 if (prcMonitorList ==
NULL)
664 dwListSize, MONITOR_DEFAULTTONULL);
668 for (
i = 0;
i <
min(cMonitors, dwListSize);
i++)
673 prcMonitorList[
i].
top -= DcRect.
top;
679 if (phUnsafeMonitorList !=
NULL && dwListSize != 0)
688 if (prcUnsafeMonitorList !=
NULL && dwListSize != 0)
747 TRACE(
"Enter NtUserGetMonitorInfo\n");
754 TRACE(
"Couldnt find monitor %p\n", hMonitor);
759 if(pMonitorInfoUnsafe ==
NULL)
765 pwstrDeviceName = ((
PPDEVOBJ)(pMonitor->
hDev))->pGraphicsDevice->szWinDeviceName;
788 MonitorInfo.
dwFlags |= MONITORINFOF_PRIMARY;
804 TRACE(
"GetMonitorInfo: MmCopyToCaller failed\n");
809 TRACE(
"GetMonitorInfo: success\n");
813 TRACE(
"Leave NtUserGetMonitorInfo, ret=%i\n", bRet);
844 if (
dwFlags != MONITOR_DEFAULTTONULL &&
845 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
846 dwFlags != MONITOR_DEFAULTTONEAREST)
895 if (
dwFlags != MONITOR_DEFAULTTONULL &&
896 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
897 dwFlags != MONITOR_DEFAULTTONEAREST)
935 TRACE(
"Enter NtUserMonitorFromWindow\n");
938 if (
dwFlags != MONITOR_DEFAULTTONULL &&
939 dwFlags != MONITOR_DEFAULTTOPRIMARY &&
940 dwFlags != MONITOR_DEFAULTTONEAREST)
967 TRACE(
"Leave NtUserMonitorFromWindow, ret=%p\n", hMonitor);
#define DBG_DEFAULT_CHANNEL(ch)
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
FORCEINLINE PDC DC_LockDc(HDC hdc)
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
static void cleanup(void)
#define ExAllocatePoolWithTag(hernya, size, tag)
GLdouble GLdouble GLdouble GLdouble top
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define UserHMGetHandle(obj)
struct _PDEVOBJ * PPDEVOBJ
#define MmCopyToCaller(x, y, z)
#define ExFreePoolWithTag(_P, _T)
struct _MONITOR * PMONITOR
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
#define _Analysis_assume_
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
#define GDI_OBJ_HMGR_POWNED
#define GDI_OBJ_HMGR_PUBLIC
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)
#define STRSAFE_FILL_BEHIND_NULL
VOID FASTCALL UserLeave(VOID)
VOID FASTCALL UserEnterShared(VOID)
PSIZEL FASTCALL PDEVOBJ_sizl(PPDEVOBJ ppdev, PSIZEL psizl)
_Out_opt_ int _Out_opt_ int * cy
PULONG MinorVersion OPTIONAL
struct _MONITOR * pMonitorNext
struct _WND::@5443 InternalPos
WCHAR szDevice[CCHDEVICENAME]
#define STATUS_INVALID_PARAMETER
#define STATUS_INSUFFICIENT_RESOURCES
PWND FASTCALL UserGetWindowObject(HWND hWnd)
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
FORCEINLINE BOOL RECTL_bIsEmptyRect(_In_ const RECTL *prcl)
BOOL FASTCALL IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask)
INT FASTCALL REGION_GetRgnBox(PREGION Rgn, PRECTL pRect)
PMONITOR NTAPI UserMonitorFromRect(PRECTL pRect, DWORD dwFlags)
static PMONITOR gMonitorList
HMONITOR APIENTRY NtUserMonitorFromWindow(_In_ HWND hWnd, _In_ DWORD dwFlags)
static PMONITOR IntCreateMonitorObject(VOID)
PMONITOR NTAPI UserGetMonitorObject(IN HMONITOR hMonitor)
HMONITOR FASTCALL IntGetMonitorFromRect(_In_ LPCRECTL pRect, _In_ DWORD dwFlags)
BOOL APIENTRY NtUserGetMonitorInfo(IN HMONITOR hMonitor, OUT LPMONITORINFO pMonitorInfoUnsafe)
HMONITOR APIENTRY NtUserMonitorFromRect(_In_ LPCRECTL pRectUnsafe, _In_ DWORD dwFlags)
static UINT IntGetMonitorsFromRect(OPTIONAL IN LPCRECTL pRect, OPTIONAL OUT HMONITOR *phMonitorList, OPTIONAL OUT PRECTL prcMonitorList, OPTIONAL IN DWORD dwListSize, OPTIONAL IN 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)
NTSTATUS NTAPI UserAttachMonitor(IN HDEV hDev)
static void IntDestroyMonitorObject(IN PMONITOR pMonitor)
HMONITOR APIENTRY NtUserMonitorFromPoint(_In_ POINT pt, _In_ DWORD dwFlags)
NTSTATUS NTAPI UserUpdateMonitorSize(IN HDEV hDev)
NTSTATUS NTAPI UserDetachMonitor(IN HDEV hDev)
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
BOOL FASTCALL UserDereferenceObject(PVOID Object)
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
PUSER_HANDLE_TABLE gHandleTable
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
#define ERROR_INVALID_MONITOR_HANDLE
#define ERROR_INVALID_FLAGS