Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять код-пример 
:(
    Опции темы
бУРов
Дата 24.6.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Я использую пример программы, которая получает список запущенных процессов (среди них ищет определенный, artv).
Оригинальный код:
Taking a Snapshot and Viewing Processes (Windows)
я порезал,

Теперь в том, что осталось хочу разобраться, что мне ещё может быть не нужно.
Например,

Код
    hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
    if( hProcess == NULL )
        printError("OpenProcess");
    else

    {
      dwPriorityClass = GetPriorityClass( hProcess );
      if( !dwPriorityClass )
        printError("GetPriorityClass");
      CloseHandle( hProcess );
    }

Для отдельных процессов выводит в консоль предупреждающее сообщение 
Цитата
WARNING: OpenProcess failed with error 5 (Access is denied)

Для моего процесса, который я ловлю, такого нет, поэтому хочу понять, нужен ли мне этот кусочек кода?
И чем его необходимость j,обусловлена в оригинальном примере?

Свма программа:
Код
#include "stdafx.h"
#include <atlstr.h>

//  Forward declarations:
BOOL GetProcessList( );
void printError( char* msg );
CString ProcName;

BOOL GetProcessList(char* ParName)
{
    HANDLE hProcessSnap;
    HANDLE hProcess;
    PROCESSENTRY32 pe32;
    DWORD dwPriorityClass;

  // Take a snapshot of all processes in the system.
  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    printError("CreateToolhelp32Snapshot (of processes)");
    return( FALSE );
  }

  // Set the size of the structure before using it.
  pe32.dwSize = sizeof( PROCESSENTRY32 );

  // Retrieve information about the first process,
  // and exit if unsuccessful
  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    printError("Process32First");        // show cause of failure
    CloseHandle( hProcessSnap );        // clean the snapshot object
    return( FALSE );
  }

  // Now walk the snapshot of processes, and
  // display information about each process in turn
do
  {
    // Retrieve the priority class.
    dwPriorityClass = 0;

    hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
    if( hProcess == NULL )
        printError("OpenProcess");
    else

    {
      dwPriorityClass = GetPriorityClass( hProcess );
      if( !dwPriorityClass )
        printError("GetPriorityClass");
      CloseHandle( hProcess );
    }

  } while( Process32Next( hProcessSnap, &pe32 ) );

  CloseHandle( hProcessSnap );
  return( TRUE );
}

void printError(char* msg)
{
  DWORD eNum;
  char sysMsg[256];
  char* p;

  eNum = GetLastError( );
  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
         NULL, eNum,
         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
         sysMsg, 256, NULL );

  // Trim the end of the line and terminate it with a null
  p = sysMsg;
  while( ( *p > 31 ) || ( *p == 9 ) )
    ++p;
  do { *p-- = 0; } while( ( p >= sysMsg ) &&
                          ( ( *p == '.' ) || ( *p < 33 ) ) );

  // Display the message
  printf("\n  WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg);
}

int main(int argc, char *argv[]) // принимаем имя exe-задачи
{
    GetProcessList(argv[1]);
    return 0;
}

PM MAIL   Вверх
feodorv
Дата 24.6.2013, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(бУРов @  24.6.2013,  17:05 Найти цитируемый пост)
Для моего процесса, который я ловлю, такого нет, поэтому хочу понять, нужен ли мне этот кусочек кода?

Всё зависит от того, что Вам надо.
Если Вам нужен всего один процесс из этого списка, то зачем для каждого делать OpenProcess? Кстати, не ясно, как Вы определяете, Ваш это процесс или нет.
Но если Вы делаете OpenProcess хотя бы для одного процесса, то всё равно нужна обработка ошибочных ситуаций (а вдруг OpenProcess завершится неудачно именно для Вашего процесса, как Вы тогда без дополнительного уведомления поймёте, что происходит: процесс вроде есть, а программа его не находит...)


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
бУРов
Дата 25.6.2013, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Цитата
Всё зависит от того, что Вам надо.
Если Вам нужен всего один процесс из этого списка, то зачем для каждого делать OpenProcess?

