-fix a bug in GetDisplayNumberFromDeviceName

-don't overwrite memory in IntEnumDisplaySettings

svn path=/trunk/; revision=28934
This commit is contained in:
Christoph von Wittich 2007-09-08 07:43:45 +00:00
parent 6a0d3658f6
commit 30dc779d1c

View file

@ -2736,7 +2736,7 @@ GetDisplayNumberFromDeviceName(
*DisplayNumber = ((GDIDEVICE *)pDC->GDIDevice)->DisplayNumber; *DisplayNumber = ((GDIDEVICE *)pDC->GDIDevice)->DisplayNumber;
DC_UnlockDc(DesktopHDC); DC_UnlockDc(pDC);
UserReleaseDC(DesktopObject, DesktopHDC, FALSE); UserReleaseDC(DesktopObject, DesktopHDC, FALSE);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -2787,7 +2787,6 @@ IntEnumDisplaySettings(
static UNICODE_STRING CachedDeviceName; static UNICODE_STRING CachedDeviceName;
PDEVMODEW CachedMode = NULL; PDEVMODEW CachedMode = NULL;
DEVMODEW DevMode; DEVMODEW DevMode;
INT Size, OldSize;
ULONG DisplayNumber; ULONG DisplayNumber;
if (!NT_SUCCESS(GetDisplayNumberFromDeviceName(pDeviceName, &DisplayNumber))) if (!NT_SUCCESS(GetDisplayNumberFromDeviceName(pDeviceName, &DisplayNumber)))
@ -2884,7 +2883,7 @@ IntEnumDisplaySettings(
} }
/* Call DDI driver's EnableDriver function */ /* Call DDI driver's EnableDriver function */
RtlZeroMemory(&DrvEnableData, sizeof (DrvEnableData)); RtlZeroMemory(&DrvEnableData, sizeof(DrvEnableData));
if (!GDEnableDriver(DDI_DRIVER_VERSION_NT5_01, sizeof (DrvEnableData), &DrvEnableData)) if (!GDEnableDriver(DDI_DRIVER_VERSION_NT5_01, sizeof (DrvEnableData), &DrvEnableData))
{ {
@ -2999,20 +2998,9 @@ IntEnumDisplaySettings(
ASSERT(CachedMode != NULL); ASSERT(CachedMode != NULL);
Size = OldSize = pDevMode->dmSize; RtlCopyMemory(pDevMode, CachedMode, pDevMode->dmSize);
if (Size > CachedMode->dmSize) RtlZeroMemory(pDevMode + pDevMode->dmSize, pDevMode->dmDriverExtra);
Size = CachedMode->dmSize; RtlCopyMemory(pDevMode + pDevMode->dmSize, CachedMode + CachedMode->dmSize, min(pDevMode->dmDriverExtra, CachedMode->dmDriverExtra));
RtlCopyMemory(pDevMode, CachedMode, Size);
RtlZeroMemory((PCHAR)pDevMode + Size, OldSize - Size);
pDevMode->dmSize = OldSize;
Size = OldSize = pDevMode->dmDriverExtra;
if (Size > CachedMode->dmDriverExtra)
Size = CachedMode->dmDriverExtra;
RtlCopyMemory((PCHAR)pDevMode + pDevMode->dmSize,
(PCHAR)CachedMode + CachedMode->dmSize, Size);
RtlZeroMemory((PCHAR)pDevMode + pDevMode->dmSize + Size, OldSize - Size);
pDevMode->dmDriverExtra = OldSize;
return TRUE; return TRUE;
} }
@ -3162,7 +3150,7 @@ IntChangeDisplaySettings(
LONG Ret=0; LONG Ret=0;
NTSTATUS Status ; NTSTATUS Status ;
DPRINT1("display flag : %x\n",dwflags); DPRINT1("display flags : %x\n",dwflags);
if ((dwflags & CDS_UPDATEREGISTRY) == CDS_UPDATEREGISTRY) if ((dwflags & CDS_UPDATEREGISTRY) == CDS_UPDATEREGISTRY)
{ {
@ -3185,7 +3173,7 @@ IntChangeDisplaySettings(
if (dwflags == 0) if (dwflags == 0)
{ {
/* Dynamically change graphics mode */ /* Dynamically change graphics mode */
DPRINT1("flag 0 UNIMPLEMENT \n"); DPRINT1("flag 0 UNIMPLEMENTED\n");
return DISP_CHANGE_FAILED; return DISP_CHANGE_FAILED;
} }
@ -3193,7 +3181,7 @@ IntChangeDisplaySettings(
{ {
/* Test reslution */ /* Test reslution */
dwflags &= ~CDS_TEST; dwflags &= ~CDS_TEST;
DPRINT1("flag CDS_TEST UNIMPLEMENT"); DPRINT1("flag CDS_TEST UNIMPLEMENTED\n");
Ret = DISP_CHANGE_FAILED; Ret = DISP_CHANGE_FAILED;
} }
@ -3202,15 +3190,12 @@ IntChangeDisplaySettings(
DEVMODEW lpDevMode; DEVMODEW lpDevMode;
/* Full Screen */ /* Full Screen */
dwflags &= ~CDS_FULLSCREEN; dwflags &= ~CDS_FULLSCREEN;
DPRINT1("flag CDS_FULLSCREEN partially implemented"); DPRINT1("flag CDS_FULLSCREEN partially implemented\n");
Ret = DISP_CHANGE_FAILED; Ret = DISP_CHANGE_FAILED;
lpDevMode.dmBitsPerPel =0; RtlZeroMemory(&lpDevMode, sizeof(DEVMODEW));
lpDevMode.dmPelsWidth =0;
lpDevMode.dmPelsHeight =0;
lpDevMode.dmDriverExtra =0;
lpDevMode.dmSize = sizeof(DEVMODEW); lpDevMode.dmSize = sizeof(DEVMODEW);
if (!IntEnumDisplaySettings(pDeviceName, ENUM_CURRENT_SETTINGS, &lpDevMode, 0)) if (!IntEnumDisplaySettings(pDeviceName, ENUM_CURRENT_SETTINGS, &lpDevMode, 0))
return DISP_CHANGE_FAILED; return DISP_CHANGE_FAILED;
@ -3231,7 +3216,7 @@ IntChangeDisplaySettings(
Ret=DISP_CHANGE_BADPARAM; Ret=DISP_CHANGE_BADPARAM;
else else
{ {
DPRINT1("flag CDS_VIDEOPARAMETERS UNIMPLEMENT"); DPRINT1("flag CDS_VIDEOPARAMETERS UNIMPLEMENTED\n");
Ret = DISP_CHANGE_FAILED; Ret = DISP_CHANGE_FAILED;
} }
@ -3247,7 +3232,7 @@ IntChangeDisplaySettings(
HANDLE DevInstRegKey; HANDLE DevInstRegKey;
ULONG NewValue; ULONG NewValue;
DPRINT1("set CDS_UPDATEREGISTRY \n"); DPRINT1("set CDS_UPDATEREGISTRY\n");
dwflags &= ~CDS_UPDATEREGISTRY; dwflags &= ~CDS_UPDATEREGISTRY;