Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Путь к процессам

6.2K
04 июня 2004 года
angshadow
14 / / 02.06.2004
В Win9x при получении списка процессов через CreateToolhelp32Snapshot->Process32First пути к запущенным процессам передаются в структуре процесса. Но в Win2000 ни через Process32First, ни через QuerySystemInformation пути к процессам получить не удается (только имя файла процесса). Как мне получить путь к запущенному процессу (вариант с поиском файлов на диске отбросим сразу)?
6.4K
09 июня 2004 года
Trifon
18 / / 09.06.2004
Цитата:


Можно и проще:
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---------------
Вот. Функция которая это делает. Просто и со вкусом ;)

6.2K
09 июня 2004 года
angshadow
14 / / 02.06.2004
Всем спасибо! Я уже понял, что в списке модулей процесса в Win2k первый модуль - этот и есть нужный файл. Но возникла новая проблема: при попытке получить список модулей системных процессов (например lsass) возникает ошибка ACCESS_DENIED, хотя все делаю под админом. Как это обойти? По-моему там что-то нужно замутить с DEBUG_PRIVILEGIES или я ошибаюсь? Заранее спасибо.
6.4K
09 июня 2004 года
Trifon
18 / / 09.06.2004
Цитата:
Originally posted by angshadow
Всем спасибо! Я уже понял, что в списке модулей процесса в 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----------------------

6.2K
15 июня 2004 года
angshadow
14 / / 02.06.2004
2 Trifon
Спасибо, все получилось! Правда у пары системных процессов пути начинаются с \?\ (интересно почему), но я думаю это можно вырезать.
6.4K
15 июня 2004 года
Trifon
18 / / 09.06.2004
Цитата:
Originally posted by angshadow
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 строк) влом искать.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог