Исходный код драйверов VooDoo
#1
Отправлено 02 Февраль 2010 - 00:54
Т.е., драйвера кому-то удалось среверсить или доработка функционала идет за счет бинарных патчей к оригинальным? Чьих-либо исходников хотя бы каком-нибудь виде не нашел, может быть плохо искал. Может кто-нить пролить свет на эту тему?
#2
Отправлено 02 Февраль 2010 - 02:10
добавлено спустя: 0 часов 1 минут 1 секунд
Я нашё только вот что: http://www.tomshardware.co.uk/forum/75127-...e-code-released
http://www.warp2search.net/contentteller/n...code_leaks.html
#3
Отправлено 02 Февраль 2010 - 12:17

Кстати, задолго до этого (в 1999) 3dfx опубликовала глайд для линукса в виде open source проекта. Позже этот код использовался в некоторых wrapper'ах, а также был портирован обратно на винду и вырос в GlideXP.
Комментарий:
Скорее всего SFFT (да и другие разработчики) использовал код 3dfx для своих релизов дров. Остаётся непонятным почему никто из них не опубликовал свои исходники. Опасаются того, что уличат в использовании "утёкшего" кода? Вряд ли - ведь можно просто выложить патч к оригинальным текстам... Но, наверное, никто в этом не заинтересован. Таким образом, если кто-то в будущем захочет улучшить дрова для вудушек, то ему придётся начинать с нуля (с кода 3dfx), а можно было бы сразу взять за основу последние дрова от SFFT...
Призыв:
Если вы разрабатываете что-то связанное с 3dfx (glide, дровами, биосами, ...) - делайте свои исходники открытыми! Энтузиастов 3dfx осталось мало (а программистов среди них ещё меньше), так что отбросьте мысли о коммерческой тайне своего драгоценного кода и нереальных прибылях

[1] http://3dfxbios.stan...source_code.rar
#4
Отправлено 02 Февраль 2010 - 19:24
#9
Отправлено 02 Февраль 2010 - 22:10
Цитата
подождем его, может прольет "свет" на ситуацию

#10
Отправлено 03 Февраль 2010 - 21:39
Скачал 40 метровый файл, внутри много исходного кода различных утилит и тестов, непосредственно к драйверам не относящимся. Также много скомпилированных экзешников и прочих материалов (например .max, судя по всему от 3дстудии). Пакет скорее всего сформирован из разных; скажем, в корне есть ридми, где написано, что это глайд диагностикс кит и что драйверов тут нет. Также лежат штуки, относящиеся к СДК, но .sys файлы (как бы драйверы) тоже есть. Есть и исходные тексты, судя по названию и содержанию которых, представляют собой части драйвера, обрабатывающие DirectDraw и OpenGL.
Как нибудь скачаю ДДК, настрою среду сборки и попробую собрать что-нить совместимое с моим 2003 сервером или хотя бы с 2000/98.
Мэйкфайлы в папках как для вин, так и для юникс/линукс.
#11
Отправлено 04 Февраль 2010 - 21:37
Удачи, надеюсь у тебя все получится и ты поведаешь нам о результатах