Спасибо - это ценное замечание.
Цитата
Кстати, не ясно, как Вы определяете, Ваш это процесс или нет.

Предполагается, что имя процесса будет передано как параметр командной строки argv[1]
Цитата
Но если Вы делаете OpenProcess хотя бы для одного процесса, то всё равно нужна обработка ошибочных ситуаций (а вдруг OpenProcess завершится неудачно именно для Вашего процесса...

Мне не совсем понятно, нужен ли мне этот вызов вообще. Пока мне нужно найти в списке "prog.exe" и потом, путь по которому произведен ее запуск. А нужен ли этот вызов мне?
PM MAIL   Вверх
Dem_max
Дата 25.6.2013, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Код

HANDLE hToken;
HANDLE hProcess;
TCHAR module_name[MAX_PATH];
DWORD dwSize = sizeof(module_name)/sizeof(TCHAR) - 1;

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
SetPrivilege(hToken, L"SeDebugPrivilege", TRUE);

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
if(NULL == hProcess)
{
   SetPrivilege(hToken, L"SeDebugPrivilege", FALSE);
   return;
}

QueryFullProcessImageName(hProcess, 0, module_name, &dwSize);

CloseHandle(hProcess);
SetPrivilege(hToken, L"SeDebugPrivilege", FALSE);


Код

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
    )
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if ( !LookupPrivilegeValue(
            NULL,            // lookup privilege on local system
            lpszPrivilege,   // privilege to lookup
            &luid ) )        // receives LUID of privilege
    {
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.

    if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD) NULL))
    {
          return FALSE;
    }

    if(GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
          return FALSE;
    }

    return TRUE;
}


Это сообщение отредактировал(а) Dem_max - 25.6.2013, 09:17


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
бУРов
Дата 25.6.2013, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Dem_max, это что? Первый кусочек кода я помещаю в main?
А второй перед main?
Компилится с ошибками.
И что это за код?
Получить по имени процесса его путь?

Это сообщение отредактировал(а) бУРов - 25.6.2013, 10:00
PM MAIL   Вверх
Dem_max
Дата 25.6.2013, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

И что это за код?
Получить по имени процесса его путь?


Цитата

QueryFullProcessImageName(hProcess, 0, module_name, &dwSize);


Конкретно да, но можешь что хочешь делать.

Я тебе привел пример как получать доступ к процессу и получать о нем информацию.

Это сообщение отредактировал(а) Dem_max - 25.6.2013, 10:05


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
бУРов
Дата 25.6.2013, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Функция SetPrivilege. Она нужна для оого, чтобы "обойти" UAC?
Т.е., после запуска программы, системой мне будет предложен вопрос-предложение можно ли запускать данную программу?
PM MAIL   Вверх
Dem_max
Дата 25.6.2013, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Ну да, не под админом может отказать. В принципе можешь попробовать убрать привилегии, но там будут траблы с получением информации от x64 процессах из своего x32 приложения.
Если пользователь один на компе то он и так админ.  


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
бУРов
Дата 25.6.2013, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Сейчас у меня вот такая связка
Код
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);
QueryFullProcessImageName( hProcess, 0, ProcPath, &pe32.dwSize );

и она работает.

Но вопросы остались.

Используя в цикле связку CreateToolhelp32Snapshot/Process32First/Process32Next
я получаю "снимок" запущенных процессов,
и для каждого заполняется структура pe32 с информацией о процессе.
А зачем нужен дополнительный вызов OpenProcess?
Чтобы получить ещё и hProcess?
PM MAIL   Вверх
Dem_max
Дата 25.6.2013, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

Чтобы получить ещё и hProcess?

Дa, так он нужен если нужно получить информацию о процессе, читай ремарку с MSDN

Цитата

PROCESSENTRY32

szExeFile

