Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хендл KERNEL32 [D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2 3

-SeM- ©   (2004-11-23 12:17:00) 

Как узнать хендл (адрес загрузки) kernel32.dll без использования API?
Можно ли со 100% уверенностью ожидать ее загрузки по $BFF60000? Или могут быть иные случаи?


-SeM-   (2004-11-24 16:52:00) [21]

Leonid Troyanovsky   (24.11.04 10:58) [20]


> Так что, можешь смело пользовать GetModuleHandle

Да не могу. Он же сидит в кернел, адрес которого и хочу определить. Нет у меня ни одного импорта (и ExitProcess тоже).


Leonid Troyanovsky   (2004-11-24 10:58:00) [22]


> -SeM-   (23.11.04 17:33) [15]

> Хм... Хендл которой все равно нужно как-то узнать. Ведь
> адрес ее загрузки, наверное, тоже не фиксирован...



http://groups.google.com/groups?selm=emFadfYyDHA.2720%40TK2MSFTNGP09.phx.gbl

Как, собс-но, и kernel32.dll, о чем некогда рассказывал Slava Usov.

Так что, можешь смело пользовать GetModuleHandle,
во всяком случае, в Win32.

--
С уважением, LVT.


Digitman   (2004-11-24 08:26:00) [23]


> -SeM-   (23.11.04 17:53) [17]


kernel32 ведь как правило всегда загружается одним из первых модулей, поэтому и адрес его загрузки как правило равен предпочтительному адресу, фигурирующему в PE-заголовке


n0name   (2004-11-23 19:28:00) [24]

http://delphimaster.ru/cgi-bin/forum.pl?id=1100098886&n=5


-SeM-   (2004-11-23 17:53:00) [25]

Игорь Шевченко ©   (23.11.04 17:43) [16]

Но как сказали мне выше адрес загрузки кернел

> зависит и от конкретной ОС-платформы и от версии kernel32

а хотелось попроще (к примеру [8])


Игорь Шевченко   (2004-11-23 17:43:00) [26]

-SeM-   (23.11.04 17:33) [15]

Адрес загрузки NTDLL.DLL можно узнать, проанализировав заголовок PE-файла на диске. Эта библиотека всегда грузится по одному и тому же адресу.
Но я не понимаю, какой смысл - под NT NTDLL.DLL у тебя всегда есть, Kernel32.dll у тебя всегда есть.


-SeM-   (2004-11-23 17:33:00) [27]

Игорь Шевченко ©   (23.11.04 17:24) [14]

Хм... Хендл которой все равно нужно как-то узнать. Ведь адрес ее загрузки, наверное, тоже не фиксирован...

Ладно, спасибо всем. Буду продолжать с [4]


Игорь Шевченко   (2004-11-23 17:24:00) [28]

-SeM-   (23.11.04 17:07) [10]

За 9x не скажу ничего. За NT могу сказать - NTDLL.DLL экспортирует функцию LdrGetDllHandle, которая выполняется те же самые действия, что и GetModuleHandle. Под NT в адресное пространство любого приложения загружена NTDLL.DLL


-SeM-   (2004-11-23 17:22:00) [29]

Digitman ©   (23.11.04 17:15) [11]

Да я не отказываюсь :) Спасибо. Просто а вдруг еще есть варианты


-SeM-   (2004-11-23 17:21:00) [30]

Digitman ©   (23.11.04 17:15) [11]

Да я не отказываюсь :) Спасибо. Просто а вдруг еще есть варианты


Digitman   (2004-11-23 17:15:00) [31]


> -SeM-   (23.11.04 17:07) [10]


в Win9x тоже есть PEB .. ищи инфу ...

а по поводу использования для этой цели PEB на НТ-платформе тебе уже сказано в [4]


-SeM-   (2004-11-23 17:07:00) [32]

Игорь Шевченко ©   (23.11.04 16:56)

Игорь, извините, но что Вы можете сказать по сабжу. Может есть другие варианты определения хендла кернела для 9х/NT?


Игорь Шевченко   (2004-11-23 16:56:00) [33]


> При старте ехе указатель стека содержит адрес из кернел
> (оставляет наверное загрузчик). Всегда ли это так


Под Win9x скорее всего, всегда. Под NT адресв стеке, скорее всего будет в NTDLL.DLL. Это не загрузчик, а функция CreateThread.


-SeM-   (2004-11-23 15:13:00) [34]

Digitman ©   (23.11.04 14:35) [7]

Ок. Спасибо. Буду пробовать.
А для 9х какие-нибудь решения есть?

