|
Вопрос # 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]
|
BigNik (статус: 1-ый класс), 20 апреля 2011, 21:13 [#21]:
Блин одни создают через
(ComponentName).Create
другие через
(ComponentName):=T(ComponentType).Create
так что ж всё таки правильнее а?
|
|
min@y™ (статус: Доктор наук), 20 апреля 2011, 21:16 [#22]:
Кури учебники. Там примеры есть.
Я пас. Надоело.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
BigNik (статус: 1-ый класс), 20 апреля 2011, 21:21 [#23]:
да я как бы тоже...
|
|
Егор (статус: 10-ый класс), 20 апреля 2011, 21:23 [#24]:
Цитата (BigNik):
так что ж всё таки правильнее а?
в данном случае - без разницы.
был бы это с++, объяснил бы а в дельфях терминологией владею слабо.
в с++ подобные вещи (конструктор create) называются "статические методы". эти методы не привязаны ни к одному объекту и существуют как бы сами по себе. поэтому доступ к ним можно получить как через имя объекта (даже если объект ещё не проинициализирован), так и по имени класса.
важно! могу наврать. ибо в дельфях разбираюсь слабо.
чтобы узнать более подробно - почитай инфу по теме создания объектов в дельфи.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
BigNik (статус: 1-ый класс), 20 апреля 2011, 21:27 [#25]:
у меня оба метода роботают нормально со всеми компонентами ( ну которые я перепробовал) но всё же спасибо!
|
|
bugmenot (статус: 3-ий класс), 21 апреля 2011, 13:19 [#26]:
Цитата:
Немного не понял последнего сообщения...
Слепить эту копипасту в нечто работоспособное будет сложнее, чем написать заново.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Вадим К (статус: Академик), 21 апреля 2011, 13:41 [#27]:
правильно - (ComponentName):=T(ComponentType).Create
(ComponentName).Create - это неверно. Если у Вас "работает", покажите код того, что работает
Галочка "подтверждения прочтения" - вселенское зло.
|
|
BigNik (статус: 1-ый класс), 21 апреля 2011, 16:39 [#28]:
bugmenot, может вы и правы... ладно напишу свою... если получится - тут выложу, если нет - буду "курить учебники" =)
насчёт (ComponentName).Create - да, оно например с TForm не работает... вы правы... как то я этого раньше не замечал...
|
|
Вадим К (статус: Академик), 21 апреля 2011, 16:45 [#29]:
покажите код, как используете (ComponentName).Create (пытаетесь)
Галочка "подтверждения прочтения" - вселенское зло.
|
|
BigNik (статус: 1-ый класс), 21 апреля 2011, 16:54 [#30]:
как то странно... (ComponentName).Create не работает, но я вот точно помню (на 150%) что я где то когда то видел такое, но не помню где и когда... на форуме на каком то что ли?
Но всё же оно у меня не пашет.
|
|
Вадим К (статус: Академик), 21 апреля 2011, 17:12 [#31]:
Может быть просто тип был объявлен без буквы T в начале (она там в принципе не обязательна, это просто дань традиции).
Галочка "подтверждения прочтения" - вселенское зло.
|
|
BigNik (статус: 1-ый класс), 21 апреля 2011, 17:16 [#32]:
ну может быть =)
|
|
BigNik (статус: 1-ый класс), 26 апреля 2011, 21:24 [#33]:
ну вот после пыхтения с примерами у меня наконец то что-то получилось... но оно всё равно не работает так как надо...
вот сам проэкт : http://narod.yandex.ru/disk/11206908001/111.rar
но вот что я не пойму никак:
function CheckForDLLInProcess (ProcId : Cardinal; DLLName : string) : boolean;
var
H: THandle;
pe: TModuleEntry32;
B: Boolean;
R: Integer;
begin
H:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcId); // <------------------
try
pe.dwSize:= SizeOf(pe);
B:= Module32First(H, pe);
while B do
begin
//ShowMessage (pe.szModule);
if DLLName=StrPas(pe.szModule) then ShowMessage('FOUND!');
B:= Module32Next(H, pe);
if B then
end;
finally
CloseHandle(H);
end;
end;
Эта функция (CreateToolhelp32Snapshot), какой бы ни был параметр флага поиска, всё равно даёт все длл системы а не указанного в ProcId процесса... кто может помочь?
|
|
BigNik (статус: 1-ый класс), 28 апреля 2011, 17:58 [#34]:
Спасибо всем ВОПРОС РЕШЁН
|
28 апреля 2011, 18:00: Статус вопроса изменён на решённый (изменил автор вопроса — BigNik)
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|