The name of the executable file for the process. To retrieve the full path to the executable file, call the Module32First function and check the szExePath member of the MODULEENTRY32 structure that is returned. However, if the calling process is a 32-bit process, you must call the QueryFullProcessImageName function to retrieve the full path of the executable file for a 64-bit process.



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
бУРов
Дата 25.6.2013, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Понятно.
А в чем разница между процессом и модулем?
Процесс относится к exe-файлу,
а модуль к dll-библиотеке?
PM MAIL   Вверх
Dem_max
Дата 25.6.2013, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Ну типа того


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
бУРов
Дата 25.6.2013, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.8.2010

Репутация: нет
Всего: нет



Вот, что у меня получилось.
Хочу сделать, чтобы в бесконечном цикле консольная прога делала "снимки" запущенных процессов.
Анализировала и проверяла, есть ли там нужный (передается параметром в командной строке).
Пока она не работает, как мне хочется.
Запускаю консольную свою программу (эту). Консоль открывается, выводятся пустые строки (видно, как курсор опускается вниз).
Запускаю целевую программу, которую ловлю.
Начинается вывод ее имени.
Закрываю целевую программу, но вывод продолжается. А мне нужно, чтобы прекращался.
Что-то с циклами не разберусь никак. Или буфер снимка не очищается?
CreateToolhelp32Snapshot должен каждый раз заполняться новым списком.
Код
BOOL CheckProcess( char* ParName )
{
    HANDLE hProcessSnap;
    HANDLE hProcess;
    PROCESSENTRY32 pe32;

    while(1)
    {
        ProcPath="";
        // Take a snapshot of all processes in the system.
        hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
        if( hProcessSnap == INVALID_HANDLE_VALUE )
        {
            printError("CreateToolhelp32Snapshot (of processes)");
            return( FALSE );
        }

        // Set the size of the structure before using it.
        pe32.dwSize = sizeof( PROCESSENTRY32 );

        // Retrieve information about the first process,
        // and exit if unsuccessful
        if( !Process32First( hProcessSnap, &pe32 ) )
        {
            printError( "Process32First" );        // show cause of failure
            CloseHandle( hProcessSnap );        // clean the snapshot object
            return( FALSE );
        }

        // Now walk the snapshot of processes
        do
        {
            ProcName = pe32.szExeFile;
            if ( ProcName == ParName )
            {
                hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);
                QueryFullProcessImageName( hProcess, 0, (LPTSTR)(LPCTSTR)ProcPath, &pe32.dwSize );
                break;
            }
        } while( Process32Next( hProcessSnap, &pe32 ) );
        printf( "\n%s", ProcPath ); 
        Sleep( 1000 );
        CloseHandle( hProcessSnap );
    }

    return( TRUE );
}


Это сообщение отредактировал(а) бУРов - 25.6.2013, 14:40
PM MAIL   Вверх
Dem_max
Дата 25.6.2013, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



тут же готовый пример есть в чем проблема то ???
http://msdn.microsoft.com/en-us/library/wi...1(v=vs.85).aspx


Код

int main( void )
{
  while(1)
  {
     GetProcessList( );
     Sleep(1000);
  }
  return 0;
}



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 26.6.2013, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(бУРов @  25.6.2013,  14:32 Найти цитируемый пост)
            if ( ProcName == ParName )

Эта строка делает совсем не то, что вы ожидаете. Строки (которые char*) нужно сравнивать специальными функциями (в вашем случае strcmp)
Хотя, если у вас ProcName это CString, то работать будет  smile 

Кроме того, вот это -
Цитата(бУРов @  25.6.2013,  14:32 Найти цитируемый пост)
                QueryFullProcessImageName( hProcess, 0, (LPTSTR)(LPCTSTR)ProcPath, &pe32.dwSize );

наводит на мысль, что вы наступили на любимые грабли всех новичков, которые впервые столкнулись со студией. Называются эти грабли - UNICODE проект  smile 

Цитата(бУРов @  25.6.2013,  14:32 Найти цитируемый пост)
Что-то с циклами не разберусь никак.

Это точно. Перенесите ваш printf со строки 41 на строку 38 (поставьте перед breake)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0950 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.