#13
Отправлено 06 Февраль 2010 - 02:37
Система: Voodoo 5 PCI Mac с перешитым PC-биосом, Windows 2003 Server R2 Enterprise Edition x86 En Free Build (обычная 32-разрядная английская пользовательская сборка).
Используемое ПО: Драйвер SFFT 1.5, Windows IFS Kit and DDK 3790, Visual Studio 2008.
Цель: скомпилировать минипорт 3dfxvsm.sys и драйвер дисплея 3dfxvs.dll; заменить их в драйвере SFFT 1.5 и убедиться в работоспособности.
Требуемый исходный код драйвера для Windows 2000 находится в файле 3dfx_source_code.rar на пути \H5\W2K. Содержимое этой папки я распаковываю в c:\3dfx
Насчет среды "microsoft visual c++" и драйверов. Ее можно заставить компилировать драйверы, но с побочными эффектами. В последний раз, когда я ее пытался использовать для этого, выходило следующее: драйверы компилировались и запускались без ошибок, но при работе вели себя очень странно, пропуская команды от управляющих приложений, либо вообще игнорируя их. При этом тот же исходный код, собранный в среде ДДК вел себя корректно и имел меньший размер. Насколько мне известно, среду Visual C++ для разработки драйверов из профессиональных организаций не использует никто. Утилиты пользовательского режима, наоборот, пишут именно на ней. В этом пакете исходных кодов также можно найти файлы проектов Visual C++ с расширениями .dsp и .dsw.
Учитывая это, в этот раз я даже не пытался настроить студию, а сразу решил воспользовался средой ДДК.
Ставлю ДДК. Использую для этой цели "Windows IFS Kit and DDK 3790". Это - версия ДДК для разработчиков файловых систем, предназначенная для первой сборки 2003 сервера без сервиспаков.
Устанавливаю его в папку C:\WINDDK.
В меню Пуск выбираю Development Kits\Windows IFS Kit and DDK 3790\Build Environments\Windows Server 2003\Windows Server 2003 Free Build Environment. Появляется консольное окно. Ввожу команду cl, чтобы проверить версию компилятора. Выдается:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.2179 for 80x86
Запускаю командную строку Visual Studio 2008, чтобы убедиться, что компиляторы разные. Консоль среды студии выдает:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Сначала собираю минипорт. В консольном окне среды ДДК перехожу в папку c:\3dfx\Src\Video\Miniport\H5. Выполняю команду make. Выдаются сообщения о ходе компиляции вылазит первая ошибка:
c:\3dfx\Src\Video\Inc\VIDEO.H(126) : error C2220: warning treated as error - no object file generated
после этого идет еще несколько, но с ними позже (есть правило - всегда разбирайся только с первой ошибкой, остальные могли возникнуть из-за нее). Смысл сообщения: файл заголовка почему-то не создает объектный файл. Да он и не должен этого делать, но кто-то его попросил. Также заметно, что включена опция "Расценивать каждое предупреждение как ошибку". В принципе, так и надо делать, особенно для драйверов, но здесь для устранения надо очень глубоко копать. А 7.5 МБ исходных кодов (6 в драйвере, 1.5 в минипорте) - это даже не "Война и мир". Не буду углубляться, просто вырублю все предупреждения. В файле c:\3dfx\Src\Video\Miniport\H5\SOURCES комментирую 37 строку и отключаю вывод ошибок устанавливая ключ /W0 в добавленной 38 строке:
34: !IFNDEF MSC_WARNING_LEVEL 35: MSC_WARNING_LEVEL=/W3 36: !ENDIF 37: #MSC_WARNING_LEVEL=$(MSC_WARNING_LEVEL) /WX 38: MSC_WARNING_LEVEL=/W0
Выполняю make. Вылазит следующее сообщение, говорящее о том, что мэйкфайл ДДК был пересобран, но для компиляции нужно попробовать make еще раз:
Rebuilding objfre_wnet_x86\_objects.mac from .\sources .\i386\sources. objfre_wnet_x86\_objects.mac was rebuilt, please reinvoke NMAKE NMAKE : U1077: 'md' : return code '0x1'
Это предупреждение будет появлятся и в дальнейшем, каждый раз надо просто повторять команду make. Еще раз запускаю make. Ошибка:
c:\3dfx\Src\Video\Miniport\H5\KMVT.C(1942) : error C4296: '>=' : expression is always true
После чтения кода драйвера и определений ДДК выясняется, что в файле KMVT.C с непонятной целью был переопределен макрос NTSTATUS, который в обычных условиях заменяется на знаковый тип LONG, но в 38 строке этого файла он был переопределен на беззнаковый DWORD. В 1942 строке макрос NT_SUCCESS проверяет свой параметр, приводя его к типу NTSTATUS и сравнивая его с нулем при помощи оператора >=. Компилятор обнаруживает, что беззнаковый тип всегда соответствует этому условию и дает ошибку, говоря о бессмысленности проверки. С некоторых пор 4296 уже не предупреждение, а ошибка.
Здесь есть много путей устранения. Можно просто отключить эту ошибку, как я сделал ниже, при сборке основного драйвера. Но можно и исправить, вернув правильное определения NTSTATUS. Я не буду трогать переопределение вверху, т.к. в середине файла возможно есть код, подразумевающий, что NTSTATUS беззнаковый (м.б. в какой-то момент программисту не хватило 2 миллиардов положительных значений и он увеличил максимум до 4). Перед 1942 строкой вставляю еще одну:
#define NTSTATUS LONG if (!NT_SUCCESS(status)) { status = ERROR_DEV_NOT_EXIST; return status; }else { status = 1; return status; }
Теперь выдается следующее:
'rebase' is not recognized as an internal or external command, operable program or batch file.
Это дело нам знакомо. Ребэйз задает адрес загрузки модуля в память. Наверно, во времена w2kddk она входила в его состав, но потом ее выкинули, как и много других полезных вещей. Достану ее из Windows SDK 6.0A, входящего в комплект Visual Studio 2008. Программа находится в C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin. Переношу в папку C:\WINDDK\3790\bin\x86, где в ДДК лежат утилиты для сборки х86 драйверов.
Внесу изменения в rc-файл, содержащий строки, отображаемые при просмотре свойств драйвера. Нужно, чтобы убедиться, что используется именно мой драйвер. Меняю 36 строку файла VOODOO3.RC:
#define VER_COMPANYNAME_STR "Build by dE fENDER. 05.02.2010"
Выполняю make. Ошибок нет. Однако есть небольшой секрет. Если сборка проводилась путем отлаживания единичных ошибок, то успешное выполнение команды make здесь не создаст итоговый файл C:\3dfx\Src\Video\Miniport\H5\objfre_wnet_x86\i386\sys\3dfxvsm.sys. Вместо этого он будет находится уровнем выше и далеко не факт, что его код именно тот, что требуется. Поэтому перед финальным выполнением команды make я удалю папку objfre_wnet_x86 со всем содержимым. Теперь выполняю команду make и после успешной компиляции получаю требуемый файл C:\3dfx\Src\Video\Miniport\H5\objfre_wnet_x86\i386\sys\3dfxvsm.sys.
Теперь сборка основного драйвера.
В консольном окне ДДК перехожу в папку c:\3dfx\Src\Video\Displays\H5 и выполняю команду make. Первая ошибка:
c:\3dfx\Src\Video\Displays\H5\ENABLE.C(381) : error C2065: 'DDI_DRIVER_VERSION' : undeclared identifier
Смотрим код (в комментарии упоминается про Вистлер (т.е. Windows XP)). Ищем строку DDI_DRIVER_VERSION в папке с DDK, она обнаруживается в файле winddi, в комментарии, где сказано, что это определение было убрано и надо явно указывать то, которое поддерживается. Возьмем для него DDI_DRIVER_VERSION_NT5. Открываем файл c:\3dfx\Src\Video\Displays\H5\ENABLE.C и в 379 строке вносим следующие изменения:
// DDI version this driver was targeted for is passed back to engine. // Future graphic's engine may break calls down to old driver format. #define DDI_DRIVER_VERSION DDI_DRIVER_VERSION_NT5 if (cj >= sizeof(ULONG)) #ifndef MS_VIEW pded->iDriverVersion = DDI_DRIVER_VERSION; #else // Report new DDI_DRIVER_VERSION for Whistler pded->iDriverVersion = DDI_DRIVER_VERSION_NT5_01; #endif
Опять make в консоли окружения ДДК. Предыдущая ошибка исчезла, теперь имеем:
c:\3dfx\Src\Video\Displays\H5\D3INIT.C(1068) : error C4296: '<' : expression is always false
и аналогичные в файле D3RSTATE.C. Ошибка означает, что как и в минипорте делается попытка проверить допущение, что беззнаковая переменная может быть меньше нуля. Я просто отключу эту проверку. Для этого в начало файла D3GLOBAL.H вставлю строку:
#pragma warning( disable : 4296 )
Опять make. Теперь выдается:
axtrik.obj : fatal error LNK1164: section 0x1 alignment (4096) greater than /ALIGN value
Ищем /ALIGN. Не находим. В консольном выводе видно строку
-align:0x40 /stub:c:\WINDDK\3790\lib\wnet\stub512.com
Скорее всего, непорядок. В msdn говорится, что выравнивание должно быть степенью двойки и по умолчанию задано как 4096. Изучаю файлы, в конце-концов в файле SOURCE нахожу:
DRIVER_ALIGNMENT=0x40
Увеличиваю до:
DRIVER_ALIGNMENT=0x1000
Перед финальной сборкой также вношу изменения в файл RES.RC, изменяя 53 строку:
#define VER_COMPANYNAME_STR "Build by dE fENDER. 05.02.2010"
Ошибок больше нет. Но как и в случае с минипортом, перед финальной сборкой надо удалить папку C:\3dfx\Src\Video\Displays\H5\objfre_wnet_x86 со всем содержимым. После выполнения make создается требуемый файл C:\3dfx\Src\Video\Displays\H5\objfre_wnet_x86\i386\dll\3dfxvs.dll
Выполняю проверку. В драйвере SFFT заменяю файлы 3dfxvs.dll и 3dfxvsm.sys. Выбираю видеокарту в менеджере устройств и путем выполнения "Update Driver" устанавливаю обновленный драйвер:
Windows Update? "No, not this time." <Next>
What do you want? "Install from a list or specific location" <Next>
Please choose your search "Don't search. I will choose the driver to install" <Next>
Select the device driver <Have Disk>
Copy from: <C:\SFFT>
Show compatible hardware "3dfx Voodoo Series" <Next>
Могут спросить заменять ли драйверы - Да.
<Finish>
перезагрузка
Примечание: при первой попытке я не выбирал "Have disk", а просто указал поиск в папке с SFFT драйвером. При этом у меня стоял Amigamerlin. После перезагрузки можно было наблюдать, что драйвер обновился до SFFT, за исключением минипорта, который остался Amigamerlin'овским.
После перезагрузки захожу в менеджер устройств и удостоверяюсь, что используются именно мои сборки:

