ReactOS 0.4.16-dev-1946-g52006dd
display.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Video initialization and display settings
5 * FILE: win32ss/user/ntuser/display.c
6 * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
7 */
8
9#include <win32k.h>
11
14
15static const PWCHAR KEY_VIDEO = L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP\\VIDEO";
16
17VOID
19{
20 RegWriteDWORD(hkey, L"DefaultSettings.BitsPerPel", pdm->dmBitsPerPel);
21 RegWriteDWORD(hkey, L"DefaultSettings.XResolution", pdm->dmPelsWidth);
22 RegWriteDWORD(hkey, L"DefaultSettings.YResolution", pdm->dmPelsHeight);
23 RegWriteDWORD(hkey, L"DefaultSettings.Flags", pdm->dmDisplayFlags);
24 RegWriteDWORD(hkey, L"DefaultSettings.VRefresh", pdm->dmDisplayFrequency);
25 RegWriteDWORD(hkey, L"DefaultSettings.XPanning", pdm->dmPanningWidth);
26 RegWriteDWORD(hkey, L"DefaultSettings.YPanning", pdm->dmPanningHeight);
27 RegWriteDWORD(hkey, L"DefaultSettings.Orientation", pdm->dmDisplayOrientation);
28 RegWriteDWORD(hkey, L"DefaultSettings.FixedOutput", pdm->dmDisplayFixedOutput);
29 RegWriteDWORD(hkey, L"Attach.RelativeX", pdm->dmPosition.x);
30 RegWriteDWORD(hkey, L"Attach.RelativeY", pdm->dmPosition.y);
31// RegWriteDWORD(hkey, L"Attach.ToDesktop, pdm->dmBitsPerPel", pdm->);
32}
33
34VOID
36{
37 DWORD dwValue;
38
39 /* Zero out the structure */
40 RtlZeroMemory(pdm, sizeof(DEVMODEW));
41
42/* Helper macro */
43#define READ(field, str, flag) \
44 if (RegReadDWORD(hkey, L##str, &dwValue)) \
45 { \
46 pdm->field = dwValue; \
47 pdm->dmFields |= flag; \
48 }
49
50 /* Read all present settings */
51 READ(dmBitsPerPel, "DefaultSettings.BitsPerPel", DM_BITSPERPEL);
52 READ(dmPelsWidth, "DefaultSettings.XResolution", DM_PELSWIDTH);
53 READ(dmPelsHeight, "DefaultSettings.YResolution", DM_PELSHEIGHT);
54 READ(dmDisplayFlags, "DefaultSettings.Flags", DM_DISPLAYFLAGS);
55 READ(dmDisplayFrequency, "DefaultSettings.VRefresh", DM_DISPLAYFREQUENCY);
56 READ(dmPanningWidth, "DefaultSettings.XPanning", DM_PANNINGWIDTH);
57 READ(dmPanningHeight, "DefaultSettings.YPanning", DM_PANNINGHEIGHT);
58 READ(dmDisplayOrientation, "DefaultSettings.Orientation", DM_DISPLAYORIENTATION);
59 READ(dmDisplayFixedOutput, "DefaultSettings.FixedOutput", DM_DISPLAYFIXEDOUTPUT);
60 READ(dmPosition.x, "Attach.RelativeX", DM_POSITION);
61 READ(dmPosition.y, "Attach.RelativeY", DM_POSITION);
62}
63
68 IN PWSTR pwszRegKey)
69{
70 PGRAPHICS_DEVICE pGraphicsDevice;
71 UNICODE_STRING ustrDeviceName, ustrDisplayDrivers, ustrDescription;
73 WCHAR awcBuffer[128];
74 ULONG cbSize;
75 HKEY hkey;
76 DWORD dwVga;
77
78 TRACE("InitDisplayDriver(%S, %S);\n",
79 pwszDeviceName, pwszRegKey);
80
81 /* Open the driver's registry key */
82 Status = RegOpenKey(pwszRegKey, &hkey);
83 if (!NT_SUCCESS(Status))
84 {
85 ERR("Failed to open registry key: %ls\n", pwszRegKey);
86 return NULL;
87 }
88
89 /* Query the diplay drivers */
90 cbSize = sizeof(awcBuffer) - 10;
91 Status = RegQueryValue(hkey,
92 L"InstalledDisplayDrivers",
94 awcBuffer,
95 &cbSize);
96 if (!NT_SUCCESS(Status))
97 {
98 ERR("Didn't find 'InstalledDisplayDrivers', status = 0x%lx\n", Status);
99 ZwClose(hkey);
100 return NULL;
101 }
102
103 /* Initialize the UNICODE_STRING */
104 ustrDisplayDrivers.Buffer = awcBuffer;
105 ustrDisplayDrivers.MaximumLength = (USHORT)cbSize;
106 ustrDisplayDrivers.Length = (USHORT)cbSize;
107
108 /* Set Buffer for description and size of remaining buffer */
109 ustrDescription.Buffer = awcBuffer + (cbSize / sizeof(WCHAR));
110 cbSize = sizeof(awcBuffer) - cbSize;
111
112 /* Query the device string */
113 Status = RegQueryValue(hkey,
114 L"Device Description",
115 REG_SZ,
116 ustrDescription.Buffer,
117 &cbSize);
118 if (NT_SUCCESS(Status))
119 {
120 ustrDescription.MaximumLength = (USHORT)cbSize;
121 ustrDescription.Length = (USHORT)cbSize;
122 }
123 else
124 {
125 RtlInitUnicodeString(&ustrDescription, L"<unknown>");
126 }
127
128 /* Query if this is a VGA compatible driver */
129 cbSize = sizeof(DWORD);
130 Status = RegQueryValue(hkey, L"VgaCompatible", REG_DWORD, &dwVga, &cbSize);
131 if (!NT_SUCCESS(Status)) dwVga = 0;
132
133 /* Close the registry key */
134 ZwClose(hkey);
135
136 /* Register the device with GDI */
137 RtlInitUnicodeString(&ustrDeviceName, pwszDeviceName);
138 pGraphicsDevice = EngpRegisterGraphicsDevice(&ustrDeviceName,
139 &ustrDisplayDrivers,
140 &ustrDescription);
141 if (pGraphicsDevice && dwVga)
142 {
143 pGraphicsDevice->StateFlags |= DISPLAY_DEVICE_VGA_COMPATIBLE;
144 }
145
146 return pGraphicsDevice;
147}
148
150NTAPI
152{
154 HKEY hkey;
155
156 TRACE("----------------------------- InitVideo() -------------------------------\n");
157
158 /* Check if VGA mode is requested, by finding the special volatile key created by VIDEOPRT */
159 Status = RegOpenKey(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GraphicsDrivers\\BaseVideo", &hkey);
160 if (NT_SUCCESS(Status))
161 ZwClose(hkey);
163 if (gbBaseVideo)
164 ERR("VGA mode requested.\n");
165
166 /* Initialize all display devices */
168 if (!NT_SUCCESS(Status))
169 return Status;
170
172
173 return STATUS_SUCCESS;
174}
175
176VOID
178{
179 ULONG_PTR ulResult;
180 // PVOID pvOldCursor;
181
182 // TODO: Re-enable the cursor reset code once this function becomes called
183 // from within a Win32 thread... Indeed UserSetCursor() requires this, but
184 // at the moment this function is directly called from a separate thread
185 // from within videoprt, instead of by a separate win32k system thread.
186
187 if (!ppdev)
188 return;
189
190 PDEVOBJ_vReference(ppdev);
191
192 /* Remove mouse pointer */
193 // pvOldCursor = UserSetCursor(NULL, TRUE);
194
195 /* Do the mode switch -- Use the actual same current mode */
196 ulResult = PDEVOBJ_bSwitchMode(ppdev, ppdev->pdmwDev);
197 ASSERT(ulResult);
198
199 /* Restore mouse pointer, no hooks called */
200 // pvOldCursor = UserSetCursor(pvOldCursor, TRUE);
201 // ASSERT(pvOldCursor == NULL);
202
203 /* Update the system metrics */
204 InitMetrics();
205
206 /* Set new size of the monitor */
207 // UserUpdateMonitorSize((HDEV)ppdev);
208
209 //co_IntShowDesktop(pdesk, ppdev->gdiinfo.ulHorzRes, ppdev->gdiinfo.ulVertRes);
211
212 PDEVOBJ_vRelease(ppdev);
213}
214
216NTAPI
218 PUNICODE_STRING pustrDevice,
219 DWORD iDevNum,
220 PDISPLAY_DEVICEW pdispdev,
222{
223 PGRAPHICS_DEVICE pGraphicsDevice;
224 PDEVICE_OBJECT pdo;
225 PWCHAR pHardwareId;
226 ULONG cbSize, dwLength;
227 HKEY hkey;
229
230 if (!pustrDevice)
231 {
232 /* Check if some devices have been added since last time */
234 }
235
236 /* Ask gdi for the GRAPHICS_DEVICE */
237 pGraphicsDevice = EngpFindGraphicsDevice(pustrDevice, iDevNum);
238 if (!pGraphicsDevice)
239 {
240 /* No device found */
241 if (iDevNum == 0)
242 ERR("No GRAPHICS_DEVICE found for '%wZ', iDevNum %lu\n", pustrDevice, iDevNum);
243 else
244 TRACE("No GRAPHICS_DEVICE found for '%wZ', iDevNum %lu\n", pustrDevice, iDevNum);
245 return STATUS_UNSUCCESSFUL;
246 }
247
248 if (!pustrDevice)
249 {
250 pdo = pGraphicsDevice->PhysDeviceHandle;
251 }
252 else
253 {
254 EngpUpdateMonitorDevices(pGraphicsDevice);
255 if (iDevNum >= pGraphicsDevice->dwMonCnt)
256 {
257 TRACE("No monitor #%u for '%wZ'\n", iDevNum + 1, pustrDevice);
258 return STATUS_UNSUCCESSFUL;
259 }
260 pdo = pGraphicsDevice->pvMonDev[iDevNum].pdo;
261 }
262
263
264 /* Open the device map registry key */
265 Status = RegOpenKey(KEY_VIDEO, &hkey);
266 if (!NT_SUCCESS(Status))
267 {
268 /* No device found */
269 ERR("Could not open reg key\n");
270 return STATUS_UNSUCCESSFUL;
271 }
272
273 /* Query the registry path */
274 cbSize = sizeof(pdispdev->DeviceKey);
275 RegQueryValue(hkey,
276 pGraphicsDevice->szNtDeviceName,
277 REG_SZ,
278 pdispdev->DeviceKey,
279 &cbSize);
280
281 /* Close registry key */
282 ZwClose(hkey);
283
284 /* Copy device name, device string and StateFlags */
285 if (!pustrDevice)
286 {
287 RtlStringCbCopyW(pdispdev->DeviceName, sizeof(pdispdev->DeviceName), pGraphicsDevice->szWinDeviceName);
288 RtlStringCbCopyW(pdispdev->DeviceString, sizeof(pdispdev->DeviceString), pGraphicsDevice->pwszDescription);
289 pdispdev->StateFlags = pGraphicsDevice->StateFlags;
290 }
291 else
292 {
293 swprintf(pdispdev->DeviceName, L"%ws\\Monitor%u", pGraphicsDevice->szWinDeviceName, iDevNum);
294 if (pdo)
295 {
298 sizeof(pdispdev->DeviceString),
299 pdispdev->DeviceString,
300 &dwLength);
301 if (!NT_SUCCESS(Status))
302 pdispdev->DeviceString[0] = UNICODE_NULL;
303 }
304 pdispdev->StateFlags = pGraphicsDevice->pvMonDev[iDevNum].flag;
305 }
306 pdispdev->DeviceID[0] = UNICODE_NULL;
307
308 /* Fill in DeviceID */
309 if (pdo != NULL)
310 {
313 0,
314 NULL,
315 &dwLength);
316
318 {
319 pHardwareId = ExAllocatePoolWithTag(PagedPool,
320 dwLength,
322 if (!pHardwareId)
323 {
326 }
327
330 dwLength,
331 pHardwareId,
332 &dwLength);
333
334 if (!NT_SUCCESS(Status))
335 {
336 ERR("IoGetDeviceProperty() failed with status 0x%08lx\n", Status);
337 }
338 else
339 {
340 /* For video adapters it should be the first Hardware ID
341 * which usually is the longest one and unique enough */
342 RtlStringCbCopyW(pdispdev->DeviceID, sizeof(pdispdev->DeviceID), pHardwareId);
343
344 if (pustrDevice)
345 {
346 /* For monitors it should be the first Hardware ID,
347 * which we already have obtained above,
348 * concatenated with the unique driver registry key */
349
350 RtlStringCbCatW(pdispdev->DeviceID, sizeof(pdispdev->DeviceID), L"\\");
351
352 dwLength = wcslen(pdispdev->DeviceID) + 1;
355 (ARRAYSIZE(pdispdev->DeviceID) - dwLength) * sizeof(WCHAR),
356 pdispdev->DeviceID + dwLength - 1,
357 &dwLength);
358 }
359
360 TRACE("Hardware ID: %ls\n", pdispdev->DeviceID);
361 }
362
364 }
365 else
366 {
367 ERR("IoGetDeviceProperty() failed with status 0x%08lx\n", Status);
368 }
369 }
370
371 return STATUS_SUCCESS;
372}
373
374//NTSTATUS
375BOOL
376NTAPI
378 PUNICODE_STRING pustrDevice,
379 DWORD iDevNum,
380 PDISPLAY_DEVICEW pDisplayDevice,
382{
383 static const UNICODE_STRING ustrDisplay = RTL_CONSTANT_STRING(L"DISPLAY");
384 UNICODE_STRING ustrDevice;
385 WCHAR awcDevice[CCHDEVICENAME];
386 DISPLAY_DEVICEW dispdev;
388
389 TRACE("Enter NtUserEnumDisplayDevices(%wZ, %lu)\n",
390 pustrDevice, iDevNum);
391
392 dispdev.cb = sizeof(dispdev);
393
394 if (pustrDevice)
395 {
396 /* Initialize destination string */
397 RtlInitEmptyUnicodeString(&ustrDevice, awcDevice, sizeof(awcDevice));
398
400 {
401 /* Probe the UNICODE_STRING and the buffer */
402 ProbeForRead(pustrDevice, sizeof(UNICODE_STRING), 1);
403 ProbeForRead(pustrDevice->Buffer, pustrDevice->Length, 1);
404
405 /* Copy the string */
406 RtlCopyUnicodeString(&ustrDevice, pustrDevice);
407 }
409 {
410// _SEH2_YIELD(return _SEH2_GetExceptionCode());
412 }
414
415 if (ustrDevice.Length > 0 && !RtlEqualUnicodeString(&ustrDevice, &ustrDisplay, TRUE))
416 pustrDevice = &ustrDevice;
417 else
418 pustrDevice = NULL;
419 }
420
421 /* Acquire global USER lock */
423
424 /* Call the internal function */
425 Status = UserEnumDisplayDevices(pustrDevice, iDevNum, &dispdev, dwFlags);
426
427 /* Release lock */
428 UserLeave();
429
430 /* On success copy data to caller */
431 if (NT_SUCCESS(Status))
432 {
433 /* Enter SEH */
435 {
436 /* First probe the cb field */
437 ProbeForWrite(&pDisplayDevice->cb, sizeof(DWORD), 1);
438
439 /* Check the buffer size */
440 if (pDisplayDevice->cb)
441 {
442 /* Probe the output buffer */
443 pDisplayDevice->cb = min(pDisplayDevice->cb, sizeof(dispdev));
444 ProbeForWrite(pDisplayDevice, pDisplayDevice->cb, 1);
445
446 /* Copy as much as the given buffer allows */
447 RtlCopyMemory(pDisplayDevice, &dispdev, pDisplayDevice->cb);
448 }
449 }
451 {
453 }
455 }
456
457 TRACE("Leave NtUserEnumDisplayDevices, Status = 0x%lx\n", Status);
458 /* Return the result */
459// return Status;
460 return NT_SUCCESS(Status); // FIXME
461}
462
464NTAPI
466 PUNICODE_STRING pustrDevice,
467 PDEVMODEW *ppdm)
468{
469 PPDEVOBJ ppdev;
470
471 /* Get the PDEV for the device */
472 ppdev = EngpGetPDEV(pustrDevice);
473 if (!ppdev)
474 {
475 /* No device found */
476 ERR("No PDEV found!\n");
478 }
479
480 *ppdm = ppdev->pdmwDev;
481 PDEVOBJ_vRelease(ppdev);
482
483 return STATUS_SUCCESS;
484}
485
487NTAPI
489 PUNICODE_STRING pustrDevice,
491 LPDEVMODEW *ppdm,
493{
494 PGRAPHICS_DEVICE pGraphicsDevice;
495 PDEVMODEENTRY pdmentry;
496 ULONG i, iFoundMode;
497 PPDEVOBJ ppdev;
498
499 TRACE("Enter UserEnumDisplaySettings('%wZ', %lu)\n",
500 pustrDevice, iModeNum);
501
502 /* Ask GDI for the GRAPHICS_DEVICE */
503 pGraphicsDevice = EngpFindGraphicsDevice(pustrDevice, 0);
504 ppdev = EngpGetPDEV(pustrDevice);
505
506 if (!pGraphicsDevice || !ppdev)
507 {
508 /* No device found */
509 ERR("No device found!\n");
511 }
512
513 /* let's politely ask the driver for an updated mode list,
514 just in case there's something new in there (vbox) */
515
517 PDEVOBJ_vRelease(ppdev);
518
519 iFoundMode = 0;
520 for (i = 0; i < pGraphicsDevice->cDevModes; i++)
521 {
522 pdmentry = &pGraphicsDevice->pDevModeList[i];
523
524 /* FIXME: Consider EDS_RAWMODE */
525#if 0
526 if ((!(dwFlags & EDS_RAWMODE) && (pdmentry->dwFlags & 1)) ||!
527 (dwFlags & EDS_RAWMODE))
528#endif
529 {
530 /* Is this the one we want? */
531 if (iFoundMode == iModeNum)
532 {
533 *ppdm = pdmentry->pdm;
534 return STATUS_SUCCESS;
535 }
536
537 /* Increment number of found modes */
538 iFoundMode++;
539 }
540 }
541
542 /* Nothing was found */
544}
545
547NTAPI
549 OUT PHKEY phkey,
550 IN PUNICODE_STRING pustrDevice,
551 IN BOOL bGlobal)
552{
553 HKEY hkey;
554 DISPLAY_DEVICEW dispdev;
556
557 /* Get device info */
558 Status = UserEnumDisplayDevices(pustrDevice, 0, &dispdev, 0);
559 if (!NT_SUCCESS(Status))
560 return Status;
561
562 if (bGlobal)
563 {
564 // FIXME: Need to fix the registry key somehow
565 }
566
567 /* Open the registry key */
568 Status = RegOpenKey(dispdev.DeviceKey, &hkey);
569 if (!NT_SUCCESS(Status))
570 return Status;
571
572 *phkey = hkey;
573
574 return Status;
575}
576
578NTAPI
580 IN PUNICODE_STRING pustrDevice,
581 OUT LPDEVMODEW pdm)
582{
583 HKEY hkey;
584 NTSTATUS Status = UserOpenDisplaySettingsKey(&hkey, pustrDevice, 0);
585 if(NT_SUCCESS(Status))
586 {
587 RegReadDisplaySettings(hkey, pdm);
588 ZwClose(hkey);
589 return STATUS_SUCCESS;
590 }
591 return Status;
592}
593
597 IN PUNICODE_STRING pustrDevice,
601{
602 UNICODE_STRING ustrDeviceUser;
603 UNICODE_STRING ustrDevice;
604 WCHAR awcDevice[CCHDEVICENAME];
606 ULONG cbSize, cbExtra;
607 DEVMODEW dmReg, *pdm;
608
609 TRACE("Enter NtUserEnumDisplaySettings(%wZ, %lu, %p, 0x%lx)\n",
610 pustrDevice, iModeNum, lpDevMode, dwFlags);
611
613 {
614 ProbeForRead(lpDevMode, sizeof(DEVMODEW), sizeof(UCHAR));
615
616 cbSize = lpDevMode->dmSize;
617 cbExtra = lpDevMode->dmDriverExtra;
618
619 ProbeForWrite(lpDevMode, cbSize + cbExtra, sizeof(UCHAR));
620 }
622 {
624 }
625 _SEH2_END;
626
627 if (cbSize != sizeof(DEVMODEW))
628 {
630 }
631
632 if (pustrDevice)
633 {
634 /* Initialize destination string */
635 RtlInitEmptyUnicodeString(&ustrDevice, awcDevice, sizeof(awcDevice));
636
638 {
639 /* Probe the UNICODE_STRING and the buffer */
640 ustrDeviceUser = ProbeForReadUnicodeString(pustrDevice);
641
642 if (!ustrDeviceUser.Length || !ustrDeviceUser.Buffer)
644
645 ProbeForRead(ustrDeviceUser.Buffer,
646 ustrDeviceUser.Length,
647 sizeof(UCHAR));
648
649 /* Copy the string */
650 RtlCopyUnicodeString(&ustrDevice, &ustrDeviceUser);
651 }
653 {
655 }
656 _SEH2_END;
657
658 pustrDevice = &ustrDevice;
659 }
660
661 /* Acquire global USER lock */
663
665 {
666 /* Get the registry settings */
667 Status = UserEnumRegistryDisplaySettings(pustrDevice, &dmReg);
668 pdm = &dmReg;
669 pdm->dmSize = sizeof(DEVMODEW);
670 }
672 {
673 /* Get the current settings */
674 Status = UserEnumCurrentDisplaySettings(pustrDevice, &pdm);
675 }
676 else
677 {
678 /* Get specified settings */
679 Status = UserEnumDisplaySettings(pustrDevice, iModeNum, &pdm, dwFlags);
680 }
681
682 /* Release lock */
683 UserLeave();
684
685 /* Did we succeed? */
686 if (NT_SUCCESS(Status))
687 {
688 /* Copy some information back */
690 {
691 /* Output what we got */
692 RtlCopyMemory(lpDevMode, pdm, min(cbSize, pdm->dmSize));
693
694 /* Output private/extra driver data */
695 if (cbExtra > 0 && pdm->dmDriverExtra > 0)
696 {
697 RtlCopyMemory((PCHAR)lpDevMode + cbSize,
698 (PCHAR)pdm + pdm->dmSize,
699 min(cbExtra, pdm->dmDriverExtra));
700 }
701 }
703 {
705 }
706 _SEH2_END;
707 }
708
709 return Status;
710}
711
712VOID
714 DWORD flags)
715{
716 if (flags & CDS_FULLSCREEN)
718 else
720}
721
722LONG
725 PUNICODE_STRING pustrDevice,
726 LPDEVMODEW pdm,
727 DWORD flags,
729{
730 DEVMODEW dm;
732 HKEY hkey;
734 PPDEVOBJ ppdev;
735 WORD OrigBC;
736 //PDESKTOP pdesk;
737 PDEVMODEW newDevMode = NULL;
738
739 /* If no DEVMODE is given, use registry settings */
740 if (!pdm)
741 {
742 /* Get the registry settings */
743 Status = UserEnumRegistryDisplaySettings(pustrDevice, &dm);
744 if (!NT_SUCCESS(Status))
745 {
746 ERR("Could not load registry settings\n");
748 }
749 }
750 else if (pdm->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
751 {
752 return DISP_CHANGE_BADMODE; /* This is what WinXP SP3 returns */
753 }
754 else
755 {
756 dm = *pdm;
757 }
758
759 /* Save original bit count */
760 OrigBC = gpsi->BitCount;
761
762 /* Check params */
764 {
765 ERR("Devmode doesn't specify the resolution.\n");
766 return DISP_CHANGE_BADMODE;
767 }
768
769 /* Get the PDEV */
770 ppdev = EngpGetPDEV(pustrDevice);
771 if (!ppdev)
772 {
773 ERR("Failed to get PDEV\n");
775 }
776
777 /* Fixup values */
778 if (dm.dmBitsPerPel == 0 || !(dm.dmFields & DM_BITSPERPEL))
779 {
780 dm.dmBitsPerPel = ppdev->pdmwDev->dmBitsPerPel;
782 }
783
784 if ((dm.dmFields & DM_DISPLAYFREQUENCY) && (dm.dmDisplayFrequency == 0))
786
787 /* Look for the requested DEVMODE */
788 if (!LDEVOBJ_bProbeAndCaptureDevmode(ppdev->pGraphicsDevice, &dm, &newDevMode, FALSE))
789 {
790 ERR("Could not find a matching DEVMODE\n");
791 lResult = DISP_CHANGE_BADMODE;
792 goto leave;
793 }
794 else if (flags & CDS_TEST)
795 {
796 /* It's possible, go ahead! */
797 lResult = DISP_CHANGE_SUCCESSFUL;
798 goto leave;
799 }
800
801 /* Shall we update the registry? */
803 {
804 /* Open the local or global settings key */
805 Status = UserOpenDisplaySettingsKey(&hkey, pustrDevice, flags & CDS_GLOBAL);
806 if (NT_SUCCESS(Status))
807 {
808 /* Store the settings */
809 RegWriteDisplaySettings(hkey, newDevMode);
810
811 /* Close the registry key */
812 ZwClose(hkey);
813 }
814 else
815 {
816 ERR("Could not open registry key\n");
817 lResult = DISP_CHANGE_NOTUPDATED;
818 }
819 }
820
821 /* Check if DEVMODE matches the current mode */
822 if (newDevMode->dmSize == ppdev->pdmwDev->dmSize &&
823 RtlCompareMemory(newDevMode, ppdev->pdmwDev, newDevMode->dmSize) == newDevMode->dmSize &&
824 !(flags & CDS_RESET))
825 {
826 ERR("DEVMODE matches, nothing to do\n");
827 goto leave;
828 }
829
830 /* Shall we apply the settings? */
831 if (!(flags & CDS_NORESET))
832 {
833 ULONG_PTR ulResult;
834 PVOID pvOldCursor;
835 TEXTMETRICW tmw;
836
837 /* Remove mouse pointer */
838 pvOldCursor = UserSetCursor(NULL, TRUE);
839
840 /* Do the mode switch */
841 ulResult = PDEVOBJ_bSwitchMode(ppdev, newDevMode);
842
843 /* Restore mouse pointer, no hooks called */
844 pvOldCursor = UserSetCursor(pvOldCursor, TRUE);
845 ASSERT(pvOldCursor == NULL);
846
847 /* Check for success or failure */
848 if (!ulResult)
849 {
850 /* Setting mode failed */
851 ERR("Failed to set mode\n");
852
853 /* Set the correct return value */
854 if ((flags & CDS_UPDATEREGISTRY) && (lResult != DISP_CHANGE_NOTUPDATED))
855 lResult = DISP_CHANGE_RESTART;
856 else
857 lResult = DISP_CHANGE_FAILED;
858 }
859 else
860 {
861 /* Setting mode succeeded */
862 lResult = DISP_CHANGE_SUCCESSFUL;
864 ppdev->pdmwDev = newDevMode;
865
867
868 /* Update the system metrics */
869 InitMetrics();
870
871 /* Set new size of the monitor */
872 UserUpdateMonitorSize((HDEV)ppdev);
873
874 /* Update the SERVERINFO */
875 gpsi->dmLogPixels = ppdev->gdiinfo.ulLogPixelsY;
876 gpsi->Planes = ppdev->gdiinfo.cPlanes;
877 gpsi->BitsPixel = ppdev->gdiinfo.cBitsPixel;
878 gpsi->BitCount = gpsi->Planes * gpsi->BitsPixel;
879 gpsi->aiSysMet[SM_CXSCREEN] = ppdev->gdiinfo.ulHorzRes;
880 gpsi->aiSysMet[SM_CYSCREEN] = ppdev->gdiinfo.ulVertRes;
881 if (ppdev->gdiinfo.flRaster & RC_PALETTE)
882 {
883 gpsi->PUSIFlags |= PUSIF_PALETTEDISPLAY;
884 }
885 else
886 {
887 gpsi->PUSIFlags &= ~PUSIF_PALETTEDISPLAY;
888 }
889 // Font is realized and this dc was previously set to internal DC_ATTR.
890 gpsi->cxSysFontChar = IntGetCharDimensions(hSystemBM, &tmw, (DWORD*)&gpsi->cySysFontChar);
891 gpsi->tmSysFont = tmw;
892 }
893
894 /*
895 * Refresh the display on success and even on failure,
896 * since the display may have been messed up.
897 */
898
899 /* Remove all cursor clipping */
901
902 //pdesk = IntGetActiveDesktop();
903 //IntHideDesktop(pdesk);
904
905 /* Send WM_DISPLAYCHANGE to all toplevel windows */
907 WM_DISPLAYCHANGE,
908 gpsi->BitCount,
909 MAKELONG(gpsi->aiSysMet[SM_CXSCREEN], gpsi->aiSysMet[SM_CYSCREEN]),
911 100,
912 &ulResult );
913
914 ERR("BitCount New %d Orig %d ChkNew %d\n",gpsi->BitCount,OrigBC,ppdev->gdiinfo.cBitsPixel);
915
916 /* Not full screen and different bit count, send messages */
917 if (!(flags & CDS_FULLSCREEN) &&
918 gpsi->BitCount != OrigBC)
919 {
920 ERR("Detect settings changed.\n");
923 }
924
925 //co_IntShowDesktop(pdesk, ppdev->gdiinfo.ulHorzRes, ppdev->gdiinfo.ulVertRes);
926
928 }
929
930leave:
931 if (newDevMode && newDevMode != ppdev->pdmwDev)
933
934 /* Release the PDEV */
935 PDEVOBJ_vRelease(ppdev);
936
937 return lResult;
938}
939
940VOID
942 PPROCESSINFO ppiCurrent)
943{
944 if (ppiCurrent == gpFullscreen)
945 {
947 if (gpFullscreen)
948 ERR("Failed to restore display mode!\n");
949 }
950}
951
952LONG
955 PUNICODE_STRING pustrDevice,
959{
960 WCHAR awcDevice[CCHDEVICENAME];
961 UNICODE_STRING ustrDevice;
962 DEVMODEW dmLocal;
963 LONG lRet;
964
965 /* Check arguments */
966 if ((dwflags != CDS_VIDEOPARAMETERS) && (lParam != NULL))
967 {
970 }
971
972 /* Check flags */
974 {
976 }
977
978 if ((dwflags & CDS_RESET) && (dwflags & CDS_NORESET))
979 {
981 }
982
983 /* Copy the device name */
984 if (pustrDevice)
985 {
986 /* Initialize destination string */
987 RtlInitEmptyUnicodeString(&ustrDevice, awcDevice, sizeof(awcDevice));
988
990 {
991 /* Probe the UNICODE_STRING and the buffer */
992 ProbeForRead(pustrDevice, sizeof(UNICODE_STRING), 1);
993 ProbeForRead(pustrDevice->Buffer, pustrDevice->Length, 1);
994
995 /* Copy the string */
996 RtlCopyUnicodeString(&ustrDevice, pustrDevice);
997 }
999 {
1000 /* Set and return error */
1003 }
1004 _SEH2_END
1005
1006 pustrDevice = &ustrDevice;
1007 }
1008
1009 /* Copy devmode */
1010 if (lpDevMode)
1011 {
1012 _SEH2_TRY
1013 {
1014 /* Probe the size field of the structure */
1015 ProbeForRead(lpDevMode, sizeof(dmLocal.dmSize), 1);
1016
1017 /* Calculate usable size */
1018 dmLocal.dmSize = min(sizeof(dmLocal), lpDevMode->dmSize);
1019
1020 /* Probe and copy the full DEVMODE */
1021 ProbeForRead(lpDevMode, dmLocal.dmSize, 1);
1022 RtlCopyMemory(&dmLocal, lpDevMode, dmLocal.dmSize);
1023 }
1025 {
1026 /* Set and return error */
1029 }
1030 _SEH2_END
1031
1032 /* Check for extra parameters */
1033 if (dmLocal.dmDriverExtra > 0)
1034 {
1035 /* FIXME: TODO */
1036 ERR("lpDevMode->dmDriverExtra is IGNORED!\n");
1037 dmLocal.dmDriverExtra = 0;
1038 }
1039
1040 /* Use the local structure */
1041 lpDevMode = &dmLocal;
1042 }
1043
1044 // FIXME: Copy videoparameters
1045
1046 /* Acquire global USER lock */
1048
1049 /* Call internal function */
1050 lRet = UserChangeDisplaySettings(pustrDevice, lpDevMode, dwflags, NULL);
1051
1052 /* Release lock */
1053 UserLeave();
1054
1055 return lRet;
1056}
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: precomp.h:57
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
#define leave
Definition: btrfs_drv.h:138
LPARAM lParam
Definition: combotst.c:139
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define CCHDEVICENAME
Definition: ddrawi.h:63
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define APIENTRY
Definition: api.h:79
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
static DWORD DWORD * dwLength
Definition: fusion.c:86
#define swprintf
Definition: precomp.h:40
#define L(x)
Definition: resources.c:13
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
#define PagedPool
Definition: env_spec_w32.h:308
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:25
GLbitfield flags
Definition: glext.h:7161
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
PSERVERINFO gpsi
Definition: imm.c:18
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define PUSIF_PALETTEDISPLAY
Definition: ntuser.h:993
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
HDC hSystemBM
Definition: stockobj.c:52
#define REG_SZ
Definition: layer.c:22
BOOL LDEVOBJ_bProbeAndCaptureDevmode(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice, _In_ PDEVMODEW RequestedMode, _Out_ PDEVMODEW *pSelectedMode, _In_ BOOL bSearchClosestMode)
Definition: ldevobj.c:738
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static _In_ DWORD dwflags
Definition: dispmode.c:64
static _In_ DWORD iModeNum
Definition: dispmode.c:77
static _In_ DWORD _Inout_ PDEVMODEA lpDevMode
Definition: dispmode.c:77
#define min(a, b)
Definition: monoChain.cc:55
PCURICON_OBJECT FASTCALL UserSetCursor(PCURICON_OBJECT NewCursor, BOOL ForceChange)
Definition: msgqueue.c:93
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define REG_MULTI_SZ
Definition: nt_native.h:1504
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
#define ExRaiseStatus
Definition: ntoskrnl.h:114
#define STATUS_INVALID_PARAMETER_2
Definition: ntstatus.h:570
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:569
NTSTRSAFEAPI RtlStringCbCopyW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
Definition: ntstrsafe.h:174
NTSTRSAFEAPI RtlStringCbCatW(_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
Definition: ntstrsafe.h:636
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:242
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
PPDEVOBJ NTAPI EngpGetPDEV(_In_opt_ PUNICODE_STRING pustrDeviceName)
Definition: pdevobj.c:815
BOOL NTAPI PDEVOBJ_bSwitchMode(PPDEVOBJ ppdev, PDEVMODEW pdm)
Definition: pdevobj.c:712
VOID NTAPI PDEVOBJ_vRelease(_Inout_ PPDEVOBJ ppdev)
Definition: pdevobj.c:105
FORCEINLINE VOID PDEVOBJ_vReference(_In_ PPDEVOBJ ppdev)
Definition: pdevobj.h:160
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:1382
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:181
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:184
#define REG_DWORD
Definition: sdbapi.c:615
#define ProbeForReadUnicodeString(Ptr)
Definition: probe.h:77
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define TRACE(s)
Definition: solgame.cpp:4
PDEVMODEW pdm
Definition: pdevobj.h:53
DWORD dwFlags
Definition: pdevobj.h:52
WCHAR DeviceName[32]
Definition: wingdi.h:3264
DWORD StateFlags
Definition: wingdi.h:3266
WCHAR DeviceString[128]
Definition: wingdi.h:3265
WCHAR DeviceKey[128]
Definition: wingdi.h:3268
WCHAR DeviceID[128]
Definition: wingdi.h:3267
ULONG cBitsPixel
Definition: winddi.h:884
DWORD StateFlags
Definition: pdevobj.h:66
PDEVMODEENTRY pDevModeList
Definition: pdevobj.h:70
WCHAR szWinDeviceName[CCHDEVICENAME/2]
Definition: pdevobj.h:60
DWORD dwMonCnt
Definition: pdevobj.h:73
WCHAR szNtDeviceName[CCHDEVICENAME/2]
Definition: pdevobj.h:59
LPWSTR pwszDescription
Definition: pdevobj.h:72
ULONG cDevModes
Definition: pdevobj.h:69
PVIDEO_MONITOR_DEVICE pvMonDev
Definition: pdevobj.h:74
PDEVICE_OBJECT PhysDeviceHandle
Definition: pdevobj.h:64
GDIINFO gdiinfo
Definition: pdevobj.h:123
PDEVMODEW pdmwDev
Definition: pdevobj.h:129
PGRAPHICS_DEVICE pGraphicsDevice
Definition: pdevobj.h:127
LONG y
Definition: windef.h:124
LONG x
Definition: windef.h:123
PPROCESSINFO ppi
Definition: win32.h:88
USHORT MaximumLength
Definition: env_spec_w32.h:370
WORD dmDriverExtra
Definition: wingdi.h:2015
WORD dmSize
Definition: wingdi.h:2014
DWORD dmBitsPerPel
Definition: wingdi.h:2093
POINTL dmPosition
Definition: wingdi.h:2081
DWORD dmDisplayFixedOutput
Definition: wingdi.h:2083
DWORD dmFields
Definition: wingdi.h:2068
DWORD dmDisplayOrientation
Definition: wingdi.h:2082
DWORD dmPelsWidth
Definition: wingdi.h:2094
WORD dmDriverExtra
Definition: wingdi.h:2067
DWORD dmDisplayFlags
Definition: wingdi.h:2097
DWORD dmPelsHeight
Definition: wingdi.h:2095
DWORD dmDisplayFrequency
Definition: wingdi.h:2100
WORD dmSize
Definition: wingdi.h:2066
BOOL InitSysParams()
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
uint16_t * PWSTR
Definition: typedefs.h:56
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NTAPI
Definition: typedefs.h:36
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
PGRAPHICS_DEVICE NTAPI EngpRegisterGraphicsDevice(_In_ PUNICODE_STRING pustrDeviceName, _In_ PUNICODE_STRING pustrDiplayDrivers, _In_ PUNICODE_STRING pustrDescription)
Definition: device.c:647
PGRAPHICS_DEVICE NTAPI EngpFindGraphicsDevice(_In_opt_ PUNICODE_STRING pustrDevice, _In_ ULONG iDevNum)
Definition: device.c:780
NTSTATUS EngpUpdateGraphicsDeviceList(VOID)
Definition: device.c:182
NTSTATUS NTAPI EngpUpdateMonitorDevices(_In_ PGRAPHICS_DEVICE pGraphicsDevice)
Definition: device.c:568
VOID NTAPI PDEVOBJ_vRefreshModeList(PPDEVOBJ ppdev)
Definition: pdevobj.c:436
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
DWORD FASTCALL IntGetCharDimensions(_In_ HDC hdc, _Out_opt_ PTEXTMETRICW ptm, _Out_opt_ PDWORD height)
Definition: font.c:335
VOID NTAPI RegWriteDWORD(HKEY hkey, PCWSTR pwszValue, DWORD dwData)
Definition: registry.c:139
BOOL APIENTRY UserClipCursor(RECTL *prcl)
Definition: cursoricon.c:700
VOID APIENTRY UserRedrawDesktop(VOID)
Definition: desktop.c:1613
NTSTATUS NTAPI UserEnumRegistryDisplaySettings(IN PUNICODE_STRING pustrDevice, OUT LPDEVMODEW pdm)
Definition: display.c:579
VOID UserDisplayNotifyShutdown(PPROCESSINFO ppiCurrent)
Definition: display.c:941
BOOL NTAPI NtUserEnumDisplayDevices(PUNICODE_STRING pustrDevice, DWORD iDevNum, PDISPLAY_DEVICEW pDisplayDevice, DWORD dwFlags)
Definition: display.c:377
NTSTATUS APIENTRY NtUserEnumDisplaySettings(IN PUNICODE_STRING pustrDevice, IN DWORD iModeNum, OUT LPDEVMODEW lpDevMode, IN DWORD dwFlags)
Definition: display.c:596
VOID UserRefreshDisplay(IN PPDEVOBJ ppdev)
Definition: display.c:177
BOOL gbBaseVideo
Definition: display.c:12
NTSTATUS NTAPI UserEnumDisplayDevices(PUNICODE_STRING pustrDevice, DWORD iDevNum, PDISPLAY_DEVICEW pdispdev, DWORD dwFlags)
Definition: display.c:217
VOID UserUpdateFullscreen(DWORD flags)
Definition: display.c:713
#define READ(field, str, flag)
PGRAPHICS_DEVICE NTAPI InitDisplayDriver(IN PWSTR pwszDeviceName, IN PWSTR pwszRegKey)
Definition: display.c:66
LONG APIENTRY UserChangeDisplaySettings(PUNICODE_STRING pustrDevice, LPDEVMODEW pdm, DWORD flags, LPVOID lParam)
Definition: display.c:724
VOID RegWriteDisplaySettings(HKEY hkey, PDEVMODEW pdm)
Definition: display.c:18
NTSTATUS NTAPI InitVideo(VOID)
Definition: display.c:151
NTSTATUS NTAPI UserOpenDisplaySettingsKey(OUT PHKEY phkey, IN PUNICODE_STRING pustrDevice, IN BOOL bGlobal)
Definition: display.c:548
NTSTATUS NTAPI UserEnumDisplaySettings(PUNICODE_STRING pustrDevice, DWORD iModeNum, LPDEVMODEW *ppdm, DWORD dwFlags)
Definition: display.c:488
static const PWCHAR KEY_VIDEO
Definition: display.c:15
static PPROCESSINFO gpFullscreen
Definition: display.c:13
NTSTATUS NTAPI UserEnumCurrentDisplaySettings(PUNICODE_STRING pustrDevice, PDEVMODEW *ppdm)
Definition: display.c:465
VOID RegReadDisplaySettings(HKEY hkey, PDEVMODEW pdm)
Definition: display.c:35
LONG APIENTRY NtUserChangeDisplaySettings(PUNICODE_STRING pustrDevice, LPDEVMODEW lpDevMode, DWORD dwflags, LPVOID lParam)
Definition: display.c:954
BOOL FASTCALL UserSendNotifyMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:2090
LRESULT FASTCALL co_IntSendMessageTimeout(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT uFlags, UINT uTimeout, ULONG_PTR *uResult)
Definition: message.c:1707
BOOL NTAPI InitMetrics(VOID)
Definition: metric.c:41
NTSTATUS NTAPI UserUpdateMonitorSize(IN HDEV hDev)
Definition: monitor.c:225
#define GDITAG_DEVMODE
Definition: tags.h:73
#define USERTAG_DISPLAYINFO
Definition: tags.h:225
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO _In_ HDEV _In_ LPWSTR pwszDeviceName
Definition: winddi.h:3556
#define DM_DISPLAYFREQUENCY
Definition: wingdi.h:1272
#define DISPLAY_DEVICE_VGA_COMPATIBLE
Definition: wingdi.h:1400
#define DM_PELSWIDTH
Definition: wingdi.h:1269
#define DM_POSITION
Definition: wingdi.h:1255
#define DM_PANNINGHEIGHT
Definition: wingdi.h:1278
struct _devicemodeW DEVMODEW
#define DM_BITSPERPEL
Definition: wingdi.h:1268
#define DM_DISPLAYORIENTATION
Definition: wingdi.h:1257
#define DM_PELSHEIGHT
Definition: wingdi.h:1270
#define DM_PANNINGWIDTH
Definition: wingdi.h:1277
#define DM_DISPLAYFLAGS
Definition: wingdi.h:1271
#define RC_PALETTE
Definition: wingdi.h:790
#define RegOpenKey
Definition: winreg.h:526
#define RegQueryValue
Definition: winreg.h:530
#define CDS_TEST
Definition: winuser.h:182
#define DISP_CHANGE_NOTUPDATED
Definition: winuser.h:196
#define SM_CYSCREEN
Definition: winuser.h:971
#define CDS_VIDEOPARAMETERS
Definition: winuser.h:186
#define DISP_CHANGE_BADMODE
Definition: winuser.h:195
#define HWND_BROADCAST
Definition: winuser.h:1215
#define DISP_CHANGE_SUCCESSFUL
Definition: winuser.h:190
#define CDS_FULLSCREEN
Definition: winuser.h:183
#define ENUM_REGISTRY_SETTINGS
Definition: winuser.h:180
#define DISP_CHANGE_BADPARAM
Definition: winuser.h:193
#define WM_SYSCOLORCHANGE
Definition: winuser.h:1654
#define CDS_UPDATEREGISTRY
Definition: winuser.h:181
#define DISP_CHANGE_BADFLAGS
Definition: winuser.h:192
#define DISP_CHANGE_FAILED
Definition: winuser.h:194
#define CDS_NORESET
Definition: winuser.h:189
#define WM_SETTINGCHANGE
Definition: winuser.h:1657
#define ENUM_CURRENT_SETTINGS
Definition: winuser.h:179
#define CDS_RESET
Definition: winuser.h:187
#define SM_CXSCREEN
Definition: winuser.h:970
#define DISP_CHANGE_RESTART
Definition: winuser.h:191
#define CDS_GLOBAL
Definition: winuser.h:184
#define SMTO_NORMAL
Definition: winuser.h:1236
@ DevicePropertyDriverKeyName
Definition: iotypes.h:1202
@ DevicePropertyHardwareID
Definition: iotypes.h:1196
@ DevicePropertyDeviceDescription
Definition: iotypes.h:1195
unsigned char UCHAR
Definition: xmlstorage.h:181
__wchar_t WCHAR
Definition: xmlstorage.h:180