Для чего в DLL дублируют некоторые функции

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 9 апр 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    167
    К некоторым функциям в конце имени добавляют постфикс (A) или (W)
    например:

    SetConsoleTitleA - функция заточенная под - ASCII
    SetConsoleTitleW - функция заточенная под - UNICODE

    Но есть функции которые есть и без постфиксов и с постфиксами
    Например в файле библиотеки - kernel32.dll
    есть девять таких функций
    например одна из них трёх-видовая функция

    lstrlen
    lstrlenA
    lstrlenW

    Понятно что Функция - lstrlenA заточена под - ASCII
    а Функция - lstrlenW заточена под - UNICODE

    но тогда не понятно для чего предназначена третья функция - lstrlen
    в чём смысл этой вродебы лишней функции

    Если кто в курсе разъясните пожалуйста
     
  2. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    Просто забыли убрать ))
     
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    167
    За оригинальный ответ большое спасибо
    У кого нибудь ещё есть мысли по этому поводу?
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    713
    [​IMG]
    Как видно из адресов - это просто продублированные ANSI функции.
     
  5. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    167
    Честно говоря не пойму где на вашей фотографии можно увидеть дублирование адресов функций - lstrlen и lstrlenA

    PS:

    Не большое пояснение почему я создал эту тему
    Ради интереса решил сделать небольшую програмку
    которая бы из файла линковки ну например - Kernel32.lib
    путём определённого анализа вытаскивала бы список прописанных там функций
    и на основе этих данных создавала бы одноимённый файл с прототипами к этим функциям - Kernel32.inc
    За основу взял файлы линковки из пакета - Microsoft Visual Studio 12.0
    По мимо записи прототипов к функциям программа записывает в созданный файл и константы для функций ASCII или UNICODE
    ну например когда программа находит функцию с постфиксом (A) например - lstrlenA
    она прописывает в файле константу - lstrlen equ <lstrlenA>
    И вот как раз из за этих дублированных функций компилятор и выдаёт ошибку
    потому что в файле уже прописана лексема (ассоциированное имя) прототип - lstrlen PROTO :DWORD
    Это конечно не проблема
    надо только подправить алгоритм программы
    Я просто хочу понять что лучше сделать
    или не прописывать константу - lstrlen equ <lstrlenA>
    и соответственно в файле оставлять прототип дублированной функции - lstrlen PROTO :DWORD
    или наоборот не прописывать прототип - lstrlen PROTO :DWORD
    а прописать только константу - lstrlen equ <lstrlenA>
    Если кому интересно
    ссылка на эту програмку (которая собирает файл прототипов но пока что с этой проблемой)
    программа запечатана в RAR с паролем - assch

    https://yadi.sk/d/36FtKfEW3GoKH6

    Если кто сомневается после распоковки можно проверить антивирусом
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    713
    Большинство функций просто дублируются, конкретно lstrlen просто прыгает на lstrlenA.
     
  7. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    Ну да, у неё адрес другой, не то что у функций выше, где совпадают адреса. А Вы отладчиком зайдите посмотрите.
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    Thetrik,

    Некоторые функции действительно дубль, обёртка. Но есть иное, так например lstrcmpi/lstrcmpiA/lstrcmpiW - общего тела у этих функций нет. Можно попробовать поискать сурец в 2k.
     
  9. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    167
    Большое спасибо за пояснение

    но насчёт большинства функций это наверное не соответствует истине
    потому что в библиотеке - Kernel32 их всего девять функций

    Ну и возвращаясь к посту № 5

    Чем лучше пожертвовать прототипом - lstrlen PROTO :DWORD

    или константой - lstrlen equ <lstrlenA>
     
    Последнее редактирование: 9 апр 2017
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    Код (Text):
    1. WINBASEAPI
    2. int
    3. WINAPI
    4. lstrcmpiA(
    5.     LPCSTR lpString1,
    6.     LPCSTR lpString2
    7.     );
    8. WINBASEAPI
    9. int
    10. WINAPI
    11. lstrcmpiW(
    12.     LPCWSTR lpString1,
    13.     LPCWSTR lpString2
    14.     );
    15. #ifdef UNICODE
    16. #define lstrcmpi  lstrcmpiW
    17. #else
    18. #define lstrcmpi  lstrcmpiA
    19. #endif // !UNICODE
    winbase.h
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.159
    Очевидно же, что это тянется для совместимости с софтом, который был написан во времена, когда A/W функций в винде еще не было. Как видно из примера инде, весь модный молодежный софт, который пишется с заголовками мс, будет юзать только A/W функции. И ты, assch, так делай.
     
  12. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    167
    Спасибо всем за участие в теме
    Решено
    Пожертвую прототипами "лишних" функций
     
  13. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    Я думаю, если зайти во внутрь lstrlen там будет выбор использовать lstrlenA или lstrlenW. В общем она универсальная.
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    yashechka,

    Нет, там будет либо A, либо W, в зависимости от опции сборки - смотрите дефейн в сурке выше. Не ясно только почему для lstrcmpi не просто стаб, а совсем иной код.
     
  15. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    713
    Что имеется в виду? К примеру у меня lstrcmpi/lstrcmpiA - одна и та же функция. Быстренько прошелся по всем строковым функциям - без постфикса это A версии функций.
    Имелось в виду из числа подобных функций.
     
  16. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.787
    Thetrik

    Я только глянул на своей системе, естественно они будут разными на разных сборках.
    [​IMG]

    [​IMG]
     

    Вложения:

    • 1x.png
      1x.png
      Размер файла:
      20,8 КБ
      Просмотров:
      853
    • 2x.png
      2x.png
      Размер файла:
      29,4 КБ
      Просмотров:
      770
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.333
    так уже есть dumpbin.exe :), достаточно написать bat-файл или через командную строку
    Код (Text):
    1. %masm32_path%\bin\dumpbin.exe /EXPORTS %windir%\system32\Kernel32.dll /OUT:Kernel32.txt
    получишь и имена, и ординалы, и адреса в памяти
     
  18. horpis_real

    horpis_real Active Member

    Публикаций:
    0
    Регистрация:
    5 дек 2016
    Сообщения:
    141
  19. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    horpis_real,

    Сегодня там уже была беседа автора по этому вопросу. Про ординалы. Я смотрел. Смотрел. :boast:
     
  20. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    167
    Если кому интересно выкладываю ссылку на исправленную програмку
    для сборки файлов с Ассемблерными прототипами и константами к функциям
    на основе данных файлов линковки - Microsoft Visual Studio 12.0
    Запечатана в - RAR пароль - assch

    https://yadi.sk/d/dYm_0L8d3GwmSQ