@@ -301,17 +301,65 @@ EnumDisplaySettingsExW(
301
301
DWORD dwFlags )
302
302
{
303
303
NTSTATUS Status ;
304
- UNICODE_STRING usDeviceName , * pusDeviceName = NULL ;
304
+ UNICODE_STRING usDeviceName ;
305
+ PUNICODE_STRING pusDeviceName = NULL ;
306
+ LPDEVMODEW lpExtendedDevMode ;
307
+ BOOL Result = FALSE;
305
308
306
309
if (lpszDeviceName )
307
310
{
308
311
RtlInitUnicodeString (& usDeviceName , lpszDeviceName );
309
312
pusDeviceName = & usDeviceName ;
310
313
}
311
314
312
- Status = NtUserEnumDisplaySettings (pusDeviceName , iModeNum , lpDevMode , dwFlags );
315
+ /* Allocate memory for DEVMODEW and extra data */
316
+ lpExtendedDevMode = RtlAllocateHeap (RtlGetProcessHeap (),
317
+ HEAP_ZERO_MEMORY ,
318
+ sizeof (DEVMODEW ) + lpDevMode -> dmDriverExtra );
319
+ if (!lpExtendedDevMode )
320
+ return FALSE;
321
+
322
+ /* Initialize structure fields */
323
+ lpExtendedDevMode -> dmSize = sizeof (DEVMODEW );
324
+ lpExtendedDevMode -> dmDriverExtra = lpDevMode -> dmDriverExtra ;
325
+
326
+ Status = NtUserEnumDisplaySettings (pusDeviceName , iModeNum , lpExtendedDevMode , dwFlags );
327
+ if (NT_SUCCESS (Status ))
328
+ {
329
+ /* Store old structure size */
330
+ WORD OldSize = lpDevMode -> dmSize ;
331
+
332
+ /* Copy general data */
333
+ RtlCopyMemory (lpDevMode , lpExtendedDevMode , OldSize );
334
+
335
+ /* Restore old size */
336
+ lpDevMode -> dmSize = OldSize ;
337
+
338
+ /* Extra data presented? */
339
+ if (lpDevMode -> dmDriverExtra && lpExtendedDevMode -> dmDriverExtra )
340
+ {
341
+ /* We choose the smallest size */
342
+ if (lpDevMode -> dmDriverExtra > lpExtendedDevMode -> dmDriverExtra )
343
+ lpDevMode -> dmDriverExtra = lpExtendedDevMode -> dmDriverExtra ;
313
344
314
- return NT_SUCCESS (Status );
345
+ /* Copy extra data */
346
+ RtlCopyMemory (lpDevMode + OldSize , lpExtendedDevMode + 1 , lpDevMode -> dmDriverExtra );
347
+ }
348
+
349
+ /* If the size of source structure is less, than used, we clean unsupported flags */
350
+ if (OldSize < FIELD_OFFSET (DEVMODEW , dmPanningHeight ))
351
+ lpDevMode -> dmFields &= ~DM_PANNINGHEIGHT ;
352
+
353
+ if (OldSize < FIELD_OFFSET (DEVMODEW , dmPanningWidth ))
354
+ lpDevMode -> dmFields &= ~DM_PANNINGWIDTH ;
355
+
356
+ Result = TRUE;
357
+ }
358
+
359
+ /* Free memory */
360
+ RtlFreeHeap (RtlGetProcessHeap (), 0 , lpExtendedDevMode );
361
+
362
+ return Result ;
315
363
}
316
364
317
365
@@ -325,7 +373,11 @@ EnumDisplaySettingsW(
325
373
DWORD iModeNum ,
326
374
LPDEVMODEW lpDevMode )
327
375
{
328
- return EnumDisplaySettingsExW ( lpszDeviceName , iModeNum , lpDevMode , 0 );
376
+ /* Fixup sizes */
377
+ lpDevMode -> dmSize = FIELD_OFFSET (DEVMODE , dmICMMethod );
378
+ lpDevMode -> dmDriverExtra = 0 ;
379
+
380
+ return EnumDisplaySettingsExW (lpszDeviceName , iModeNum , lpDevMode , 0 );
329
381
}
330
382
331
383
0 commit comments