почему запускается процесс, который в ПРИНЦИПЕ не должен создаваться?

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

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! Всё так и есть, процесс, который у меня берётся невесть откуда, не может существовать в принципе!
    Смотрите, чё я делаю, у меня есть папка "E:\Dev-Cpp_nomingw", в которой лежит файл devcpp.exe (там у меня IDE Dev-Cpp)
    1) ОТкрываю devcpp.exe в OllyDbg и ставлю 2 бряка: на CreateProcess и на выходе из этой функции (retn 28), соответственно по адресам 0X7c802367 и 0X7c802394
    2) Жму на F9 и брякаюсь на CreatepRocess, вот такие у меня параметры:
    Код (Text):
    1. ModuleFileName = NULL
    2. CommandLine = "make.exe --v"
    3. pProcessSecurity = 0012FC34
    4. pThreadSecurity = 0012FC34
    5. InheritHandles = TRUE
    6. CreationFlags = 0
    7. pEnvironment = NULL
    8. CurrentDir = "E:\Dev-Cpp_nomingw"
    9. pStartupInfo = 0012FCB8
    10. pProcessInfo = 0012FCA8
    Итак, что за процесс я запускаю? Его имя make.exe (поскольку первый параметр ноль), но где находится файл make.exe?
    Коль скоро "родитель" находится в "E:\Dev-Cpp_nomingw", то там и долже находиться make.exe, но его там нет! То есть просто и абсолютно нет!

    3) На всякий случай запускаю программку N 1, которая шерстит директорию "E:\Dev-Cpp_nomingw", может, он там "спрятался" или чё? Нет его!
    4) Теперь запускаю програмку N 2, специально для этого написанную. Она выводит в файл rezultat.txt циклически все процессы системы и.
    5) После этого осталось только нажать F9, брякнуться на 0X7c802394 и посмореть, что в EAX находится единица- вот он момент истины- процесс make.exe создался удачно.
    6) Но, может быть у меня чё не то со зрением или глючит отладчик? А не зря у меня пргограммка N 2 запущена, я её закрываю и смотрю результат в файле rezultat.txt. я уже говорил, там список процессов выводится циклом, так вот, там присутствует процесс make.exe всего 4 раза, то есть он отрабатывает очень-очень быстро, но он же есть!

    Программки прикладываются, не знал, как их сжать.
    ...Вчера я шутдировал оба диска (у меня C И E) на предмет там наличия файла make.exe ну хоть ГДЕ-НИБУДЬ. Он есть, но совсем в каких-то левых директориях и уж точно не тех, которые прописаны в переменной среды path

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Программка N1
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3. #include <conio.h>
    4. int f (char* ima_direktorii_i_rashirenie){
    5.         WIN32_FIND_DATA FindFileData;
    6.         HANDLE hf;
    7.         hf = FindFirstFile(ima_direktorii_i_rashirenie,&FindFileData);
    8.         if(hf != INVALID_HANDLE_VALUE){
    9.                 do{
    10.                         printf("%s\n",FindFileData.cFileName);
    11.                 }
    12.                 while(FindNextFile(hf,&FindFileData) != 0);
    13.                 FindClose(hf);
    14.         }
    15.         getch();
    16.         return 0;
    17. }
    18. int main(){
    19.         f ((char*)"E:\\Dev-Cpp_nomingw\\*.exe");
    20.         getch();
    21.         return 0;
    22. }
    программка N 2
    Код (Text):
    1. #include <stdio.h>
    2. #include <Windows.h>
    3. #include <Winnt.h>
    4. #include <tlhelp32.h>
    5. #include <vector>
    6. #include <string>
    7. using namespace std;
    8.  
    9.  
    10. FILE *f;
    11.  
    12. //ïðèíèìàåò:
    13. //È âåêòîð èì¸í ïðîöåññîâ
    14. bool f_ima_parrent_process (HANDLE, vector<string>);
    15.  
    16.                                   //+
    17.                                   //+
    18.                                   //+
    19.                                   //+
    20.                                   //+
    21. bool SpisokProcessov ()  {
    22.  
    23.  //ÝÒî âåêòîð äëÿ èì¸í ïðîöåññâî
    24.  vector<string> vec;
    25.  
    26.  HANDLE hProcessSnap;
    27.  
    28.  PROCESSENTRY32 pe32;
    29.  pe32.dwSize = sizeof(PROCESSENTRY32);
    30.  
    31.  //Ýòî ìû íàõîäèì äåñêðèïòîð ñíèìêà ïðîöåññîâ
    32.  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    33.  if (hProcessSnap == INVALID_HANDLE_VALUE)
    34.  return false;
    35.  
    36.  
    37.  
    38.  //Èùåì ïðîöåññû
    39.  Process32First(hProcessSnap, &pe32);
    40.  vec.push_back (string(pe32.szExeFile));
    41.  while (Process32Next(hProcessSnap, &pe32)) {
    42.   vec.push_back (string(pe32.szExeFile));
    43.  }
    44.  
    45.  f_ima_parrent_process (hProcessSnap, vec);
    46.  CloseHandle(hProcessSnap);
    47.  return true;
    48. }
    49.                                   //+
    50.                                   //+
    51.                                   //+
    52.                                   //+
    53.                                   //+
    54.  
    55. int main () {
    56.  SetConsoleCP (1251);
    57.  SetConsoleOutputCP (1251);
    58.  
    59.  
    60.  
    61.  f = fopen("rezultat.txt","wb");
    62.  while (1) {
    63.   SpisokProcessov ();
    64.  }
    65.  fclose (f);
    66.  getchar ();
    67.  return 0;
    68. }
    69.                                   //+
    70.                                   //+
    71.                                   //+
    72.                                   //+
    73.                                   //+
    74. bool f_ima_parrent_process (HANDLE hProcessSnap, vector<string> vec) {
    75.  
    76.   PROCESSENTRY32 pe32;
    77.   DWORD ParrentPID= 0;
    78.   pe32.dwSize = sizeof(PROCESSENTRY32);
    79.  
    80.   for (int i= 0; i< (int)vec.size(); i++) {
    81.    char temp    [MAX_PATH];
    82.    strcpy(temp, vec[i].c_str());
    83.    char parrent [MAX_PATH];
    84.  
    85.  
    86.    //Ñïåðâà íàéä¸ì PID ðîäèòåëüñêîãî ïðîöåññà
    87.    Process32First(hProcessSnap, &pe32);
    88.    if (!strcmp (temp, pe32.szExeFile)) {
    89.     ParrentPID= pe32.th32ParentProcessID;
    90.    }
    91.    else {
    92.     while (Process32Next(hProcessSnap, &pe32)) {
    93.      if (!strcmp (temp, pe32.szExeFile)) {
    94.       ParrentPID= pe32.th32ParentProcessID;
    95.       break;
    96.      }
    97.     }
    98.    }
    99.  
    100.  
    101.    //Òåïåðü åãî èìÿ
    102.    if (ParrentPID) {
    103.     Process32First(hProcessSnap, &pe32);
    104.     if (ParrentPID== pe32.th32ProcessID) {
    105.      strcpy (parrent, pe32.szExeFile);
    106.     }
    107.     else {
    108.      while (Process32Next(hProcessSnap, &pe32)) {
    109.       if (ParrentPID== pe32.th32ProcessID) {
    110.        strcpy (parrent, pe32.szExeFile);
    111.        break;
    112.       }
    113.      }
    114.     }
    115.    }
    116.  
    117.    
    118.    //Âûâîä
    119.    printf ("  %s\n",temp);
    120.    fprintf(f,"%s \n",temp);
    121.    if (!ParrentPID) {
    122.     printf ("èìÿ ðîäèòåëÿ íå íàøëè\n\n");
    123.     fprintf(f,"èìÿ ðîäèòåëÿ íå íàøëè\n\n");
    124.    }
    125.    else {
    126.     printf ("Ýòî ðîäèòåëü  %s\n\n", parrent);
    127.     fprintf(f,"Ýòî ðîäèòåëü:  %s\n\n", parrent);
    128.    }
    129.   }
    130.   printf ("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n");
    131.   fprintf(f,"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n");
    132.   return true;
    133.  
    134. };
    спасибо, кто откликнется
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    У меня дежа вю, или мы это уже обсуждали? Смотрим внимательно MSDN с описанием ф-ии CreateProcess:
    Переменная окружения PATH ! Причём наиболее вероятно, что сам Dev-C++ её и дополняет нужным путём перед компиляцией.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Де жа вю
    Посмотрите внимательно на рисунки, которые я приложил к той теме. Там ситуация виделась мне зеркальной нынешней: файл g++ ЕСТЬ в текущей директории, а процесс g++ не создавался (это я так думал, то есть темы не идентичны. Как потом выяснилось, g++ как раз-таки создавался, но он порождал и другие процессы, в частности as.exe и поскольку не мог их найти, выводил дурацкое сообщение:
    Код (Text):
    1. g++ CreateProcerss: No such file or Directory
    типа так трудно укзатаь, чего именно нет...
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Но это всё дела давно минувших дней. Нет, devcpp.exe не меняет PATH, брякнулся на CreateProcess, посмотрел PATH и прошёлся ещё раз поиском по директориям:

    Код (Text):
    1. C:\windows\system32- make.exe нет;
    2. C:\windows- make.exe нет;
    3. C:\windows\System32\Wbem- make.exe нет;
    4. C:\masm32\bin- make.exe нет;
    5. C:\Program Files\Microsoft SQL Server\90\Tools\binn- make.exe нет;
    6. E:\MKVtoolnix- make.exe нет;
    CreateProcess вернула тем не менее 1
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    А есть какой-нибудь план, как мне "заморозить" make.exe (он очень кратковременный!)? Тогда бы я точно определил, откуда он взялся!
    ...Поменял в отладчике флаг на CREATE_SUSPENDED, запустил, make.exe создался, "заморозился", но ProcessExplorer отказывается показывать к нему путь! Пытался прогаммно- не вышло... Программу для нахождения пути писал сам, может скинет кто более профессиональную самопальную прогу, как найти полный путь к запущенному процессу, а то я на коленке клепаю свои...

    С горем пополам получил cm и путь, ожидаемо:
    cm make.exe --v
    put E:\Dev-Cpp_nomingw\Bin\make.exe

    Но откуда оно взялось? Почему так? Буду думать.
    +++++++++++++++++++++++++++++++++++++++++++++++++++
    По бряку на CreateProcess состояние переменной PATH такое:
    Код (Text):
    1. PATH=
    2. C:\WINDOWS\system32;
    3. C:\WINDOWS;
    4. C:\WINDOWS\System32\Wbem;
    5. C:\masm32\bin;
    6. C:\Program Files\Microsoft SQL Server\90\Tools\binn\;
    7. E:\MKVtoolnix;
    В консоли всё это естественно, в одну строку. В этом свете вопрос: "откуда берётся E:\Dev-Cpp_nomingw\Bin\make.exe" ставится ещё более остро
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    Именно так. Но по сути это ничего не меняет.
    Я и не говорил, что они идентичны. Имелось в виду, что причина нахождения или ненахождения образа одна и та же: наличие пути в переменной PATH. И с прошлого раза Вы эту причину так и не усвоили.
    Да неужели? И как же Вы проверяли содержимое PATH? Не уж то в контексте процесса devcpp?
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    А я другой вывод сделал из прошлой темы: g++ не находит некоторых файлов, в частности as.exe потому, что их у меня нет. Я поставил пакет binutils и эти файлы у меня появились.
    По бряку на CreateProcerss скомандовал в консоли PATH
    ...Ваша правда была, я брякнулся на CreateProcess и вызвал GetEnvironmentStrings и увидел адрес блока переменных окружения и там нашёл path, точно первое же значение было
    Код (Text):
    1. Path=E:\Dev-Cpp_nomingw\Bin;
    спасибо, опыта нет вообще я и роду не мог подумать что процесс отсюда берёт эти значения, я думал он как-то эмулирует команду path в консоли. Да, где-то читал об этом, что каждому процессу выделяется блок... и так далее, вспоминаю, но матерьял не отложился в голове. Я исследованием програм занимаюсь от раза к разу к сожалению, не систематически, только по возникновению каких-нибудь проблем.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    Ну... Сейчас уже трудно будет что-то доказать, но не очень-то верится, т.к. MinGW ставится сразу с binutils. Поэтому маловероятно, что as.exe с самого начала не было.
    Я бы предложил создать cmd (вызовом CreateProcess; если пользоваться чем-то вроде этого, то это не сложнее вызова GetEnvironmentStrings) из контекста devcpp, т.к. по умолчанию окружение наследуется дочерними процессами, и уже оттуда "скомандовать в консоли PATH" :), но Ваш вариант тоже ничего.
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    но я пошёл по-другому пути, я скачал ПУСТУЮ IDE (есть такая возможность) и заполнял её пакетами на свой страх и риск (core, c++ и всякие другие), ибо хотел как бы контролировать предназначение каждого пакета. И вот упустил из виду пакет binutils, но теперь учёный стал.
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    Ясно. Аргумент засчитан.