Отказ от ответственности

Все манипуляции с блоками 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". Подробнее о сглаживании шрифтов можно почитать в одной из статей журнала «КОД».

Решение

Итак... Подключения видеовходов монитора перечисляются в ключе реестра, путь к которому состоит из следующих фрагментов:

  1. "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\";

  2. <VIDPID>

    Узел, чьё наименование соответствует полю "Vendor/Product Identification" блока E-EDID (в некоторых источниках именуемый как "Plug and Play ID"), состоящее из трёхбуквенного идентификатора "Vendor Id" и шестнадцатеричного представления двух байт "Product Id";

  3. <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)


  1. AVX
    11.05.2025 19:07

    Это будет работать на старых ОС? Например 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шт (сейчас наверняка больше). Или тут какие-то особенности есть для этих производителей?


    1. denis_tunin Автор
      11.05.2025 19:07

      Не проверял, но на Win7 должно работать.

      странно что у вас в коде есть только case "ACR" и BNQ, хотя таких сокращений около 60-70шт (сейчас наверняка больше). Или тут какие-то особенности есть для этих производителей?

      Что под рукой было, то и смог реализовать. Вообще, производители не придерживаются какого-то общего соглашения и комбинируют это два поля с информацией о серийном номере по своему усмотрению.


  1. xanto
    11.05.2025 19:07

    Не знаю, насколько это было бы "спортивно", но для EDID есть разные утилиты, например Custom Resolution Utility (CRU), позволяющая считывать и подменять информацию из EDID. Так же есть варианты по настройке максимальных разрешений в утилитах производителей видеокарт.


  1. Gredko
    11.05.2025 19:07

    Странный какой-то дефект.

    Не иначе кто-то сжёг плату скалера на мониторе и в мастерской в монитор поставили "универсальный", а перепрошивкой его не заморочились.

    А параметры монитора разве нельзя в его свойствах поменять? Оно на EDID плюет обычно, если разрешение и частоту синхронизации вручную задать. У Вас - не так?

    Зачем эти пляски с бубном вокруг реестра?

    А в настройках монитора что стоит?

    "Auto" небось какое-нибудь?


    1. VBKesha
      11.05.2025 19:07

      Странный какой-то дефект.

      У меня подобное было когда отгорела подтяжка на DDC шине видеокарты. Хотя разрешение при этом не так жостко ограничивалось. Но там монитор вообще плохо детектился.


      1. Gredko
        11.05.2025 19:07

        Мы с Вами обсуждаем, что там может быть, а дело возможно просто в отсутствии драйвера монитора в венде. М. б. EDID работает. ID монитора компьютеру - передает, но драйвер венда к этому ID не находит и подставляет умолчательный. А автор статьи забыл показать, что же показывает венда в диспетчере устройств вместо его монитора.

        Умолчательный тоже можно сменить:

        "Чтобы изменить разрешение монитора по умолчанию в Windows 10, можно воспользоваться «Параметрами системы»:

        1. Нажмите на клавиатуре одновременно кнопки Win и I

        2. Перейдите в раздел «Система»

        3. Нажмите на «Дисплей» и выберете раздел «Разрешение дисплея»

        4. Определитесь с разрешением и выставьте его. 

        5. Нажмите «ОК», подтвердите выбор. "

        И не надо с бубном плясать и заклинания бормотать....


        1. VBKesha
          11.05.2025 19:07

          Всё не совсем так. В EDID далеко не только  ID монитора. Там ещё зашиты как раз поддерживаемые разрешения и частоты. Поэтому если он(EDID) корректный то стандартный драйвер(если это можно считать драйвером) всё отлично детектит и прекрасно работает. А вот если его нет или он некорректный, то просто так в панели уже ничего не поменяешь.


          1. Gredko
            11.05.2025 19:07

            А Вы прочли фразу "Чтобы изменить разрешение монитора по умолчанию в Windows 10," прежде чем писать:

            А вот если его нет или он некорректный, то просто так в панели уже ничего не поменяешь.

            Наверное "если его нет или он некорректный", то венда применяет настройки по-умолчанию? Правда же?

            Кроме того, из статьи непонятно нет обмена с монитором вообще и он помечен в "Устройствах" как "неизвестный монитор" или же его ID всё-таки виден.

            Если ID - есть, то Ваша фраза

            просто так в панели уже ничего не поменяешь.

            неверна в корне.

            В свойствах монитора можно выставить частоту и разрешение и эта частота и разрешение будут применяться к этому монитору и дальше.


            1. VBKesha
              11.05.2025 19:07

              Наверное "если его нет или он некорректный", то венда применяет настройки по-умолчанию? Правда же?

              А тут пробовать надо. В моём случае это выливалось в то что система 2-3 минуты тупо стояла с черным монитором, а потом давала выбрать всё что угодно. Это было при невозможности прочитать EDID и под XP. А что выберет система при неисправном EDID надо тестировать, потому что там ещё может и видеодрайвер поработать. И поручатся что она выберет, что то там выставлено по умолчанию я не возьмусь, потому как это по умолчанию там для исправного монитора.


              1. Gredko
                11.05.2025 19:07

                 И поручатся что она выберет, что то там выставлено по умолчанию я не возьмусь, потому как это по умолчанию там для исправного монитора.

                Выбор у венды небольшой.

                Либо параметры по-умолчанию для "Неизвестного монитора", либо данные из описания модели, если заголовок EDID прочитался.

                Поручаться не надо☺️

                А разобраться - не помешает.


            1. denis_tunin Автор
              11.05.2025 19:07

              "Настройки по умолчанию" для монитора в венде, это стандартные VESA-режимы и максимально доступным будет 1024x768@60.


    1. AVX
      11.05.2025 19:07

      Не странный дефект. Попадается такое. У самого есть монитор, в котором вход DVI не отдаëт EDID совсем, а другой вход ОК. Если принудительно выставить параметры - вполне работает и по DVI. Скорее всего портится содержимое EEPROM, или сама микросхема дохнет (я для своего варианта не смог найти прошивку, а вручную корректировать очень лень было, и не стал чинить, поставил монитор на комп где только vga выход). И это не софтварный глюк, я тестил на разных ОС и разных компах.


      1. Gredko
        11.05.2025 19:07

        Не странный дефект. Попадается такое. У самого есть монитор, в котором вход DVI не отдаëт EDID совсем, а другой вход ОК

        У EDID в протоколе есть заголовок, который почти всегда читается. Те самые "VendorID" и далее. А есть данные в XML с данными, которые выставлены в мониторе: частота развертки, данные цветового профиля, разрешение.

        Может такое быть, что заголовок прочитался, а данные - нет

        Автору не мешало бы показать, что там в свойствах монитора в "Диспетчере устройств"Есть ли там "BenQ" и модель?

        Может диагноз и не тот, который он дал.

        А DVI - да, - "дохлый" интерфейс. Нельзя его "на горячую" перетыкать.


      1. Gredko
        11.05.2025 19:07

        В разъеме DVI для передачи EDID - два отдельных контакта "DDC".

        Подгорели выходы видимо.

        Такое часто бывает, например когда телевизор и компьютер в разные розетки включены.

        Нужно шасси телевизора и корпус компьютера отдельным проводом соединять, чтобы такого не было.


        1. AVX
          11.05.2025 19:07

          Да это понятно, что надо в один удлинитель с нулем и кабели питания исправные. Я в таком состоянии купил (б/у), а обнаружил только через пару месяцев (до того пользовался по vga). Там на плате в общем-то есть диоды защитные по этим выводам, скорее всего пробит один или несколько. Моник старый, и как раз когда (если) комп сдохнет, то там уже надо будет нормальный комплект брать, и не мучать старую технику)


    1. denis_tunin Автор
      11.05.2025 19:07

      Моник покупался новым и до того момента отработал около 6 лет без нареканий.


    1. denis_tunin Автор
      11.05.2025 19:07

      А параметры монитора разве нельзя в его свойствах поменять? Оно на EDID плюет обычно, если разрешение и частоту синхронизации вручную задать. У Вас - не так?

      Все мониторы, определяющиеся в системе, как plug-n-play, передают системе свой E-EDID, чтобы система имела полный набор параметров подключённого монитора и могла использовать субпиксельный рендеринг шрифтов, а также правильно отображать элементы, размеры которых заданы в типографских пунктах, но если у вас каким-то образом эта информация в EEPROM монитора повредилась и/или система не может установить корректность переданного ей блока по контрольному байту, система ничего не будет знать о параметрах монитора — о доступных разрешениях и размерах видимого поля.