Имя файла, вызывающего функцию из dll
От: emike  
Дата: 10.10.02 06:57
Оценка:
Есть dll-библиотека с экспортируемой функцией. Как узнать имя файла, вызвавшего эту функцию? Причем вызывать ее может как exe-файл, так и другая dll-библиотека. С exe файлом проблем нет, но вот как быть с dll...
Re: Имя файла, вызывающего функцию из dll
От: TK Лес кывт.рф
Дата: 10.10.02 06:59
Оценка:
Здравствуйте emike, Вы писали:

E>Есть dll-библиотека с экспортируемой функцией. Как узнать имя файла, вызвавшего эту функцию? Причем вызывать ее может как exe-файл, так и другая dll-библиотека. С exe файлом проблем нет, но вот как быть с dll...


Посмотреть куда указывает адрес возврата. И по нему определить какой модуль там расположен.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Имя файла, вызывающего функцию из dll
От: emike  
Дата: 10.10.02 07:19
Оценка:
Здравствуйте TK, Вы писали:

TK>Здравствуйте emike, Вы писали:


E>>Есть dll-библиотека с экспортируемой функцией. Как узнать имя файла, вызвавшего эту функцию? Причем вызывать ее может как exe-файл, так и другая dll-библиотека. С exe файлом проблем нет, но вот как быть с dll...


TK>Посмотреть куда указывает адрес возврата. И по нему определить какой модуль там расположен.


Спасибо! Последний вопрос — а как определить адрес возврата?
Re[3]: Имя файла, вызывающего функцию из dll
От: Алекс Россия http://wise-orm.com
Дата: 10.10.02 07:35
Оценка:
Здравствуйте emike, Вы писали:

E>Здравствуйте TK, Вы писали:


хъ

E>Спасибо! Последний вопрос — а как определить адрес возврата?


Можно в начале функции поставить так:
    DWORD retaddr;
    __asm mov eax,[ebp+4];
    __asm mov retaddr,eax


хотя за результат я не ручаюсь.
Re[3]: Имя файла, вызывающего функцию из dll
От: Andrew S Россия http://alchemy-lab.com
Дата: 10.10.02 07:38
Оценка:
... Или сделать naked переходник.. из которого потом и вызывать данную функцию...


Здравствуйте emike, Вы писали:

E>Здравствуйте TK, Вы писали:


TK>>Здравствуйте emike, Вы писали:


E>>>Есть dll-библиотека с экспортируемой функцией. Как узнать имя файла, вызвавшего эту функцию? Причем вызывать ее может как exe-файл, так и другая dll-библиотека. С exe файлом проблем нет, но вот как быть с dll...


TK>>Посмотреть куда указывает адрес возврата. И по нему определить какой модуль там расположен.


E>Спасибо! Последний вопрос — а как определить адрес возврата?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Имя файла, вызывающего функцию из dll
От: Sergey Россия  
Дата: 10.10.02 10:15
Оценка:
Здравствуйте Алекс, Вы писали:

E>>Спасибо! Последний вопрос — а как определить адрес возврата?


А>Можно в начале функции поставить так:

А>
А>    DWORD retaddr;
А>    __asm mov eax,[ebp+4];
А>    __asm mov retaddr,eax
А>


А>хотя за результат я не ручаюсь.


И написать перед функцией (если компилятор — MSVC)

#pragma optimize( "y", off )

Чтоб оптимизатор установку ebp не поскипал.

Или, как уже говорили, использовать __declspec( naked ) и смотреть не на ebp, а на esp.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Имя файла, вызывающего функцию из dll
От: Alex Fedotov США  
Дата: 10.10.02 11:24
Оценка: 9 (2)
Здравствуйте emike, Вы писали:

E>Спасибо! Последний вопрос — а как определить адрес возврата?


В Visual C++ достаточно свежей версии можно использовать intrinsic _ReturnAddress.

extern "C" void * _ReturnAddress();
#pragma intrinsic(_ReturnAddress)

void MyFunction()
{
    MEMORY_BASIC_INFORMATION mem;
    TCHAR szCallerName[MAX_PATH];

    if (!VirtualQuery(_ReturnAddress(), &mem, sizeof(mem)))
        // error handling here

    _ASSERTE(mem.AllocationBase != NULL);
    GetModuleFileName((HINSTANCE)mem.AllocationBase, szCallerName, MAX_PATH);
}
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.