powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Handle модуля по адресу возврата
7 сообщений из 7, страница 1 из 1
Handle модуля по адресу возврата
    #35509781
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как узнать описатель модуля, процедура которого вызвала мою функцию.

Например: есть core.dll, есть много других модулей - a.dll, b.dll..., эти модули вызывают процедуру SomeFunc из core.dll. Как в SomeFunc узнать какой из модулей ее вызвал?

Необходимо найти решение под Win32 и под ДОС (Borland Pascal 7).
...
Рейтинг: 0 / 0
Handle модуля по адресу возврата
    #35514194
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, что получилось для NT:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
 function  GetRetAddr:pointer; assembler;
 asm 
  mov eax,[ebp+ 4 ];
 end ;


 function  AddrToModule_NT(Addr:pointer):THandle;
 type 
  PHandleList=^THandleList;
  THandleList= array [ 0 .. 32767 ]  of  THandle;
 var 
  PModList:PHandleList;
  MemSize,i:integer;
  Res:bool;
  MInfo:TModuleInfo;
 begin 
  Result:=INVALID_HANDLE_VALUE;
  MemSize:=SizeOf(THandle);
   repeat 
    GetMem(PModList,MemSize);
    Res:=EnumProcessModules(GetCurrentProcess,PModList^,MemSize,MemSize);
     if   not  Res  then  FreeMem(PModList);
   until  Res;
   try 
     for  i:= 0   to  (MemSize  div  SizeOf(THandle))- 1   do 
     begin 
       if   not  GetModuleInformation(GetCurrentProcess,PModList^[i],
        MInfo,SizeOf(MInfo))  then  RaiseLastWin32Error;
       with  MInfo  do 
       begin 
         if  (integer(Addr)>=integer(lpBaseOfDll))  and 
          (integer(Addr)<integer(lpBaseOfDll)+SizeOfImage)  then 
         begin 
          Result:=PModList^[i];
          exit;
         end 
       end ;
     end ;
   finally 
    FreeMem(PModList);
   end ;
 end ;

 function  GetCallerHandle:THandle; stdcall;
 begin 
  Result:=AddrToModule_NT(GetRetAddr);
 end ;

 function  GetCallerModuleName: string ; stdcall;
 var 
  H:THandle;
  Size:integer;
 begin 
  H:=AddrToModule_NT(GetRetAddr);
  SetLength(Result, 1024 );
  Size:=GetModuleBaseName(GetCurrentProcess,H,@Result[ 1 ],Length(Result));
   if  Size<> 0   then  Result:=copy(Result, 1 ,Size)  else  Result:='Unknown';
 end ;


Осталось придумать для 9х и ДОС. В ДОС сложнее - память сегментная...

Неужели никто не писал аналогичных штук?
...
Рейтинг: 0 / 0
Handle модуля по адресу возврата
    #35514330
Quartz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где это Вы в ДОСе нашли DLL???
...
Рейтинг: 0 / 0
Handle модуля по адресу возврата
    #35515219
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
QuartzГде это Вы в ДОСе нашли DLL???

Ну, например, в Borland Pascal 7, защищенный режим.

А что Вас смутило?
...
Рейтинг: 0 / 0
Handle модуля по адресу возврата
    #35515287
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064 QuartzГде это Вы в ДОСе нашли DLL???

Ну, например, в Borland Pascal 7, защищенный режим.

А что Вас смутило?Смутило то, что в ДОС нету стандарта на динамические библиотеки. Очень многие языковые системы в досовые времена использовали свои собственные варианты динамической подгрузки функций из внешних модулей. Но стандарта на это не было и каждый делал как ему казалось удобнее. Только с введением динамических библиотек в саму ОС это начало более-менее упорядочиваться.
Так что если тебе так сильно хочется решить эту задачу для BP7 - удачи. Но для Clipper5 ты будешь решать эту задачу еще раз с нуля. А потом реши эту же задачу для QuickBasic и опять с нуля. А потом... В общем до 2010-го работы тебе хватит.
...
Рейтинг: 0 / 0
Handle модуля по адресу возврата
    #35515290
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Смутило то, что в ДОС нету стандарта на динамические библиотеки. Очень многие языковые системы в досовые времена использовали свои собственные варианты динамической подгрузки функций из внешних модулей. Но стандарта на это не было и каждый делал как ему казалось удобнее. Только с введением динамических библиотек в саму ОС это начало более-менее упорядочиваться.

Совершенно верно - в ДОС стандарта небыло, зато стандарт NE появился для Win3.x, и именно этот стандарт использовал Борланд.

Так что если тебе так сильно хочется решить эту задачу для BP7 - удачи. Но для Clipper5 ты будешь решать эту задачу еще раз с нуля. А потом реши эту же задачу для QuickBasic и опять с нуля. А потом... В общем до 2010-го работы тебе хватит.

Хорошо, переформулирую задачу - необходимо узнать хэндл модуля по адресу возврата для Win16.
...
Рейтинг: 0 / 0
Handle модуля по адресу возврата
    #35516001
Quartz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... Попробуйте на WASM.ru лучше спросить... ИМХО там значительно больше системных программистов/хакеров/крякеров :) все же
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Handle модуля по адресу возврата
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]