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.
---------------------------------
Не ищет путь системных процессов. 
Сообщение отредактировал Волк-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
|
|
|
|