Какой процесс в системе СЧИТАТЬ первым и зачем?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 31 окт 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну, то есть читаю иной раз,
    Например, здесь
    http://progeru.narod.ru/article/cpp_proc.html

    что для того, чтобы сделать снимок всех процессов, надо определить первый процесс с помощью API- функции Process32First

    Но зачем?
    Вот код,который пробегается по всем процессам и для каждого заполняет структуру PROCESSENTRY32
    безо всякой функции Process32First

    Код (Text):
    1. #include <stdio.h>
    2. #include <Windows.h>
    3. #include <Winnt.h>
    4. //Здесь определена структура PROCESSENTRY32 и функция CreateToolhelp32Snapshot
    5. #include <tlhelp32.h>
    6.  
    7. HANDLE functsia ()  {
    8.  
    9.  HANDLE hProcessSnap;
    10.  PROCESSENTRY32 pe32;
    11.  
    12.  //Это мы находим дескриптор снимка процессов
    13.  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    14.  if (hProcessSnap == INVALID_HANDLE_VALUE)
    15.   return false;
    16.  pe32.dwSize = sizeof(PROCESSENTRY32);
    17.  
    18.  
    19. //эТО ЕСЛИ В ФАЙЛ захочется вывод перенаправить...
    20. // FILE *f;
    21. // f = fopen("rezultat.cc","wb");
    22.  
    23.  
    24.  while (Process32Next(hProcessSnap, &pe32)) {
    25.   printf ("pe32.dwSize= %x\n", pe32.dwSize);
    26.   printf ("pe32.cntUsage= %x\n", pe32.cntUsage);
    27.   printf ("pe32.th32ProcessID= %x\n", pe32.th32ProcessID);
    28.   printf ("pe32.th32DefaultHeapID= %x\n", pe32.th32DefaultHeapID);
    29.   printf ("pe32.th32ModuleID= %x\n", pe32.th32ModuleID);
    30.   printf ("pe32.cntThreads= %x\n", pe32.cntThreads);
    31.   printf ("pe32.th32ParentProcessID= %x\n", pe32.th32ParentProcessID);
    32.   printf ("pe32.pcPriClassBase= %x\n", pe32.pcPriClassBase);
    33.   printf ("pe32.dwFlags= %x\n", pe32.dwFlags);
    34.   printf ("pe32.szExeFile= %s\n\n", pe32.szExeFile);
    35. }
    36.  
    37.  
    38.  //fclose (f);
    39.  CloseHandle(hProcessSnap);
    40.  
    41.  
    42. }
    43.  int main () {
    44.   functsia ();
    45.   getchar ();
    46.   return 0;
    47.  }
    Но, возможно это частный случай, а вообще Process32First, наверное очень полезна.
    Наверное, я это осознаю, если пойму каклой процесс СЧИТАЕТСЯ первым (а я вижу по крайней мере 2 кандидатуры- это текущий и САМЫЙ ГЛАВНЫЙ, не знаю, как он называется)

    Хотелось бы всё же узнать, что значит первый процесс?
    И откуда идёт э... отсчёт?
    И если это САМЫЙ ГЛАВНЫЙ процесс, зачем нам его определять, если он первый по умолчанию?

    Просьба к официальной документации не отсылать, ибо я там был и вот что прочёл:
    Retrieves information about the first process encountered in a system snapshot.

    Безо всяких объяснений.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Первым процесс для Process32First считается процесс, который отображается первым в снапшоте.
    А он может быть любым (никто не гарантирует нам, что первый процесс в снапшоте будет текущим процессом, "главным процессом", или будет иметь какие другие признаки и свойства).
    В общем понятие это применимо в данном контексте применимо только к этой системе API, и не выходит за её рамки.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    И всё?
    Стоило было огород городить, создавать специальную функцию Process32First...
    Лишние движения какие-то...
    А что, с потоками то же самое получается?
    Вот здесь в седьмой главе

    http://wm-help.net/books-online/book/59464/59464-26.html

    Джефри Рихтер рассказывает, как приостановить все потоки какого-нибудь процесса. И опять использует Thread32First
    Смысл?

    Какая разница, какой поток определять первым, если всё равно пробегаться ПО ВСЕМ ПОТОКАМ?
    Как-то непрактично.
    Или я не понимаю чего-то.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Читай про модель итераторов.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Хорошо. Я понял, что Process32First, нужна, чтобы заполнить структуру PROCESSENTRY32 для первого процесса в снимке.
    Более того, я понял, что она не определяет первый процесс, а просто заполняет структуру.

    Но вот кто бы ещё сказал, почему без этой функции можно обойтись в моём коде, где непонятно, с какого процесса начинать заполнение структуры! Но работает ведь... А я вот щас пробежался по ссылкам- все ребята в похожих кодах эту функцию используют... Странно, очень странно.
    Спасибо.
     
  6. Coderess

    Coderess New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    41
    Основная польза от Process32First это при поиске Идентификатора Процесса (PID'а)
    прерваться на первой итерации иначе, возможно что искомый PID является первым
    в снимке и не имеет смысла продолжать поиск далее :)

    Код (Text):
    1. invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
    2. mov hSnapshot, eax
    3. .if eax == INVALID_HANDLE_VALUE
    4. mov eax, INVALID_HANDLE_VALUE
    5. retn
    6. .endif
    7.        
    8. mov lppe.dwSize, sizeof lppe
    9. invoke Process32First, hSnapshot, addr lppe
    10. .if eax
    11. invoke lstrcmpi, addr lppe.szExeFile, szProcName
    12. .if eax==0
    13. mov dwPID, lppe.th32ProcessID
    14. invoke CloseHandle, hSnapshot
    15. ret
    16. .endif
    17. .endif
    В первом снимке память (первая итерация вызов Process32First)

    Код (Text):
    1. 0012FB64  68 FB 12 00 28 01 00 00 00 00 00 00 00 00 00 00  hы.(..........
    2. 0012FB74  00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00  ...............
    3. 0012FB84  00 00 00 00 00 00 00 00 5B 53 79 73 74 65 6D 20  ........[System
    4. 0012FB94  50 72 6F 63 65 73 73 5D                          Process]
    [System Process] - это первый процесс (PID=0)
     
  7. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    amvoz

    Вызови свой код дважды. И все станет на свои места
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ребята, тут что-то не то.
    Coderess, не то что-то. Ну, посуди сам.
    Вызовем мы Process32First или не вызовем- ничего не изменится. Первым как был System Process, так они останется.
    Все сравнения можно отлично выполнить в цикле.

    То есть фактически, System Process нужна, чтобы получить структурку одного единственного процесса Process32First?!
    Ну, я же говорю- стоило огород городить, для этого писать целую API функцию...
    ...Назвали бы уж её сразу Process32SystemProcess... Не, ну а как, если первый процесс ВСЕГДА System Process?

    dynВызывал два раза, ничего не менялось.
    И первый раз все структуры нормально выводились и второй, я проверял. Вот так вызывал

    Код (Text):
    1.  int main () {
    2.   functsia ();
    3.   getchar ();
    4.   functsia ();
    5.   getchar ();
    6.   return 0;
    7.  }
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    amvoz
    dyn написал причину верно. Это сделано, чтобы можно было в любой момент вернуть объект в исходное состояние и начать с ним работать заново. Создавать объект повторно может быть накладно.
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    dyn
    никакой причины не называл.
    ... Я думал, что первый раз у меня всё выведется, а второй- нет (без Process32First)
    Так оно и второй раз всё вывелось корректно.
    И третий и четвёртый.

    ...А как с помощью Process32First я верну объект в исходное состояние? И о каком объекте речь?
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    amvoz

    FindFirstFile / FindNextFile тебя тоже смущают?
     
  12. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Я их не изучал ещё и не надо меня подкалывать.
    Короче, никто не знает, зачем нужен Process32First.

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

    Действительно, если первый процесс SYSTEM PROCESS (по крайней мере, у меня так), тогда придётся согласиться с нелепостью существования Process32First- это ж надо, ради одного единственного процесса целую функцию писать при том, что и без неё всё отлично можно получить.

    Если первый процесс ЛЮБОЙ, то всё ещё смешнее. Process32First заполняет структуру ПЕРВОГО ПОПАВШЕГОСЯ процесса. Нет слов.

    И ведь никто не задумывался над этим.
    Просто сдували друг у друга коды и вставляли в собственные статьи.

    ...Хотел было переспросить, откуда его считать первым- слева, справа, с адреса такого-то, со времени существования, но вспомнив ответ n0name- что он первый СЛУЧАЙНО (с которым все согласны), передумал.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Товарищ феерический тролль.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Пост номер 4 всё объясняет.
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да мне-то что?
    Не можете ответить- не надо. Я для себя пометил на бумажке, что представляет Process32First и всё.
    А вы дальше её используйте.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Я бы так не сказал, итератор это отдельная сущность, а у нас состояние самого объекта.
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Например в системе 100 процесов, ты начал перечислять их и на 20 передумал и перестал это делать (например из-за сбоя в программе). Если теперь ты снова решишь их перечислить, то без Process32First перечислятся оствшиеся 80, а 20 ранее перечисленных останутся "за кадром". Использование Process32First гарантирует что всегда перечислятся все процессы. Объект - снимок системы на основе которого ты и перечисляешь.
     
  18. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну да. Так-то всё понятно. Только, наверное, приостановка не из-за сбоя программы, да? Cбой программы- это авария. Но не берусь спорить, может существуют способы как-то продолжать прогу, не знаю. А вот так понятно:
    Схема:

    Перечисляем первые 20 процессов из 100 (в цикле со счётчиком)
    Потом делаем некоторые действия (хэндл снимка системы не закрываем)
    Начинаем перечислять процессы сначала (И вот тут нужна Process32First)

    Понятно, что. Просто сами понимаете, Process32First нужно использовать там, где её НУЖНО использовать. В других случаях- не знаю.
    Хотя, это, наверное, правило хорошего тона в программировании.
    Спасибо, тему закрыть можно.
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Да почитай про SEH и VEH, с их помощью как раз возможна ситуация, когда обработчик исключения откатит программу в состояние когда снимок уже сделан, а перечисление не завершено.