информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медЗа кого нас держат?Сетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] DLL Instance 09.01.03 11:21  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Моя прога делает LoadLibrary нескольким DLL. Передает этим DLL адрес одной и той же процедурки (callback в общем). Все эти DLL эту процедурку время от времени вызывают. Вопрос: может ли процедурка определить какая конкретно DLL ее вызвала?
Вообще-то может 09.01.03 15:37  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Есть несколько вариантов:
1) Смотреть на стеке адрес возврата и определять какому модулю он принадлежит (обработчик int 2e так и делает)
2) Задуматься над тем, почему при регистрации любых колбэков в Win32 API один из параметров HINSTANCE, который может быть любым числом. Короче, если уж все dll-ки твои: и та что с колбякой и те что ее юзают, почему бы не добавить еще один параметр - в котором вызывающая dll-ка будет "представляться"
[Win32] DLL Instance 16.01.03 12:51  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Есть несколько вариантов:
> 1) Смотреть на стеке адрес возврата и определять какому
> модулю он принадлежит (обработчик int 2e так и делает)

Насколько правильно вот это:

var
Instance: HINST;
asm
mov eax,[ebp+4]
xor ax,ax
mov Instance,eax
end;

Вроде работает. Но есть ли гарантия, что это правильно в 100% случаев?
[Win32] No warranty :-))) 16.01.03 14:48  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Насколько правильно вот это:
>
> var
> Instance: HINST;
> asm
> mov eax,[ebp+4]
> xor ax,ax
> mov Instance,eax
> end;
>
> Вроде работает. Но есть ли гарантия, что это правильно в
> 100% случаев?

Первая проблема, которая приходит на ум: несколько вызовов из разных мест одной dll-ки будут иметь разные инстансы. Вообще я имел в виду, что по адресу на стеке получать модуль, которому этот адрес принадлежит. Но это не слишком хороший способ. Лучше примерно так:

typedef int (*PCALLBACK_PROC)(HINSTANCE, ...); // Вместо точек любая другая инфа typedef struct _CALLBACK_INSTANCE { LIST_ENTRY Link; // Всякая другая чушь... PCALLBACK_PROC func; HINSTANCE inst; } CALLBACK_INSTANCE, PCALLBACK_INSTANCE; RegisterCallback(HINSTANCE hinst, CALLBACK_PROC func) { // ... PCALLBACK_INSTANCE pci = (PCALLBACK_INSTANCE)malloc(sizeof(CALLBACK_INSTANCE)); if (pci == NULL) goto fail; pci->inst = hinst; pci->func = func; } А вызывать: pci->func(pci->hinst, ...)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach