mirror of
https://github.com/reactos/reactos.git
synced 2024-07-06 12:45:16 +00:00
[USER32] We have to use the copy of DEVMODEA structure (having size expanded on dmDriverExtra) for support of extra data of the driver
svn path=/trunk/; revision=72659
This commit is contained in:
parent
5e9b9699a6
commit
6dd9ac5dc5
|
@ -191,8 +191,10 @@ EnumDisplaySettingsExA(
|
||||||
DWORD dwFlags)
|
DWORD dwFlags)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
UNICODE_STRING usDeviceName, *pusDeviceName = NULL;
|
UNICODE_STRING usDeviceName;
|
||||||
DEVMODEW DevModeW;
|
PUNICODE_STRING pusDeviceName = NULL;
|
||||||
|
LPDEVMODEW lpExtendedDevMode;
|
||||||
|
BOOL Result = FALSE;
|
||||||
|
|
||||||
if (lpszDeviceName)
|
if (lpszDeviceName)
|
||||||
{
|
{
|
||||||
|
@ -204,74 +206,105 @@ EnumDisplaySettingsExA(
|
||||||
pusDeviceName = &usDeviceName;
|
pusDeviceName = &usDeviceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&DevModeW,0, sizeof(DEVMODEW));
|
/* Allocate memory for DEVMODEW and extra data */
|
||||||
DevModeW.dmSize = sizeof(DEVMODEW);
|
lpExtendedDevMode = RtlAllocateHeap(RtlGetProcessHeap(),
|
||||||
|
HEAP_ZERO_MEMORY,
|
||||||
Status = NtUserEnumDisplaySettings(pusDeviceName, iModeNum, &DevModeW, dwFlags);
|
sizeof(DEVMODEW) + lpDevMode->dmDriverExtra);
|
||||||
|
if (!lpExtendedDevMode)
|
||||||
if (pusDeviceName)
|
|
||||||
{
|
{
|
||||||
RtlFreeUnicodeString (&usDeviceName);
|
if (pusDeviceName)
|
||||||
}
|
RtlFreeUnicodeString(&usDeviceName);
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define COPYS(f,len) WideCharToMultiByte( CP_THREAD_ACP, 0, DevModeW.f, len, (LPSTR)lpDevMode->f, len, NULL, NULL )
|
/* Initialize structure fields */
|
||||||
#define COPYN(f) lpDevMode->f = DevModeW.f
|
lpExtendedDevMode->dmSize = sizeof(DEVMODEW);
|
||||||
COPYS(dmDeviceName, CCHDEVICENAME );
|
lpExtendedDevMode->dmDriverExtra = lpDevMode->dmDriverExtra;
|
||||||
COPYN(dmSpecVersion);
|
|
||||||
COPYN(dmDriverVersion);
|
Status = NtUserEnumDisplaySettings(pusDeviceName, iModeNum, lpExtendedDevMode, dwFlags);
|
||||||
switch (lpDevMode->dmSize)
|
|
||||||
|
if (pusDeviceName)
|
||||||
|
RtlFreeUnicodeString(&usDeviceName);
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
case SIZEOF_DEVMODEA_300:
|
/* Store old structure size */
|
||||||
case SIZEOF_DEVMODEA_400:
|
WORD OldSize = lpDevMode->dmSize;
|
||||||
case SIZEOF_DEVMODEA_500:
|
|
||||||
break;
|
#define COPYS(f,len) WideCharToMultiByte(CP_THREAD_ACP, 0, lpExtendedDevMode->f, len, (LPSTR)lpDevMode->f, len, NULL, NULL)
|
||||||
default:
|
#define COPYN(f) lpDevMode->f = lpExtendedDevMode->f
|
||||||
lpDevMode->dmSize = SIZEOF_DEVMODEA_300;
|
|
||||||
break;
|
COPYS(dmDeviceName, CCHDEVICENAME);
|
||||||
|
COPYN(dmSpecVersion);
|
||||||
|
COPYN(dmDriverVersion);
|
||||||
|
COPYN(dmDriverExtra);
|
||||||
|
COPYN(dmFields);
|
||||||
|
COPYN(dmPosition.x);
|
||||||
|
COPYN(dmPosition.y);
|
||||||
|
COPYN(dmScale);
|
||||||
|
COPYN(dmCopies);
|
||||||
|
COPYN(dmDefaultSource);
|
||||||
|
COPYN(dmPrintQuality);
|
||||||
|
COPYN(dmColor);
|
||||||
|
COPYN(dmDuplex);
|
||||||
|
COPYN(dmYResolution);
|
||||||
|
COPYN(dmTTOption);
|
||||||
|
COPYN(dmCollate);
|
||||||
|
COPYS(dmFormName,CCHFORMNAME);
|
||||||
|
COPYN(dmLogPixels);
|
||||||
|
COPYN(dmBitsPerPel);
|
||||||
|
COPYN(dmPelsWidth);
|
||||||
|
COPYN(dmPelsHeight);
|
||||||
|
COPYN(dmDisplayFlags); // aka dmNup
|
||||||
|
COPYN(dmDisplayFrequency);
|
||||||
|
|
||||||
|
/* we're done with 0x300 fields */
|
||||||
|
if (OldSize > SIZEOF_DEVMODEA_300)
|
||||||
|
{
|
||||||
|
COPYN(dmICMMethod);
|
||||||
|
COPYN(dmICMIntent);
|
||||||
|
COPYN(dmMediaType);
|
||||||
|
COPYN(dmDitherType);
|
||||||
|
COPYN(dmReserved1);
|
||||||
|
COPYN(dmReserved2);
|
||||||
|
|
||||||
|
/* we're done with 0x400 fields */
|
||||||
|
if (OldSize > SIZEOF_DEVMODEA_400)
|
||||||
|
{
|
||||||
|
COPYN(dmPanningWidth);
|
||||||
|
COPYN(dmPanningHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore old size */
|
||||||
|
lpDevMode->dmSize = OldSize;
|
||||||
|
|
||||||
|
/* Extra data presented? */
|
||||||
|
if (lpDevMode->dmDriverExtra && lpExtendedDevMode->dmDriverExtra)
|
||||||
|
{
|
||||||
|
/* We choose the smallest size */
|
||||||
|
if (lpDevMode->dmDriverExtra > lpExtendedDevMode->dmDriverExtra)
|
||||||
|
lpDevMode->dmDriverExtra = lpExtendedDevMode->dmDriverExtra;
|
||||||
|
|
||||||
|
/* Copy extra data */
|
||||||
|
RtlCopyMemory(lpDevMode + OldSize, lpExtendedDevMode + 1, lpDevMode->dmDriverExtra);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the size of source structure is less, than used, we clean unsupported flags */
|
||||||
|
if (OldSize < FIELD_OFFSET(DEVMODEA, dmPanningHeight))
|
||||||
|
lpDevMode->dmFields &= ~DM_PANNINGHEIGHT;
|
||||||
|
|
||||||
|
if (OldSize < FIELD_OFFSET(DEVMODEA, dmPanningWidth))
|
||||||
|
lpDevMode->dmFields &= ~DM_PANNINGWIDTH;
|
||||||
|
|
||||||
|
Result = TRUE;
|
||||||
}
|
}
|
||||||
COPYN(dmDriverExtra);
|
|
||||||
COPYN(dmFields);
|
|
||||||
COPYN(dmPosition.x);
|
|
||||||
COPYN(dmPosition.y);
|
|
||||||
COPYN(dmScale);
|
|
||||||
COPYN(dmCopies);
|
|
||||||
COPYN(dmDefaultSource);
|
|
||||||
COPYN(dmPrintQuality);
|
|
||||||
COPYN(dmColor);
|
|
||||||
COPYN(dmDuplex);
|
|
||||||
COPYN(dmYResolution);
|
|
||||||
COPYN(dmTTOption);
|
|
||||||
COPYN(dmCollate);
|
|
||||||
COPYS(dmFormName,CCHFORMNAME);
|
|
||||||
COPYN(dmLogPixels);
|
|
||||||
COPYN(dmBitsPerPel);
|
|
||||||
COPYN(dmPelsWidth);
|
|
||||||
COPYN(dmPelsHeight);
|
|
||||||
COPYN(dmDisplayFlags); // aka dmNup
|
|
||||||
COPYN(dmDisplayFrequency);
|
|
||||||
|
|
||||||
if (lpDevMode->dmSize <= SIZEOF_DEVMODEW_300)
|
/* Free memory */
|
||||||
return TRUE; // we're done with 0x300 fields
|
RtlFreeHeap(RtlGetProcessHeap(), 0, lpExtendedDevMode);
|
||||||
|
|
||||||
COPYN(dmICMMethod);
|
return Result;
|
||||||
COPYN(dmICMIntent);
|
|
||||||
COPYN(dmMediaType);
|
|
||||||
COPYN(dmDitherType);
|
|
||||||
COPYN(dmReserved1);
|
|
||||||
COPYN(dmReserved2);
|
|
||||||
|
|
||||||
if (lpDevMode->dmSize <= SIZEOF_DEVMODEW_400)
|
|
||||||
return TRUE; // we're done with 0x400 fields
|
|
||||||
|
|
||||||
COPYN(dmPanningWidth);
|
|
||||||
COPYN(dmPanningHeight);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -285,7 +318,11 @@ EnumDisplaySettingsA(
|
||||||
DWORD iModeNum,
|
DWORD iModeNum,
|
||||||
LPDEVMODEA lpDevMode)
|
LPDEVMODEA lpDevMode)
|
||||||
{
|
{
|
||||||
return EnumDisplaySettingsExA ( lpszDeviceName, iModeNum, lpDevMode, 0 );
|
/* Fixup sizes */
|
||||||
|
lpDevMode->dmSize = FIELD_OFFSET(DEVMODEA, dmICMMethod);
|
||||||
|
lpDevMode->dmDriverExtra = 0;
|
||||||
|
|
||||||
|
return EnumDisplaySettingsExA(lpszDeviceName, iModeNum, lpDevMode, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -374,7 +411,7 @@ EnumDisplaySettingsW(
|
||||||
LPDEVMODEW lpDevMode)
|
LPDEVMODEW lpDevMode)
|
||||||
{
|
{
|
||||||
/* Fixup sizes */
|
/* Fixup sizes */
|
||||||
lpDevMode->dmSize = FIELD_OFFSET(DEVMODE, dmICMMethod);
|
lpDevMode->dmSize = FIELD_OFFSET(DEVMODEW, dmICMMethod);
|
||||||
lpDevMode->dmDriverExtra = 0;
|
lpDevMode->dmDriverExtra = 0;
|
||||||
|
|
||||||
return EnumDisplaySettingsExW(lpszDeviceName, iModeNum, lpDevMode, 0);
|
return EnumDisplaySettingsExW(lpszDeviceName, iModeNum, lpDevMode, 0);
|
||||||
|
|
Loading…
Reference in a new issue