Количество загрузок:: 21
3dfx Tool на моей системе не устанавливаются, поэтому настройка затруднена. Никаких отличий от SFFT или Amigamerlin замечено не было. Ошибки на любых версиях драйверов одинаковы:
1. Невозможна одновременная работа с GeForce GTX 280. Причем если раньше на ХР одна из карт просто переходила в режим VGA, то теперь происходит зависание при загрузке или отсутствие сигнала на обоих видеокартах.
2. Очень медленная работа с полупрозрачными объектами. Наиболее заметно это проявляется в следующем: открываю Мой Компьютер, распахиваю его на весь экран и пытаюсь выделить все в окне. Перерисовка полупрозрачного прямоугольника при максимальном размере занимает несколько секунд.
Хотел приложить исходный и скомпилированный код, но загрузка архивов запрещена. М.б. потом доработаю весь код, чтобы избавиться от зависимости к SFFT и выложу все на SourceForge. А пока сниму Voodoo и заброшу ее опять на год в ящик.
#14
Отправлено 06 Февраль 2010 - 11:36

dE fENDER (6.2.2010, 4:37) писал:
dE fENDER (6.2.2010, 4:37) писал:
dE fENDER (6.2.2010, 4:37) писал:
#15
Отправлено 06 Февраль 2010 - 13:03
#16
Отправлено 06 Февраль 2010 - 13:11
Доработанный исходный код (1.69 МБ)
Скомпилированные файлы (211 КБ)
#17
Отправлено 06 Февраль 2010 - 13:22
#18
Отправлено 04 Февраль 2022 - 15:07
#19
Отправлено 04 Февраль 2022 - 16:23
#20
Отправлено 04 Февраль 2022 - 18:16