Путь к процессам
http://borland.xportal.ru/forum/viewtopic.php?t=10372&highlight=
2 пост
Можно и проще:
Module32First вернёт данные Exeшника.
Я так сделал в своём ExeView.
--------------begin--------------
void GetProcessPathName(DWORD pid,TCHAR*buffer)
{
HANDLE hndl1 = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
MODULEENTRY32 me;
me.dwSize = sizeof(me);
if((hndl1==INVALID_HANDLE_VALUE)||(hndl1 == NULL))
{
LoadString(hInst,91,buffer,1024);
return;//ErrorHandler();
}
if(Module32First(hndl1,&me))
{
wcscpy(buffer,me.szExePath);
}
else
{
//ErrorHandler();
LoadString(hInst,37,buffer,MAX_PATH*sizeof(TCHAR));
}
CloseHandle(hndl1);
//wcscpy(buffer,pCurrName);
}
---------------end---------------
Вот. Функция которая это делает. Просто и со вкусом ;)
Всем спасибо! Я уже понял, что в списке модулей процесса в Win2k первый модуль - этот и есть нужный файл. Но возникла новая проблема: при попытке получить список модулей системных процессов (например lsass) возникает ошибка ACCESS_DENIED, хотя все делаю под админом. Как это обойти? По-моему там что-то нужно замутить с DEBUG_PRIVILEGIES или я ошибаюсь? Заранее спасибо.
Да, ты прав. Вот еще кусок кода из той проги(щас её всю потихоньку выложу ;)
-----------begin-------------
inline BOOL EnableDebugPrivileges(BOOL fEnable)
{
// Enabling the debug privilege allows the application to see
// information about service applications
BOOL fOk = FALSE; // Assume function fails
HANDLE hToken;
// Try to open this process's access token
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
&hToken)) {
// Attempt to modify the "Debug" privilege
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOk = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
return(fOk);
}
---------------end----------------------
Спасибо, все получилось! Правда у пары системных процессов пути начинаются с \?\ (интересно почему), но я думаю это можно вырезать.
2 Trifon
Спасибо, все получилось! Правда у пары системных процессов пути начинаются с \?\ (интересно почему), но я думаю это можно вырезать.
Ышшо один кусок
----------------begin-------------
TCHAR *buf = (TCHAR*)LocalAlloc(LPTR,MAX_PATH*sizeof(TCHAR));
TCHAR *name = (TCHAR*)LocalAlloc(LPTR,MAX_PATH*sizeof(TCHAR));
TCHAR *tmp = (TCHAR*)LocalAlloc(LPTR,MAX_PATH*sizeof(TCHAR));
TCHAR *tmp1 = (TCHAR*)LocalAlloc(LPTR,MAX_PATH*sizeof(TCHAR));
pFileName = (TCHAR*)LocalAlloc(LPTR,MAX_PATH*sizeof(TCHAR));
GetProcessPathName(PROCESS_ID,buf);
strgetat(buf,1,name);
if(wcscmp(name,L"?")==0)
{
buf = &buf[4];
}
for(int i=0;i<12;i++)
{
strgetat(buf,i,tmp1);
wcscat(tmp,tmp1);
}
if(wcscmp(tmp,L"\\SystemRoot\\")==0)
{
buf = &buf[11];
wcscpy(tmp1,buf);
GetWindowsDirectory(buf,1024);
wcscat(buf,tmp1);
}
tmp = NULL;
LocalFree(tmp);
SetDlgItemText(hWnd,IDC_EDIT1,buf);
name = NULL;
LocalFree(name);
tmp1=NULL;
LocalFree(tmp1);
wcscpy(pFileName,buf);
buf = NULL;
LocalFree(buf);
-----------------end---------------
strgetat(src,pos,dest)-процедура которая из строки src берет символ позиции pos и пишет в строку dest.
её и ребенок напишет поэтому не выкладываю. по литингу(5481 строк) влом искать.