Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2011, 17:38   #1
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
Вопрос Как узнать загружена ли dll ?

Здравствуйте.Меня волнует вопрос.Можно ли как-то проверить загружена ли определённая dll в память.Желательно это сделать из другого процесса.
Мастак вне форума Ответить с цитированием
Старый 17.06.2011, 18:00   #2
fenryr
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 28
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, tlhelp32;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  type
  TModuleArray = array[0..400] of HMODULE;
  TModuleOption = (moRemovePath, moIncludeHandle);
  TModuleOptions = set of TModuleOption;

implementation



{$R *.dfm}

function GetLoadedDLLList(sl: TStrings;   hProcess : THandle ; Options: TModuleOptions = [moRemovePath]): Boolean;
type
EnumModType = function (hProcess: Longint; lphModule: TModuleArray;
cb: DWord; var lpcbNeeded: Longint): Boolean; stdcall;
var
psapilib: HModule;
EnumProc: Pointer;
ma: TModuleArray;
I: Longint;
FileName: array[0..MAX_PATH] of Char;
S: string;
begin
Result := False;
(* Данная функция запускается только для Widnows NT *)
if Win32Platform <> VER_PLATFORM_WIN32_NT then
Exit;
psapilib := LoadLibrary('psapi.dll');
if psapilib = 0 then
Exit;
try
EnumProc := GetProcAddress(psapilib, 'EnumProcessModules');
if not Assigned(EnumProc) then
Exit;
sl.Clear;
FillChar(ma, SizeOF(TModuleArray), 0);
if EnumModType(EnumProc)(hProcess, ma, 400, I) then
begin
for I := 0 to 400 do
if ma[i] <> 0 then
begin
FillChar(FileName, MAX_PATH, 0);
GetModuleFileName(ma[i], FileName, MAX_PATH);
if CompareText(ExtractFileExt(FileName), '.dll') = 0 then
begin
S := FileName;
if moRemovePath in Options then
S := ExtractFileName(S);
if moIncludeHandle in Options then
sl.AddObject(S, TObject(ma[I]))
else
sl.Add(S);
end;
end;
end;
Result := True;
finally
FreeLibrary(psapilib);
end;
end;


function findprocess (name : String) : THandle  ;
          var  hsnap : THandle;
              process : ProcessEntry32;
        begin
          Result := 0;
            process.dwSize := SizeOf (process);
               hsnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0 );
                  while ( Process32Next (hSnap, process)) do  Begin

          if  pos ( name , string(process.szExeFile)  )<> 0  then begin
               Result := OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
               if (Result <> 0)  then exit;
                end;
           end;
        end;
Например я хочу узнать, загружена ли библитека user32.dll в процесс firefox.exe
Код:
  procedure TForm1.Button1Click(Sender: TObject);
var list : TstringList ;
     hprocess : thandle;
begin
list :=  TstringList.Create;
 hprocess := findprocess('firefox.exe');
GetLoadedDLLList(list , hprocess , [moIncludeHandle, moRemovePath]);
if list.IndexOf('user32.dll') <> -1 then ShowMessage ('Загружена')
else showmessage ('не загружена');

list.Free;
end;
fenryr вне форума Ответить с цитированием
Старый 18.06.2011, 14:15   #3
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
По умолчанию

Воспользовавшись данным кодом (спасибо автору) порылся в интернете чтобы преобразовать текст на свой язык программирования и сделал прогу типа такой.
Тут на си ++, но почти идентична моей:
http://spyrytus.profeo.ua/blog/view/100005084/

И получил такой результат :

Как видно приложение определяется правильно.Но модули которые он показывает совсем не те что применялись в моей проге, только часть совпадает. Это так и должно быть ? (Я подчеркнул модули которые применял наверху, а те которые прога определила внизу)
Такое ощущение что модули как будто другого приложения.

