информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Где водятся OGRыАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Вообще-то может 09.01.03 15:37  Число просмотров: 964
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Есть несколько вариантов:
1) Смотреть на стеке адрес возврата и определять какому модулю он принадлежит (обработчик int 2e так и делает)
2) Задуматься над тем, почему при регистрации любых колбэков в Win32 API один из параметров HINSTANCE, который может быть любым числом. Короче, если уж все dll-ки твои: и та что с колбякой и те что ее юзают, почему бы не добавить еще один параметр - в котором вызывающая dll-ка будет "представляться"
<programming>
[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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach