Re: GetWinFileName



Thanks. I tried using this also without enuming through every
process, but I couldn't figure out how to setup the GetModuleFileName
statement with the handle that has been passed.

procedure TForm1.RefreshTaskListNT();
type
TEnumProcess = function (lpidProcess: LPDWORD; cb: DWORD;
var cbNeeded: DWORD): Boolean; stdcall;
TEnumProcessModule = function (hProcess: THandle; lphModule:
LPDWORD; cb: DWORD;
var lpcbNeeded: DWORD):Boolean;
stdcall;
TGetModuleFileName = function (hProcess: THandle; hModule:
HMODULE;lpFilename: PAnsiChar;
nSize: DWORD): DWORD; stdcall;
var cbNeededEP, cbNeededEPM: DWORD;
eNum : Word;
procID: Array[0..800] of DWORD;
hModules, ntPSAPI: HMODULE;
strModule: String;
lBuf, nSize, iCtr: LongInt;
hProcess: THandle;
EnumProcess: TEnumProcess;
EnumProcessModule: TEnumProcessModule;
GetModuleFileName: TGetModuleFileName;
// lpCreationTime, lpExitTime, lpKernelTime, lpUserTime : FileTime;
begin
ntPSAPI := LoadLibrary('PSAPI.DLL'); // Load PSAPI.DLL
if (ntPSAPI <> 0) then begin
try
EnumProcess := GetProcAddress(ntPSAPI, 'EnumProcesses'); //
Get (point to) the Functions we need in the dll
EnumProcessModule := GetProcAddress(ntPSAPI,
'EnumProcessModules');
GetModuleFileName := GetProcAddress(ntPSAPI,
'GetModuleFileNameExA');
if (Assigned(EnumProcess) and Assigned(EnumProcessModule) and
Assigned(GetModuleFileName)) then begin
EnumProcess(@procID, NT_PROC_ARRAY_SIZE, cbNeededEP); //
Enumerate Process IDs
eNum := (cbNeededEP div SizeOf(DWORD)); // Elements Number
StgLstPeocesses.Clear;
for iCtr := 1 To (eNum - 1) do begin
hProcess := OpenProcess((PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ), True, procID[iCtr]); // Fetch a Handle to the
Process

if (hProcess <> 0) then begin // Accquired a Process
Handle
if (EnumProcessModule(hProcess, @hModules,
SizeOf(hModules), cbNeededEPM) <> False) then begin // Fetch an Array
of the Module Handles from the target Process
strModule := StringOfChar(' ', MAX_PATH);
nSize := NT_CHAR_MAX;
lBuf := GetModuleFileName(hProcess, hModules,
PChar(strModule), nSize);

if (Pos('?', strModule) = 0) and (Pos(':',
strModule) > 0) then begin // Remove Entries with Misc Char
(*PID added*) StgLstPeocesses.Add(copy(strModule, 1, lBuf) +
' [' + UpperCase(IntToStr(procID[iCtr])) + ']');
// GetProcessTimes(hProcess, lpCreationTime,
lpExitTime, lpKernelTime, lpUserTime);
end;
end;
end;

CloseHandle(hProcess); // Close the Process
end;
end
finally
FreeLibrary(ntPSAPI); // PSAPI.DLL no longer needed; Free It
end;
end;
end;
.