wglGetProcAddress из DLL

Тема в разделе "WASM.WIN32", создана пользователем murder, 16 июл 2020.

  1. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Пишу враппер для старенькой игры. Рендер там программный, вывод на экран через BitBlt, в общем захотелось прикрутить этот шейдер. Поправил таблицу импорта, заменив GDI32 на свою либу. Далее инициализировал контекст OpenGL - всё прошло успешно и пытаюсь получить указатель на glCreateProgram через wglGetProcAddress, но в ответ получаю, что такой функции нет. Хорошо - собираю exe с этим кодом и получаю указатель без проблем. Далее интереснее: лезу в wglGetProcAddress отладчиком и вижу, что оно просматривает TEB в той области, которая в офф. доке называется Reserved3, чего-то там проверяет и если функция вызвана из dll - вызывает один код поиска wgl-функций (в нём только 7 wgl-функций), а если из exe - другой.
    1.png
    Кто знает чего ему надо? Теперь что - только патчить exe и ни каких врапперов?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Там ничего не написано про такое поведение. Кстати выяснилось вот что: если инициализацию контекста проводить из exe, то потом wglCreateContext отрабатывает нормально даже из dll. Дальнейшая отладка показала, что корень зла содержится в ChoosePixelFormat если вызывать из exe - оно возвращает 7, если из dll - 0ССh.
    --- Сообщение объединено, 17 июл 2020 ---
    Вызвал DescribePixelFormat для двух случаев:

    1.png

    далее путём нехитрых вычислений (32892 xor 33317
    )and 32892
    выяснил, что при вызове из dll pixelformat выбирается с флагами PFD_GENERIC_FORMAT+PFD_DRAW_TO_BITMAP+PFD_SUPPORT_GDI, флаг PFD_SUPPORT_OPENGL конечно же не установлен, поэтому wglGetProcAddress не возвращает нужные указатели.
    --- Сообщение объединено, 17 июл 2020 ---
    Нашёл свободное место в секции ресурсов, пометил её как секцию кода и запихал туда вызов ChoosePixelFormat результат тот же что и при вызове из DLL. Короче если вызывать
    ChoosePixelFormat не из базовой секции кода (та, что указана в BaseOfCode) - будет вот так. Но ПОЧЕМУ? Кастанеда MSDN об этом ничего не писал!
    --- Сообщение объединено, 17 июл 2020 ---
    Фу ой - у меня в заголовочнике к фасму были не правильно определены константы PFD_XXX. В общем там было так
    Код (Text):
    1. PFD_SUPPORT_OPENGL=20
    а должно быть так
    Код (Text):
    1. PFD_SUPPORT_OPENGL=20h
    Причём я проверял их и не заметил, что "h" не хватает... EXE собирал в Delphi - вот там и работало нормально. Мама говорит я особенный...