Интерфейс видео драйвера DirectX для Windows 95 имел метод, который реализовывался каждым драйвером, с прототипом типа "function DoesDriverSupport(const guidCapability: TGUID): Bool", куда мы передавали GUID возможности, а драйвер говорил в ответ, поддерживает ли он эту возможность или нет.
Были определены GUID возможностей - такие как GUID_CanStretchAlpha, например, чтобы узнать, поддерживает ли драйвер масштабирование растра с альфа каналом.
Потом нам попался готовый драйвер, который возвращал TRUE, когда вы вызывали DoesDriverSupport(GUID_XYZ), но когда DirectDraw пытался использовать эту возможность, то вызов был неудачным (и с весьма впечатляющими эффектами).
Тогда один из разработчиков DirectDraw позвонил производителю и спросил его: "а ваша карточка поддерживает XYZ?".
Их ответ: "А что ещё такое XYZ?".
Оказалось, что их реализация DoesDriverSupport в драйвере была примерно такой:
function DoesDriverSupport(const guidCapability: TGUID): Bool; stdcall;Иными словами, когда DirectX спрашивал "а вот это вы умеете делать?", они отвечали "ну конечно же мы умеем это делать" вообще даже без проверки, в чём же заключался вопрос.
begin
Result := True;
end;
(Наверное драйвер писал отдел продаж).
Поэтому ребята из DirectDraw изменили логику вопросов драйверу. Один из разработчиков зашёл в офис своего босса, нашёл там сетевую карту, записал с неё MAC-адрес, а затем разбил карту молотком.
Видите ли, этот последний шаг очень важен: алгоритм генерации GUID основывается на комбинации данных времени и пространства. Когда вы просите CoCreateGuid сгенерировать новый GUID, она кодирует время вашего запроса в первой части GUID, а информацию, которая уникально идентифицирует вашу машину (в том числе MAC-адрес сетевой карты, который глобально уникален благодаря стандартам, которые применяются к сетевым картам) - во вторую.
Разбив карту молотком, разработчик воспрепятствовал повторному использованию этой карты для генерации GUID.
Затем он изменил логику вопросов следующим образом: когда DirectDraw запускался, он генерировал случайный GUID на основе этой сетевой карты (который более не может существовать, т.к. его сетевую карту уничтожили) и передавал её в DoesDriverSupport. Если при этом драйвер отвечал: "да, это мы поддерживаем", то DirectDraw говорил: "Ага! Попался! Я больше не верю ни единому твоему слову.".
хитрые =)))
ОтветитьУдалитьНасколько я знаю, в генерации GUID MAC-адрес больше не используется. Может быть, чтобы не допускать утечки личных данных, может по другой причине. Я уже не помню.
ОтветитьУдалитьДа, это так. В GUID вписывается "номер поколения". MAC использовался для генерации GUID только в первом варианте алгоритма.
ОтветитьУдалитьМожно почитать на вики (как обычно, русскоязычная вики по сравнению с английской - просто отстой).