Для списка процессов, полученных при помощи ZwQuerySystemInformation или Process32First/Process32Next, нужны полные имена файлов, из которых они стартовали. В Windows 98 это автоматом, а в NT/2000/XP - как? Где-то я читал решение, но не помню где.
Позволю себе процитировать исходник Ms-Rem'a Код (Text): //--- (C) Ms-Rem function GetNameByPid(Pid: dword): string; var hProcess, Bytes: dword; Info: PROCESS_BASIC_INFORMATION; ProcessParametres: pointer; ImagePath: TUnicodeString; ImgPath: array[0..MAX_PATH] of WideChar; begin Result := ''; ZeroMemory(@ImgPath, MAX_PATH * SizeOf(WideChar)); hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, Pid); if ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @Info, SizeOf(PROCESS_BASIC_INFORMATION), nil) = STATUS_SUCCESS then begin if ReadProcessMemory(hProcess, pointer(dword(Info.PebBaseAddress) + $10), @ProcessParametres, SizeOf(pointer), Bytes) and ReadProcessMemory(hProcess, pointer(dword(ProcessParametres) + $38), @ImagePath, SizeOf(TUnicodeString), Bytes) and ReadProcessMemory(hProcess, ImagePath.Buffer, @ImgPath, ImagePath.Length, Bytes) then begin Result := ExtractFileName(WideCharToString(ImgPath)); end; end; CloseHandle(hProcess); end;