Отказ от ответственности
Все манипуляции с блоками E-EDID вы осуществляете только на свой страх и риск с полным пониманием того, какие манипуляции и с какой целью вы выполняете, так как блоки E-EDID могут содержать информацию о разности потенциалов уровней сигналов, подмена которой при использовании некорректно подобранного в качестве донора дампа E-EDID может привести к повреждению компонентов электрических цепей монитора.
Подоплёка
Чуть более пяти лет тому назад, перед самым новым 2020 годом, освобождая комнату для проведения маленького новогоднего семейного торжества, мне пришлось отключить и убрать свой ПК. Литературными эпитетами не передать, каково было моё удивление, когда вскоре после новогодних торжеств мой комп вернулся на своё место, монитор, как и прежде, был подключён по DVI, но вместо привычной картинки 1920x1080@144Hz, мой старенький Full HD монитор BenQ XL2420Z уныло светился картинкой 1024x768@60Hz.
Покопавшись во всемирной паутине и собравшись с мыслями, пришёл к выводу, что проблема заключается в поврежденной информации блоков E-EDID, которую каждый уважающий себя видеовход монитора передаёт системе, и тогда возникла дилемма: либо поискать лишний носитель, поднять на нём Linux и использовать утилиты прошивки EEPROM через I2C, что за неимением достаточного опыта в данном вопросе могло повлечь ещё более негативные последствия; либо переключить монитор на DisplayPort, но на тот момент найти кабель с mini DP на DP — это квест не на один день (видяха располагала лишь тремя DVI и одним mini DP); либо попытаться настроить подмену блоков E-EDID в системе Windows, но всемирная паутина щедра лишь на информацию о подмене E-EDID на Linux, но не на Windows.
Для бывшего инженера техподдержки, много лет провозившегося с разными проблемами на операционной системе от Microsoft, эта ситуация была как брошенная в лицо перчатка, и уже было неважно сколько времени может уйти на поиски решения, в сравнении с решением квеста на добычу кабеля mini DP на DP.
Было бы странным, если популярная коммерческая операционная система от компании Microsoft не обладала элементарной возможностью подмены блоков E-EDID, и если в Linux задача решается указанием пути к файлу с двоичным образом дампа блоков E-EDID в соответствующем параметре строки аргументов загрузки ядра в настройках загрузчика GRUB2 и помещением двоичного образа в использующуюся при сборке загрузочного образа ядра структуру каталогов, то логично было предположить, что необходимую информацию о подмене блоков E-EDID при загрузке Windows удастся найти при изучении параметров команд bcdedit, но нет... Подсказка к решению была найдена при прочтении документа "Using an INF file to override EDIDs" раздела документации "Windows Display Driver Model". Оставалось лишь адаптировать полученную информацию к использованию в .REG-файле импорта/экспорта веток реестра Windows и найти подходящий дамп E-EDID.
Вкратце о назначении блока E-EDID
Как уже упоминалось, блок E-EDID хранится в EEPROM монитора отдельно для каждого видеовхода и, помимо идентификационной информации, также содержит информацию о цветопередаче монитора, размерах видимого поля изображения и поддерживаемых разрешениях, как стандартных (VESA), так и собственных.
Выбранное разрешение, вкупе с размерами видимого поля изображения монитора, позволяет системе производить точный перерасчёт заданных типографскими пунктами размеров элементов интерфейса в пикселы и даже субпикселы, что важно не только для поддержки технологии WYSIWYG, но также для поддержки технологий, использующих субпиксельное сглаживание шрифтов, таких как "Microsoft ClearType". Подробнее о сглаживании шрифтов можно почитать в одной из статей журнала «КОД».
Решение
Итак... Подключения видеовходов монитора перечисляются в ключе реестра, путь к которому состоит из следующих фрагментов:
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\";
-
<VIDPID>
Узел, чьё наименование соответствует полю "Vendor/Product Identification" блока E-EDID (в некоторых источниках именуемый как "Plug and Play ID"), состоящее из трёхбуквенного идентификатора "Vendor Id" и шестнадцатеричного представления двух байт "Product Id";
-
<UID>
Уникальный идентификатор подключения видеовхода монитора к выходу видеокарты в системе;
Данный ключ реестра, помимо значений параметров подключения, содержит ключ "Device Parameters", который, в свою очередь, в значении "EDID" содержит копию первого блока E-EDID в шестнадцатеричном представлении (если этот блок удалось успешно считать).
Согласно описанию из "Using an INF file to override EDIDs", ключ реестра "Device Parameters" может содержать ключ "EDID_OVERRIDE" предназначенный для подмены некорректных 128-байтных блоков E-EDID. При этом, в ключе должны содержаться только те значения блоков E-EDID под своими индексами (начиная с "0"), которые требуют замены. Предполагается, что остальные — корректные 128-байтные блоки будут считаны системой, но это не наш случай. В первом блоке E-EDID также содержится количество последующих блоков. Таким образом, содержимое нашего .REG-файл будет выглядеть примерно так:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\<VIDPID>\<UID>\Device Parameters\EDID_OVERRIDE]
"0"=hex:00,FF,FF,FF,FF,FF,FF,00,...
В поиске подходящего дампа E-EDID мне помог репозиторий дампов проекта "Linux Hardware". Для подмены вручную достаточно экспортировать из реестра в .REG-файл соответствующую ветку реестра "Device Parameters" из ключа реестра, идентифицирующего подключение и, открыв полученный файл в простом текстовом редакторе, к примеру в «Блокноте» ("%SystemRoot%\system32\notepad.exe"), отредактировать его содержимое дополнив путь к ключу подмены "EDID_OVERRIDE" и заменив содержимое на проиндексированное содержимое 128-байтных блоков E-EDID, как продемонстрировано в примере выше. Хоть этот E-EDID будет содержать серийный номер чужого монитора, но нам гораздо важнее информация об экранных разрешениях и размерах видимого поля, а информацию о серийном номере мы можем не менять, пока у нас не дойдут руки до попытки восстановить эту информацию в EEPROM.
Но, согласитесь — делать всё это вручную как-то неспортивно для человека, который способен не только решать проблемы пользователей, но также может написать несколько строчек скрипта для командной оболочки "cmd" и несколько строчек JavaScript'а для Windows Script Host. В результате, из под моей клавиатуры появился маленький репозиторий WSH-скриптов, где в каталоге "edid" присутствуют интерактивные скрипты (можно запускать без аргументов командной строки), позволяющие частично автоматизировать процесс:
-
edid\edid_1stblock.cmd
Запускает на выполнение WSH-скрипт "edid\edid_1stblock.wsf", читающий из реестра и сохраняющий в двоичном формате дамп первого E-EDID блока. Данный скрипт может быть полезен для резервирования первого E-EDID блока, содержащего идентифицирующую ваш монитор информацию с другого — полностью рабочего видеовхода, на случай, если эта информация понадобиться вам для того, чтобы перенести её в соответствующий дамп E-EDID, который вы подготавливаете для восстановления повреждённых данных EEPROM;
-
edid\edid_dump2bin.cmd
Запускает на выполнение WSH-скрипт "edid\edid_dump2bin.wsf", преобразующий дамп E-EDID из текстового шестнадцатеричного представления в двоичный формат, который можно будет открыть в каком-нибудь редакторе дампов E-EDID или использовать в качестве источника информации для следующего скрипта;
-
edid\edid_override.cmd
Запускает на выполнение WSH-скрипт "edid\edid_override.wsf", создающий .REG-файл со всей необходимой для импорта в реестр информацией подмены E-EDID на основе информации о выбранном пользователем подключении видеовхода и файла с двоичным дампом E-EDID;
Все cmd-скрипты написаны таким образом, чтобы их можно было запускать по полному пути из любого рабочего каталога, который вы хотите использовать для сохранения информации.
Комментарии (17)
xanto
11.05.2025 19:07Не знаю, насколько это было бы "спортивно", но для EDID есть разные утилиты, например Custom Resolution Utility (CRU), позволяющая считывать и подменять информацию из EDID. Так же есть варианты по настройке максимальных разрешений в утилитах производителей видеокарт.
Gredko
11.05.2025 19:07Странный какой-то дефект.
Не иначе кто-то сжёг плату скалера на мониторе и в мастерской в монитор поставили "универсальный", а перепрошивкой его не заморочились.
А параметры монитора разве нельзя в его свойствах поменять? Оно на EDID плюет обычно, если разрешение и частоту синхронизации вручную задать. У Вас - не так?
Зачем эти пляски с бубном вокруг реестра?
А в настройках монитора что стоит?
"Auto" небось какое-нибудь?
VBKesha
11.05.2025 19:07Странный какой-то дефект.
У меня подобное было когда отгорела подтяжка на DDC шине видеокарты. Хотя разрешение при этом не так жостко ограничивалось. Но там монитор вообще плохо детектился.
Gredko
11.05.2025 19:07Мы с Вами обсуждаем, что там может быть, а дело возможно просто в отсутствии драйвера монитора в венде. М. б. EDID работает. ID монитора компьютеру - передает, но драйвер венда к этому ID не находит и подставляет умолчательный. А автор статьи забыл показать, что же показывает венда в диспетчере устройств вместо его монитора.
Умолчательный тоже можно сменить:
"Чтобы изменить разрешение монитора по умолчанию в Windows 10, можно воспользоваться «Параметрами системы»:
Нажмите на клавиатуре одновременно кнопки Win и I.
Перейдите в раздел «Система».
Нажмите на «Дисплей» и выберете раздел «Разрешение дисплея».
Определитесь с разрешением и выставьте его.
Нажмите «ОК», подтвердите выбор. "
И не надо с бубном плясать и заклинания бормотать....
VBKesha
11.05.2025 19:07Всё не совсем так. В EDID далеко не только ID монитора. Там ещё зашиты как раз поддерживаемые разрешения и частоты. Поэтому если он(EDID) корректный то стандартный драйвер(если это можно считать драйвером) всё отлично детектит и прекрасно работает. А вот если его нет или он некорректный, то просто так в панели уже ничего не поменяешь.
Gredko
11.05.2025 19:07А Вы прочли фразу "Чтобы изменить разрешение монитора по умолчанию в Windows 10," прежде чем писать:
А вот если его нет или он некорректный, то просто так в панели уже ничего не поменяешь.
Наверное "если его нет или он некорректный", то венда применяет настройки по-умолчанию? Правда же?
Кроме того, из статьи непонятно нет обмена с монитором вообще и он помечен в "Устройствах" как "неизвестный монитор" или же его ID всё-таки виден.
Если ID - есть, то Ваша фраза
просто так в панели уже ничего не поменяешь.
неверна в корне.
В свойствах монитора можно выставить частоту и разрешение и эта частота и разрешение будут применяться к этому монитору и дальше.
VBKesha
11.05.2025 19:07Наверное "если его нет или он некорректный", то венда применяет настройки по-умолчанию? Правда же?
А тут пробовать надо. В моём случае это выливалось в то что система 2-3 минуты тупо стояла с черным монитором, а потом давала выбрать всё что угодно. Это было при невозможности прочитать EDID и под XP. А что выберет система при неисправном EDID надо тестировать, потому что там ещё может и видеодрайвер поработать. И поручатся что она выберет, что то там выставлено по умолчанию я не возьмусь, потому как это по умолчанию там для исправного монитора.
Gredko
11.05.2025 19:07И поручатся что она выберет, что то там выставлено по умолчанию я не возьмусь, потому как это по умолчанию там для исправного монитора.
Выбор у венды небольшой.
Либо параметры по-умолчанию для "Неизвестного монитора", либо данные из описания модели, если заголовок EDID прочитался.
Поручаться не надо☺️
А разобраться - не помешает.
denis_tunin Автор
11.05.2025 19:07"Настройки по умолчанию" для монитора в венде, это стандартные VESA-режимы и максимально доступным будет 1024x768@60.
AVX
11.05.2025 19:07Не странный дефект. Попадается такое. У самого есть монитор, в котором вход DVI не отдаëт EDID совсем, а другой вход ОК. Если принудительно выставить параметры - вполне работает и по DVI. Скорее всего портится содержимое EEPROM, или сама микросхема дохнет (я для своего варианта не смог найти прошивку, а вручную корректировать очень лень было, и не стал чинить, поставил монитор на комп где только vga выход). И это не софтварный глюк, я тестил на разных ОС и разных компах.
Gredko
11.05.2025 19:07Не странный дефект. Попадается такое. У самого есть монитор, в котором вход DVI не отдаëт EDID совсем, а другой вход ОК
У EDID в протоколе есть заголовок, который почти всегда читается. Те самые "VendorID" и далее. А есть данные в XML с данными, которые выставлены в мониторе: частота развертки, данные цветового профиля, разрешение.
Может такое быть, что заголовок прочитался, а данные - нет
Автору не мешало бы показать, что там в свойствах монитора в "Диспетчере устройств"Есть ли там "BenQ" и модель?
Может диагноз и не тот, который он дал.
А DVI - да, - "дохлый" интерфейс. Нельзя его "на горячую" перетыкать.
Gredko
11.05.2025 19:07В разъеме DVI для передачи EDID - два отдельных контакта "DDC".
Подгорели выходы видимо.
Такое часто бывает, например когда телевизор и компьютер в разные розетки включены.
Нужно шасси телевизора и корпус компьютера отдельным проводом соединять, чтобы такого не было.
AVX
11.05.2025 19:07Да это понятно, что надо в один удлинитель с нулем и кабели питания исправные. Я в таком состоянии купил (б/у), а обнаружил только через пару месяцев (до того пользовался по vga). Там на плате в общем-то есть диоды защитные по этим выводам, скорее всего пробит один или несколько. Моник старый, и как раз когда (если) комп сдохнет, то там уже надо будет нормальный комплект брать, и не мучать старую технику)
denis_tunin Автор
11.05.2025 19:07Моник покупался новым и до того момента отработал около 6 лет без нареканий.
denis_tunin Автор
11.05.2025 19:07А параметры монитора разве нельзя в его свойствах поменять? Оно на EDID плюет обычно, если разрешение и частоту синхронизации вручную задать. У Вас - не так?
Все мониторы, определяющиеся в системе, как plug-n-play, передают системе свой E-EDID, чтобы система имела полный набор параметров подключённого монитора и могла использовать субпиксельный рендеринг шрифтов, а также правильно отображать элементы, размеры которых заданы в типографских пунктах, но если у вас каким-то образом эта информация в EEPROM монитора повредилась и/или система не может установить корректность переданного ей блока по контрольному байту, система ничего не будет знать о параметрах монитора — о доступных разрешениях и размерах видимого поля.
AVX
Это будет работать на старых ОС? Например Win7, WinXP?
Я когда-то давно писал и пользовался довольно долго скриптом для сбора данных об оборудовании компов в корп сети, данные получались по WMI, и для получения данных о подключенных мониторах я откопал хитрую функцию, которая из реестра (по EDID) получала название и серийник монитора (конечно там много всего ещё, но мне не надо было остальное). Так вот, это всё работало, пока я не наткнулся, что в Win10 (возможно не сразу, а в каком-то обновлении) изменили пути и немного логику, и работа скрипта поломалась, я это отловил и как-то иначе выкрутился (что-то вроде get-wmiobject WmiMonitorID -Namespace root\wmi). Поискал у себя - я смотрел в System\CurrentCOntrolSet\Enum\Display и далее в модели монитора выбирал ветку Control (это означало, что этот монитор активен), а вот в win10 этой ветки уже не стало. Когда монитор один и проблемы нет - берём то, что нашли и норм. Однако, в реестре сохраняются данные о всех ранее подключенных мониторах - на ряде компов это были 10 и более штук.
P.S. странно что у вас в коде есть только case "ACR" и BNQ, хотя таких сокращений около 60-70шт (сейчас наверняка больше). Или тут какие-то особенности есть для этих производителей?
denis_tunin Автор
Не проверял, но на Win7 должно работать.
Что под рукой было, то и смог реализовать. Вообще, производители не придерживаются какого-то общего соглашения и комбинируют это два поля с информацией о серийном номере по своему усмотрению.