Суббота, 21.12.2024, 20:07 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024  
Насчет процессов
okeДата: Четверг, 05.04.2012, 21:33 | Сообщение # 1
Постоянный
Зарегистрирован: 15.01.2012
Группа: Пользователи
Сообщений: 124
Статус: Offline
очень не хотелось бы создавать новый топик так как в предедущем спросил но ответа думаю не будет. такой вопрос как узнать откуда был запущен процесс. К примеру как в диспетчере задач "открыть место хранения файла" показывает деррикторию.
 
Marra_KeshДата: Четверг, 05.04.2012, 22:22 | Сообщение # 2
Постоянный
Зарегистрирован: 19.12.2009
Группа: Модераторы
Сообщений: 182
Статус: 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
Постоянный
Зарегистрирован: 15.01.2012
Группа: Пользователи
Сообщений: 124
Статус: Offline
а теперь попробуй сам узнай путь по этому коду... там ошибка на ошибке
 
Волк-1024Дата: Четверг, 05.04.2012, 23:21 | Сообщение # 4
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Вот переделал от сюда: -http://www.sql.ru/forum/actualthread.aspx?tid=114705

Доступно только для пользователей
В uses нужно добавить TLHelp32

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

Пример: Доступно только для пользователей
Код нужно доработать.

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


Сообщение отредактировал Волк-1024 - Четверг, 05.04.2012, 23:40
 
okeДата: Четверг, 05.04.2012, 23:58 | Сообщение # 5
Постоянный
Зарегистрирован: 15.01.2012
Группа: Пользователи
Сообщений: 124
Статус: Offline
спасибо огромное
 
NeoДата: Пятница, 06.04.2012, 15:02 | Сообщение # 6
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: 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
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz