Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2014, 23:00   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос DLL. Экспортируемые функции с @n на конце. Что к чему?

Доброго времени суток!

Перевожу кучку сишных заголовочников под паскаль.
Все вроде, ок.. пока не начал делать загрузку библиотеки:
Код:
  hLib := LoadLibrary(PChar(sLibraryLocation));
  if (hLib <> 0) then
  begin
    try
      // Paranoid checks...
      //_RtlGetLastError@0 index 43 .rdata $00012350

      @__TRTLGetLastError := GetProcAddress(hLib, PChar('_RtlGetLastError@0'));
      { if not Assigned(__TRTLGetLastError) then
        exit; }

     //__TRTLGetLastError указывает на адрес функции.

      @__TLhInstallHook := GetProcAddress(hLib, PChar('LhInstallHook'));
      if not Assigned(__TLhInstallHook) then
        exit;
           //__TLhInstallHook = NULL и DLL выгружается.
Обычно имя функции <=> имени экспортируемй функции.. ан нет.
Почему-то формат такой:
_<Имя>@<число>

и @<число> очень напрягает, они там разные, не совпадают с порядковым номером экспорта. Очень думается, что при пересборке библиотеки этот n изменится и GetProcAddress вернет мне NULL.

Что это и почему так?

Может кусок определения поможет, я малость не понимаю что к чему:
Код:
#ifdef LIBHOOK_EXPORTS
    #define LIBHOOK_API						__declspec(dllexport) __stdcall
	#define DRIVER_SHARED_API(type, decl)		EXTERN_C type LIBHOOK_API decl
#else
    #ifndef DRIVER
        #define LIBHOOK_API					__declspec(dllimport) __stdcall
		#define DRIVER_SHARED_API(type, decl)	EXTERN_C type LIBHOOK_API decl
    #else
        #define LIBHOOK_API					__stdcall
		#define DRIVER_SHARED_API(type, decl)	typedef type LIBHOOK_API PROC_##decl; EXTERN_C type LIBHOOK_API decl
    #endif
#endif
Сейчас переменная DRIVER пока отключена.

Последний раз редактировалось Человек_Борща; 27.10.2014 в 23:05.
Человек_Борща вне форума Ответить с цитированием
Старый 27.10.2014, 23:15   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
и @<число> очень напрягает, они там разные, не совпадают с порядковым номером экспорта
А с чего ему совпадать, если это размер аргументов?..
p51x вне форума Ответить с цитированием
Старый 27.10.2014, 23:45   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
А с чего ему совпадать, если это размер аргументов?..
т.е. перекомпиляция dll не попоротит имена существующих функций?

Посмотрел... сомнительно что это кол-во аргументов:
_LhIsThreadIntercepted@12
Код:
  TLhIsThreadIntercepted = function(InHook: pTracedHookHandle;
    InThreadID: ULONG; OutResult: PBOOL): NTSTATUS stdcall;
Может их суммарный размер?

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

Последний раз редактировалось Человек_Борща; 27.10.2014 в 23:57.
Человек_Борща вне форума Ответить с цитированием
Старый 28.10.2014, 07:28   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Посмотрел... сомнительно что это кол-во аргументов:
Цитата:
Может их суммарный размер?
Цитата:
А с чего ему совпадать, если это размер аргументов?..
Кто-то не проснулся сегодня? Я ж написал РАЗМЕР аргументов.
p51x вне форума Ответить с цитированием
Старый 28.10.2014, 09:50   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Это относится к stdcall функциям.
Если делать все в cdecl, тогда имя функции будет экспортироваться как _ИмяФункции.

Кроме того, можно воспользоваться def файлом и указать какую функцию под каким именем экспортировать.
waleri вне форума Ответить с цитированием
Старый 28.10.2014, 13:50   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Кроме того, можно воспользоваться def файлом и указать какую функцию под каким именем экспортировать.
В Delphi это можно?

хотя беда всеравно... я динамически DLL гружу.
Цитата:
Если делать все в cdecl
Библиотека их так должна экспортировать? нет, не подходит.
Или я могу указать их так импортировать?

Последний раз редактировалось Человек_Борща; 28.10.2014 в 13:54.
Человек_Борща вне форума Ответить с цитированием
Старый 28.10.2014, 14:42   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
В Delphi это можно?

хотя беда всеравно... я динамически DLL гружу.

Библиотека их так должна экспортировать? нет, не подходит.
Или я могу указать их так импортировать?
в Делфи вы можете писать как импортировать(с каким именем и с каким соглашением вызова)
экпортировать вам проще через DEF чтоб было строгое имя, которое точно будете знать,а не искать потом его
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отладка. Что к чему не пойму. Антон0608 Помощь студентам 13 23.03.2014 19:34
winSock/ Поясните что к чему Чайничек. Работа с сетью в Delphi 1 30.06.2013 13:20
cgi что к чему mar4elo PHP 5 13.02.2011 14:47
Получить экспортируемые из DLL функции Memfis1992 Общие вопросы Delphi 5 30.10.2010 13:24
Генератор слов - что к чему? Ramal Общие вопросы Delphi 8 16.07.2009 01:11