نقل قول نوشته شده توسط Mahan-1363 مشاهده تاپیک
گرفتن لیست پروسه های در حال اجرا به همراه آدرس فایل اجرایی بدون نیاز به دسترسی Admin یا ... به وسیله توابع Process32First و Process32Next :

function GetprocessList(ProcessList: TStrings): Boolean;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ProcessList.Clear;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

while Integer(ContinueLoop) <> 0 do
begin
ProcessList.Add(FProcessEntry32.szExeFile);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
finally
CloseHandle(FSnapshotHandle);
end;
end;
کُد شما در همه سیستم ها نمیتونه آدرس یا نام همه پروسه ها رو به درستی نمایش بده.
نمیدونم این کُدها رو توی سایت گذاشتم یا نه، از ویندوز 32 XP تا WIn8 64 تست شده و جواب میده:

function EnableDebugPrivileges: THandle;
var
lpLuid : TOKEN_PRIVILEGES;
OldlpLuid : TOKEN_PRIVILEGES;
ReturnLength : DWORD;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Result) then begin
if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', lpLuid.Privileges[0].Luid) then
RaiseLastOSError
else
begin
lpLuid.PrivilegeCount := 1;
lpLuid.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
ReturnLength := 0;
OldlpLuid := lpLuid;
//Set the SeDebugPrivilege privilege
if not AdjustTokenPrivileges(Result, False, lpLuid, SizeOf(OldlpLuid), OldlpLuid, ReturnLength) then
RaiseLastOSError;
end;
end else
RaiseLastOSError;
end;

function GetProcFullPathVista(ProcessId: Cardinal): string;
var
ProcessIdInfo: SYSTEM_PROCESS_ID_INFORMATION;
begin
Result := '';

SetLength(Result, MAX_PATH);

ProcessIdInfo.ProcessId := ProcessId;
ProcessIdInfo.ImageName.Length := 0;
ProcessIdInfo.ImageName.MaximumLength := MAX_PATH;
ProcessIdInfo.ImageName.Buffer := @Result[1];

NtQuerySystemInformation(88, @ProcessIdInfo, SizeOf(SYSTEM_PROCESS_ID_INFORMATION), nil);

SetLength(Result, ProcessIdInfo.ImageName.Length div 2);
Result := DevicePathToWin32Path(Result);
end;

function GetProcFullPathXP(ProcessId: Cardinal): string;
var
ProcessName: array[0..MAX_PATH - 1] of WideChar;
ProcessHandle: THandle;
TokenHandle: THandle;
begin
Result := '';
TokenHandle := EnableDebugPrivileges;
try
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, false, ProcessId);
if (ProcessHandle = 0) or (ProcessHandle = INVALID_HANDLE_VALUE) then Exit;
try
if NtQueryInformationProcess(ProcessHandle, 27, @ProcessName[0], MAX_PATH, nil) = NT_STATUS_SUCCESS then
Result := DevicePathToWin32Path(PUNICODE_STRING(@ProcessName[0])^.Buffer);
finally
CloseHandle(ProcessHandle);
end;
finally
CloseHandle(TokenHandle);
end;
end;