Понедельник, 09.04.2012, 12:58 Приветствую вас Гость | Группа "Гости" 


[ Главная · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Страница 1 из 1 1
Модератор форума: gravitas  
delfcode » Delphi » Вопросы по Delphi » Насчет процессов (процессы)
Насчет процессов
oke Дата: Четверг, 05.04.2012, 21:33 | Сообщение # 1
Новичок
Группа: Пользователи
Сообщений: 9
Статус: Offline
очень не хотелось бы создавать новый топик так как в предедущем спросил но ответа думаю не будет. такой вопрос как узнать откуда был запущен процесс. К примеру как в диспетчере задач "открыть место хранения файла" показывает деррикторию.
 
Marra_Kesh Дата: Четверг, 05.04.2012, 22:22 | Сообщение # 2
Продвинутый
Группа: Модераторы
Сообщений: 116
Статус: Offline
Держитесь, ща выдам "коронную речЪ":
Google + как узнать откуда был запущен процесс =
-http://www.kansoftware.ru/?tid=1884
-http://www.sql.ru/forum/actualthread.aspx?tid=114705
-http://forum.sources.ru/index.php?showtopic=73733&st=0
НЕТ?
 
oke Дата: Четверг, 05.04.2012, 22:31 | Сообщение # 3
Новичок
Группа: Пользователи
Сообщений: 9
Статус: Offline
а теперь попробуй сам узнай путь по этому коду... там ошибка на ошибке
 
Волк-1024 Дата: Четверг, 05.04.2012, 23:21 | Сообщение # 4
Продвинутый
Группа: Проверенные
Сообщений: 137
Статус: Offline
Вот переделал от сюда: -http://www.sql.ru/forum/actualthread.aspx?tid=114705

Доступно только для пользователей
Code

function GetProcessFilePath(FName: string): string;
var
          hProcess, hModule: integer;
          PE32: PROCESSENTRY32;
          PM: MODULEENTRY32;
begin
          hProcess:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
          PE32.dwSize:=SizeOf(PROCESSENTRY32);
          repeat
             begin
                hModule:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PE32.th32ProcessID);
                PM.dwSize:=(SizeOf(MODULEENTRY32));
                repeat
                   if PM.szModule=FName then
                   begin
                      Result:=PM.szExePath;
                      CloseHandle(hModule);
                   end;
                until not (Module32Next(hModule, PM));
             end;
          until not (Process32Next(hProcess, PE32));
          CloseHandle(hProcess);
end;

В uses нужно добавить TLHelp32

Проверил. Все работает.

Пример: Доступно только для пользователей
Code
MessageBox(0, (PAnsiChar(GetProcessFilePath('opera.exe'))), nil, 0);

Код нужно доработать.

UPD.
---------------------------------
Не ищет путь системных процессов. sad

Сообщение отредактировал Волк-1024 - Четверг, 05.04.2012, 23:40
 
oke Дата: Четверг, 05.04.2012, 23:58 | Сообщение # 5
Новичок
Группа: Пользователи
Сообщений: 9
Статус: Offline
спасибо огромное
 
Neo Дата: Пятница, 06.04.2012, 15:02 | Сообщение # 6
Модератор
Группа: Модераторы
Сообщений: 89
Статус: Offline
Quote (Волк-1024)
Не ищет путь системных процессов.

Есть ещё способ,чтобы всё искал.Для этого нужно включить привилегии отладки.
Code

function EnablePrivilege(Process: dword; lpPrivilegeName: PChar):Boolean;
var
       hToken: dword;
       NameValue: Int64;
       tkp: TOKEN_PRIVILEGES;
       ReturnLength: dword;
begin
       Result:=false;
       OpenProcessToken(Process, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
       if not LookupPrivilegeValue(nil, lpPrivilegeName, NameValue) then
         begin
          CloseHandle(hToken);
          exit;
         end;
       tkp.PrivilegeCount := 1;
       tkp.Privileges[0].Luid := NameValue;
       tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
       AdjustTokenPrivileges(hToken, false, tkp, SizeOf(TOKEN_PRIVILEGES), tkp, ReturnLength);
       if GetLastError() <> ERROR_SUCCESS then
          begin
           CloseHandle(hToken);
           exit;
          end;
       Result:=true;
       CloseHandle(hToken);
end;

function FixProcessPath(PPath: String): String;
begin
       if PPath = '?' then
       begin
         Result := '';
         Exit;
       end;
       if Pos('\??\',PPath) <> 0 then
         Result := Copy(PPath,5,length(PPath)) else
         Result := PPath;
end;

function GetPathByPID(hProcess: THandle) : string;
       var
       cb: DWORD;
       hMod: HMODULE;
       ModuleName: array [0..300] of Char;
begin
       if (hProcess <> 0) then
       begin
         EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
         GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
         if FileExists( FixProcessPath (ModuleName)) then
           Result := (ModuleName);
       end;
end;

function GetProcessID(const AProcessName: string): DWord;
var
       lSnapHandle: THandle;
       lProcStruct: PROCESSENTRY32;
       lProcessName, lSnapProcessName: string;
       lOSVerInfo: TOSVersionInfo;
begin
       Result := INVALID_HANDLE_VALUE;
       lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
       if lSnapHandle = INVALID_HANDLE_VALUE then
       Exit;
       lProcStruct.dwSize := SizeOf(PROCESSENTRY32);
       lOSVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
       GetVersionEx(lOSVerInfo);
       case lOSVerInfo.dwPlatformId of
         VER_PLATFORM_WIN32_WINDOWS: lProcessName := AProcessName;
         VER_PLATFORM_WIN32_NT: lProcessName :=ExtractFileName(AProcessName);
       end;
       if Process32First(lSnapHandle, lProcStruct) then
       begin
       try
        repeat
         lSnapProcessName := lProcStruct.szExeFile;
         if AnsiUpperCase(lSnapProcessName) = AnsiUpperCase(lProcessName) then
         begin
           Result := lProcStruct.th32ProcessID;
           Break;
         end;
        until not Process32Next(lSnapHandle, lProcStruct);
       finally
       CloseHandle(lSnapHandle);
       end;
       end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
       hProcess: cardinal;
       path: string;
begin
       EnablePrivilege(INVALID_HANDLE_VALUE, 'SeDebugPrivilege');
       hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false,
                     GetProcessID('winlogon.exe'));
       begin
         path := FixProcessPath(getPathbyPID(hProcess));
         MessageBox(0,PChar(path),'',0);
       end;
       CloseHandle(hProcess);
end;

Не забудь подключить TLHelp32,PsApi.
P.S код подсмотрел там: http://www.delphisources.ru/pages....ew.html

Сообщение отредактировал Neo - Пятница, 06.04.2012, 15:06
 
delfcode » Delphi » Вопросы по Delphi » Насчет процессов (процессы)
Страница 1 из 1 1
Поиск:
delfcode.ru © 2008 - 2012 Хостинг от uCoz