Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.04.2011, 19:21
BigNik BigNik вне форума
Прохожий
 
Регистрация: 19.04.2011
Сообщения: 1
Репутация: 10
Восклицание Как определить какие DLL загружены чужим приложением

Короче задача такая:
1. Перебрать все системные процессы. Это можно сделать так:
Код:
procedure CreateWinNTProcessList(List: TstringList);    
var    
  PIDArray: array [0..1023] of DWORD;    
  cb: DWORD;    
  I: Integer;    
  ProcCount: Integer;    
  hMod: HMODULE;    
  hProcess: THandle;    
  ModuleName: array [0..300] of Char;    
begin    
  if List = nil then Exit;    
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);    
  ProcCount := cb div SizeOf(DWORD);    
  for I := 0 to ProcCount - 1 do    
  begin    
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or    
      PROCESS_VM_READ,    
      False,    
      PIDArray[i]);    
    if (hProcess <> 0) then    
    begin    
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);    
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));    
      List.Add(ModuleName);    
      CloseHandle(hProcess);    
    end;    
  end;    
end;    
2. Перебрать с первого по последний процесс и посмотреть, у какого какие длл-ки запущены.
Вот функция для определения всех выгруженных длл !!!В СИСТЕМЕ!!!:
Код:
unit ModuleProcs;    
    
interface    
    
uses Windows, Classes;    
    
type    
  TModuleArray = array[0..400] of HMODULE;    
  TModuleOption = (moRemovePath, moIncludeHandle);    
  TModuleOptions = set of TModuleOption;    
    
function GetLoadedDLLList(sl: TStrings;    
  Options: TModuleOptions = [moRemovePath]): Boolean;    
    
implementation    
    
uses SysUtils;    
    
function GetLoadedDLLList(sl: TStrings;    
  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)(GetCurrentProcess, 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;    
    
end.   
3.Посмотреть, если у какого-то приложения запущена dll с именем DLLName, то узнать имя этого процесса (имя exe) и убить этот процесс.
Функция для убивания процесса по имени exe:
Код:
uses    
  Tlhelp32, Windows, SysUtils;    
    
function KillTask(ExeFileName: string): integer;    
const    
  PROCESS_TERMINATE=$0001;    
var    
  ContinueLoop: BOOL;    
  FSnapshotHandle: THandle;    
  FProcessEntry32: TProcessEntry32;    
begin    
  result := 0;    
    
  FSnapshotHandle := CreateToolhelp32Snapshot    
                     (TH32CS_SNAPPROCESS, 0);    
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);    
  ContinueLoop := Process32First(FSnapshotHandle,    
                                 FProcessEntry32);    
    
  while integer(ContinueLoop) <> 0 do    
  begin    
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =    
         UpperCase(ExeFileName))    
     or (UpperCase(FProcessEntry32.szExeFile) =    
         UpperCase(ExeFileName))) then    
      Result := Integer(TerminateProcess(OpenProcess(    
                        PROCESS_TERMINATE, BOOL(0),    
                        FProcessEntry32.th32ProcessID), 0));    
    ContinueLoop := Process32Next(FSnapshotHandle,    
                                  FProcessEntry32);    
  end;    
    
  CloseHandle(FSnapshotHandle);    
end;  
Админ: Учимся пользоваться тегами по назначению!

КАК ЭТО ВСЁ СКЛЕПАТЬ ВМЕСТЕ И ЗАСТАВИТЬ РАБОТАТЬ???
P.S. с апи работаю недолго поэтому и прошу помощи.

Последний раз редактировалось Admin, 19.04.2011 в 21:15.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:59.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025