[Wine-devel] [Wine-patches] [eter-2.0.0] [2/2] winspool.drv: Get default DEVMODEW. (eterbug #8821)[resend]

Tatyana Fokina tatyana на etersoft.ru
Вт Янв 8 13:50:05 MSK 2013


Dmitry Timoshkov писал 08.01.2013 13:40:
> Tatyana Fokina <tatyana на etersoft.ru> wrote:
>
>> > Столько ненужного кода, только для того. чтобы избежать вызова
>> > DEVMODEdupWtoA()
>> > если DM_IN_BUFFER не установлен?
>> >
>> > pDevModeInputA = (fMode & DM_IN_BUFFER) ?
>> > DEVMODEdupWtoA(pDevModeInput) : NULL;
>> >
>> > выглядит гораздо проще и понятнее.
>> А вот здесь буду снова отстаивать свою точку зрения :)
>> Весь смысл как раз в том, чтобы вызвать DEVMODEdupWtoA(), но перед 
>> этим
>> получив в pDevModeInput значения по умолчанию. Возможно реализация 
>> не
>> слишком изящна. Впрочем, если Вам кажется, что лучше оставть NULL, 
>> то
>> спорить не буду больше.
>
> DM_IN_BUFFER установленный во флагах означает, что входной буфер 
> содержит
> настройки, которые драйвер принтера должен использовать для установки
> начальных значений печати и параметров страницы. Соответственно, если
> этот флаг не установлен, значит входной буфер или содержит просто 
> мусор,
> или NULL, или может указывать вообще в "небо" и чтение по этому 
> адресу
> в лучшем случае безвредно, а в худшем вызовет access violation (есть
> и более мистические сценарии при чтении из страниц, обозначенных как
> PAGE_GUARD). С другой стороны, почему создаются какие-то данные для
> использования по умолчанию в прослойке вроде winspool.drv, а не в 
> самом
> драйвере принтера? И при этом данные передаются, но DM_IN_BUFFER не
> устанавливается?
>
> Насколько я понимаю, Вы обнаружили, что буфер с мусором 
> конвертируется
> в DEVMODEA, приводя к каким-то нежелательным побочным эффектам. При 
> этом
> Вы почему-то решили, что использование каких-то иных данных вместо 
> мусора
> будет лучше. Только непонятно почему, ведь драйвер принтера все равно
> проигнорирует эти данные без DM_IN_BUFFER во флагах. Если драйвер все 
> же
> не проверяет этот флаг, и все равно использует входной буфер - это 
> баг в
> драйвере, и он должен быть исправлен, но насколько я вижу, wineps.drv 
> все
> делает правильно.
  На самом деле, когда я писала это, руководствовалась тем, что функции, 
получающие эту структуру, сравнивают именно указатель, при этом не 
анализируя флаг, а msdn говорит, что если флаг не DM_IN_BUFFER, 
используется структура по умолчанию.
  Сейчас, насколько я понимаю, получается, что фактическая разница между 
двумя нашими вариантами только в том, в каком месте будут получаться 
значения по умолчанию. А так как передавать структуру и неизмененные 
флаги не корректно, то разумнее будет просто отправлять NULL, и 
предоставить драйверу самому определить нужные значения. Правильно?


Подробная информация о списке рассылки Wine-devel