В общем вопрос такой.Есть функция LoadLibrery, так вот она прежде чем загружать длл проверяет какой-то счётчик или где-то по таблице какой-то смотрит загружена ли раньше была эта длл. Может есть какой-то простой способ, функция , чтобы узнать загружена ли данная длл вообще в системе ? Не важно для какого процесса.
Мастак вне форума Ответить с цитированием
Старый 18.06.2011, 14:17   #4
*PB*
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 558
По умолчанию

Цитата:
Сообщение от Мастак Посмотреть сообщение
Здравствуйте.Меня волнует вопрос.Можно ли как-то проверить загружена ли определённая dll в память.Желательно это сделать из другого процесса.
Вариант программы на PureBasic
Код:
Procedure GetDLL(ListIcon)
  Protected szProcessName.s, szProcessPath.s, dwDllAddress, szDLLName.s, szDLLPath.s
  Protected dwProcessPID, dwhIcon, hIco
  ClearGadgetItems(ListIcon)
  ExamineProcesses()
  While NextProcess()
    szProcessName = GetProcessName()
    dwProcessPID  = GetProcessPID()
    If szProcessName And dwProcessPID
      FileName.s=GetProcessFileName(dwProcessPID)
      AddGadgetItem(ListIcon,-1,Hex(dwProcessPID) +Chr(10) + szProcessName +Chr(10) + FileName)
      SetGadgetItemColor(ListIcon, CountGadgetItems(ListIcon)-1, #PB_Gadget_BackColor, $D9FFD9) 
    EndIf
    ExamineProcessDLLS(dwProcessPID)
    While NextProcessDLL()
      dwDllAddress = GetProcessDLLBase(dwProcessPID)
      szDLLName = GetProcessDLLName(dwProcessPID)
      DLL_Path.s= GetProcessDLLFileName(dwProcessPID)
      If LCase(GetExtensionPart(szDLLName))="dll"
        AddGadgetItem(ListIcon, -1,Hex(dwDllAddress) +Chr(10) + szDLLName+ Chr(10) + DLL_Path)
      EndIf
    Wend 
  Wend 
EndProcedure 

If OpenWindow(0, 0, 0, 570, 240, "Список загруженных DLL", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  ListIconGadget(0, 10, 10, 550, 220, "Адрес/PID", 80, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
  AddGadgetColumn(0,1,"Имя", 132)
  AddGadgetColumn(0,2,"Путь к файлу", 300)
  GetDLL(0)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Программа отображает список процессов, загруженных dll и их адреса в памяти, а так же пути к файлам.

Скомпилированный EXEшник во вложении.
Вложения
Тип файла: rar Get_DLL.rar (15.1 Кб, 79 просмотров)

Последний раз редактировалось *PB*; 18.06.2011 в 14:29.
*PB* вне форума Ответить с цитированием
Старый 18.06.2011, 14:55   #5
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
По умолчанию

Странно.Но эта программа показывает то же самое )))


Что-то, как-то тут разбираться надо. Спасибо всем кто откликнулся. Наверное придётся разбираться самому )))
Мастак вне форума Ответить с цитированием
Старый 18.06.2011, 16:00   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Кроме тех, что вы явно указываете в коде, к вашей проге грузятся: системные (msctf, IME, ...), разные хелперы и хуки, длл-ки нужные для других длл,...
p51x вне форума Ответить с цитированием
Старый 07.07.2012, 05:48   #7
mishka1
 
Регистрация: 05.12.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от fenryr Посмотреть сообщение
Код:
EnumProc := GetProcAddress(psapilib, 'EnumProcessModules');
EnumProcessModules() давным-давно вшита в PsAPI.pas
mishka1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
idhttp как узнать что страница скачана/загружена до конца? Alar Работа с сетью в Delphi 10 29.03.2011 16:31
как узнать что страница в WebBrowser загружена designer999 Работа с сетью в Delphi 2 05.05.2010 21:12
DLL!!!Как узнать что PUSH-ит!!! Kuznecov Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 10.02.2009 22:04
Узнать какая страница загружена. Port 111 Работа с сетью в Delphi 6 14.01.2009 22:26
Как узнать имена функций из DLL? komex Общие вопросы Delphi 9 05.03.2008 16:55