Тут еще мысль возникла. При старте ехе указатель стека содержит адрес из кернел (оставляет наверное загрузчик). Всегда ли это так (другого увидеть мне не удалось), можно ли его как-то использовать?


Digitman   (2004-11-23 14:35:00) [35]

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


-SeM-   (2004-11-23 13:53:00) [36]

Digitman ©   (23.11.04 13:36) [4]

> как видишь, никаких API-вызовов нет и в помине


>    if hModule <> THandle(lpModule) then
>      hModule := GetModuleHandle(lpModule);


А GetModuleHandle что-то свое или из кернел?


clickmaker   (2004-11-23 13:38:00) [37]


>  [3] -SeM-   (23.11.04 13:01)
> Digitman ©   (23.11.04 12:27)
>
> Всегда ли кернел имеет самый большой адрес загрузки?

нет


Digitman   (2004-11-23 13:36:00) [38]


> -SeM-


вот "скелет" решения задачи :


TModuleInfo = packed record
  DllBase          : Pointer;
  EntryPoint       : Pointer;
  SizeOfImage      : Cardinal;
  FullDllName      : TUNICODE_STRING;
  BaseDllName      : TUNICODE_STRING;
  Flags            : Cardinal;
  LoadCount        : Word;
  TlsIndex         : Word;
  HashLinks        : TLIST_ENTRY;
  SectionPointer   : Pointer;
  CheckSum         : Cardinal;
  TimeDateStamp    : Cardinal;
  LoadedImports    : Pointer;
  EntryPointActivationContext : Pointer;
end;
PModuleInfo = ^TModuleInfo;

function FindModuleInfo(hModule: THandle): PModuleInfo;
var
 Peb: PPeb;
 pLdrData : PPEB_LDR_DATA;
 pLoadOrderList : PPLIST_ENTRY;
 pInLoadModuleEntry: PModuleEntry;
begin
 Result := nil;
 if hModule = 0 then Exit;
 Peb := GetCurrentPeb;
 LockLoader(Peb);
 try
   pLdrData := Peb^.LdrData;
   pLoadOrderList := @pLdrData.InLoadOrderModuleList;
   pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
   while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
     begin
       Result := @pInLoadModuleEntry.ModuleInfoData;
       if Result^.DllBase = Pointer(hModule) then
         Exit;
       pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
     end;
   Result := nil;
 finally
   UnLockLoader(Peb);
 end;
end;

function GetModuleInfo(lpModule: PChar; out ModuleInfo: TModuleInfo): Boolean;
var
 peb: PPeb;
 hModule: THandle;
 pLdrData : PPEB_LDR_DATA;
 pLoadOrderList : PPLIST_ENTRY;
 pInLoadModuleEntry: PModuleEntry;
 pModuleNfo: PModuleInfo;
begin
 Result := False;
 if not Assigned(lpModule) then Exit;
 peb := GetCurrentPeb;
 LockLoader(Peb);
 try
   hModule := FindHInstance(lpModule);
   if hModule = 0 then Exit;
   if hModule <> THandle(lpModule) then
     hModule := GetModuleHandle(lpModule);
   if hModule = 0 then Exit;
   pLdrData := peb^.LdrData;
   pLoadOrderList := @pLdrData.InLoadOrderModuleList;
   pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
   while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
     begin
       pModuleNfo := @pInLoadModuleEntry.ModuleInfoData;
       if pModuleNfo^.DllBase = Pointer(hModule) then
         begin
           if Assigned(@ModuleInfo) then
             ModuleInfo := pModuleNfo^;
           Result := True;
           Break;
         end;
       pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
     end;
 finally
   UnLockLoader(Peb);
 end;
end;


как видишь, никаких API-вызовов нет и в помине, однако база требуемого модуля, если он присутствует в тек.АП, замечательно определяется

не приведенные здесь описания используемых структур можно поиметь, например, в книге Свена Шрайбера "Недок. возможности Винтукея"

приведенный "скелет" касаем  только НТ-линейки


-SeM-   (2004-11-23 13:01:00) [39]

Digitman ©   (23.11.04 12:27)

Всегда ли кернел имеет самый большой адрес загрузки? Если да, с какого адреса производить поиск (вниз кратно $00010000) сигнатуры РЕ?


-SeM-   (2004-11-23 12:49:00) [40]

Digitman ©   (23.11.04 12:27) [1]

> может, не ту траву куришь ..

Да другой просто нет :)

Прога без использования импорта может использовать API. Т.е. предложеный тобой вариант - наверное не подходит, т.к. нет подгруженых модулей. Как быть?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо