| 
| 
 | Вопрос # 5 215/ вопрос решён / | 
 |  Короче задача такая: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. с апи работаю недолго поэтому и прошу помощи.
 
|  |   Вопрос задал: BigNik (статус: 1-ый класс)Вопрос отправлен: 19 апреля 2011, 20:37
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Надо всё запихать в один модуль (не обязательно). Затем создать 2 TStringList. Первый скормить процедуре CreateWinNTProcessList(). Затем организовать цикл по его содержимому, скармливая в каждую итерацию 2й TStringList функции GetLoadedDLLList(). Во 2-м списке будут имена DLL-ок. Далее, с помощью метода TStrings.IndexOf() узнавать, есть ли в списке нужная DLL, и если есть, убивать процесс из 1-го TStringList функцией KillTask().
 Ну, вот, типа как-то так.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 19 апреля 2011, 20:50
 Оценка за ответ: 4
 Комментарий к оценке: Спасибо за ответ! Я себе где-то так и представлял, но функция GetLoadedDLLList() получает инфу о длл выгруженых во всей системе, я так понял. (по описанию функции, она должна находить длл, выгруженные моей программой, но, после испытания функции было очень много выгруженных длл. Например, был длл с именем GameModue.dll. Уж моя то программа его то и не использует это точно.) Поэтому кто-нибудь может мне пожалуйста указать где в этой функции исатся длл в системе что бы я мог поменять на хендл нужного процесса? В итоге вызов функции должен получится как-то так: GetLoadedDLLList (Handle: THandle; List: TStringsList); где Handle - это хендл того процесса, у которого я хочу поискать длл. |  
 Мини-форум вопросаВсего сообщений: 34; последнее сообщение — 28 апреля 2011, 17:58; участников в обсуждении: 5. Страницы: [1] [2] [Следующая »]  
|   | Егор (статус: 10-ый класс), 19 апреля 2011, 20:48 [#1]: Цитата (BigNik): Вот функция для определения всех выгруженных длл !!!В СИСТЕМЕ!!!: улыбнуло
   Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | bugmenot (статус: 3-ий класс), 20 апреля 2011, 00:12 [#2]:А мне понравилось открытие вопроса словом короче \m/ 
 Судя по разношёрстности копипасты, OP получит даже больше экспы, чем переписав самостоятельно.
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 15:52 [#3]:Немного не понял последнего сообщения... |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 15:53 [#4]:Навскидку: вместо GetCurrentProcess подставляй хэндл нужного процесса. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 16:35 [#5]:Проблема в том, что если подставить хендл другого прцесса то вылетает вот такая ошибка:  Access ciolation at address 004BD7B9 in module Project3.exe. Read of address 0000133C |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 16:44 [#6]:Ну так прогони для начала под дебаггером, локализуй ошибку, а дальше - посмотрим. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 17:06 [#7]:вот мною переделанная функция: 
 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;с помощью брейкпоинтов я определил что после sl.Clear он почемуто сразу идёт на FreeLibrary(psapilib) и выдаёт ошибку...
 |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 19:24 [#8]: Цитата (BigNik): с помощью брейкпоинтов я определил что после sl.Clear он почемуто сразу идёт на FreeLibrary(psapilib) и выдаёт ошибку...  Значит sl либо равен nil, либо был освобождён до вызова функции, либо не был создан.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 19:36 [#9]:в функцию были вставлены такие строчки 
 if sl= nil then exit; // прошёл успешно
    try
     sl.Create;               // прошёл успешно
    finally
     sl.Clear;                // сразу отсюда переходит на ФриЛайбрери
    end;результат не изменился...в чём может быть проблема???
 |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 19:51 [#10]:Ууууууууууууу, брателло, я вижу, ты даже азов и матчасти не знаешь, а уже лезешь лабать серьёзные проги. Вот откуда, оказывается, ласты растут. Такой бред мог бы написать какой-нить первокурсник-двоечник, но никак не программист. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 19:56 [#11]:ну уж =) математику то я знаю а уж азы тем более. Начнём с того что я учусь в 9м классе и делфи изучаю уже 1-1.5 года так что я знаю что пишу. Но насчёт не создан... создать это Create  ведь так? а в моём коде я проверяю на нулёвость и создаю этот стрингс. Если это не правильно, то что можете вы предложить? |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 19:59 [#12]:А и ещё... если вызвать оригинал функции, то есть без моих изменений, то она работает без ошибок со стрингс-ом |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 20:09 [#13]: Цитата (BigNik): ну уж =) математику то я знаю а уж азы тем более. БУГАГАГАГА!!!! Причём здесь математика??!!111
  Матчасть - материальная часть, изучается после азов и к математике не имеет никакого отношения. 
 Цитата (BigNik): Начнём с того что я учусь в 9м классе и делфи изучаю уже 1-1.5 года Ты начал не с этого, а с трёх спижженых из интернета функций, причём, как они работают, ты не знаешь.
 
 Цитата (BigNik): так что я знаю что пишу.  Если бы знал, тебя бы тут не было. К тому же, это не ты писал, а другие люди, причём, решавшие свои конкретные задачи.
 
 Цитата (BigNik): Но насчёт не создан... создать это Create ведь так? Да, да и ещё раз да! Но нихрена не так, как ты пишешь.
 
 Цитата (BigNik): а в моём коде я проверяю на нулёвость и создаю этот стрингс. Если это не правильно, то что можете вы предложить?  Это бред. Предложить могу только одно: накачать книжек и читать, читать, читать!
 
 Цитата (BigNik): А и ещё... если вызвать оригинал функции, то есть без моих изменений, то она работает без ошибок со стрингс-ом  Это ничего не значит, если не понимаешь, что происходит внутри функции.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 20:18 [#14]:=) ну про матчасть я не понял.. да =) 1. да эти функции я взял из интернета и дня эдак 4 уже ковыряю и в общем я понимаю что они делают кроме пары строчек.
 2. может я и не знаю что у каждой функции внутри, но я могу поменять значения так как мне надо и могу переделать функцию под меня, но я уже заколебался это делать...
 3. если мне чёто не понятно из функций - мой делфи мне все значения этой функции покажет и в крайнем случае есть Индекс и интернет...
 но сейчас не про это...
 вы уж пожалуйста помогите мне а? а если чё мне не понятно - залезу в инет...
 |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 20:27 [#15]: Цитата (BigNik): =) ну про матчасть я не понял.. да =) Айяйяй!
 
 Цитата (BigNik): да эти функции я взял из интернета и дня эдак 4 уже ковыряю и в общем я понимаю что они делают кроме пары строчек. Дык обращайся к авторам этих функций. Какого хрена тебе от нас-то надо?
 
 Цитата (BigNik): может я и не знаю что у каждой функции внутри, но я могу поменять значения так как мне надо и могу переделать функцию под меня, но я уже заколебался это делать... Раз заколебался, значит не можешь. Думаешь, ты один тут такой? Да вас 80%!
 
 Цитата (BigNik): вы уж пожалуйста помогите мне а? а если чё мне не понятно - залезу в инет...  Слы, братан, ты просто не с той стороны решаешь проблему. Надо наоборот.
 Но, поверь мне, тебе ещё рано такими вещами заниматься. ОЧЕНЬ СИЛЬНО РАНО. Отложи эту задачу года на 3. Ты не знаешь элементарнейших вещей, а уже хочешь быть властелином своего компа. Так не бывает. Не спеши. Если будешь продолжать заниматься такими вещами, программист из тебя не получится, т.к. это тебе скоро надоест и ты это забросишь.
 Читай книжки. Всё и сразу бывает только в кино. Поверь мне.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 20:40 [#16]:1. Авторы.... Темы форумов на которых я брал умерли давно... 2. Я заколебался потому что оно не работает. Я знаю что там надо пару значений поменять и знаю каких. Но оно не пашет. Буду копать дальше. Хотя были уже такие вроде как без исходные случаи но только вот с базами данных и МуСиКюЭль. Справился сам как-никак.
 3. =) Про теорию... Я уже чиал про это. Где в exe хранятся списки выгружаемых длл и т.д. но это всё надо на практике сделать...
 4. На счёт сложности... А в Малой Академии Наук бывают лёгкие программы а? ну время полно так что придётся, кажись самому копать...=( а я так надеялся на шару.. сначала сделать а потом разбирать что и как.. но не судьба... кажись...
 |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 20:48 [#17]:Такова селяви, брателло. За тебя тут никто ничего делать не будет. Разве что за бабки. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | BigNik (статус: 1-ый класс), 20 апреля 2011, 20:52 [#18]:ну я ж не просил за меня делать, я просил помочь, а это две разные вещи. я ведь параллельно сам тоже думаю над этой проблемой... |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2011, 21:02 [#19]:Я повторяю: ты не знаешь элементарных вещей, таких, например, как создание и освобождение объектов. Дальнейший базар не имеет смысла. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Егор (статус: 10-ый класс), 20 апреля 2011, 21:03 [#20]: sl: TStrings;
...
s1 := TStrings.Create;
... Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |