Короче задача такая: 
 1. Перебрать все системные процессы. Это можно сделать так: 
 Code
 
 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. Перебрать с первого по последний процесс и посмотреть, у какого какие длл-ки запущены. 
 Вот функция для определения всех выгруженных длл !!!В СИСТЕМЕ!!!: 
 
Code
 
 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: 
 
Code
 
 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; 
 
  
 Мне надо переделать функцию GetLoadedDLLList так, чтобы она могла находить длл только у 1го процесса, а не у всей системы! 
 В итоге вызов функции должен быть примерно таким - GetLoadedDLLList (Process : THandle; sl : TStrings); 
 Помогите пожалуйста переделать функцию а то я уже заколебался! 
 
 P.S. с апи работаю недолго поэтому и прошу помощи.