![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Короче задача такая:
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; Вот функция для определения всех выгруженных длл !!!В СИСТЕМЕ!!!: Код:
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. Функция для убивания процесса по имени 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. |