Друзья! Всё так и есть, процесс, который у меня берётся невесть откуда, не может существовать в принципе! Смотрите, чё я делаю, у меня есть папка "E:\Dev-Cpp_nomingw", в которой лежит файл devcpp.exe (там у меня IDE Dev-Cpp) 1) ОТкрываю devcpp.exe в OllyDbg и ставлю 2 бряка: на CreateProcess и на выходе из этой функции (retn 28), соответственно по адресам 0X7c802367 и 0X7c802394 2) Жму на F9 и брякаюсь на CreatepRocess, вот такие у меня параметры: Код (Text): ModuleFileName = NULL CommandLine = "make.exe --v" pProcessSecurity = 0012FC34 pThreadSecurity = 0012FC34 InheritHandles = TRUE CreationFlags = 0 pEnvironment = NULL CurrentDir = "E:\Dev-Cpp_nomingw" pStartupInfo = 0012FCB8 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): #include <stdio.h> #include <windows.h> #include <conio.h> int f (char* ima_direktorii_i_rashirenie){ WIN32_FIND_DATA FindFileData; HANDLE hf; hf = FindFirstFile(ima_direktorii_i_rashirenie,&FindFileData); if(hf != INVALID_HANDLE_VALUE){ do{ printf("%s\n",FindFileData.cFileName); } while(FindNextFile(hf,&FindFileData) != 0); FindClose(hf); } getch(); return 0; } int main(){ f ((char*)"E:\\Dev-Cpp_nomingw\\*.exe"); getch(); return 0; } программка N 2 Код (Text): #include <stdio.h> #include <Windows.h> #include <Winnt.h> #include <tlhelp32.h> #include <vector> #include <string> using namespace std; FILE *f; //ïðèíèìàåò: //È âåêòîð èì¸í ïðîöåññîâ bool f_ima_parrent_process (HANDLE, vector<string>); //+ //+ //+ //+ //+ bool SpisokProcessov () { //ÝÒî âåêòîð äëÿ èì¸í ïðîöåññâî vector<string> vec; HANDLE hProcessSnap; PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); //Ýòî ìû íàõîäèì äåñêðèïòîð ñíèìêà ïðîöåññîâ hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return false; //Èùåì ïðîöåññû Process32First(hProcessSnap, &pe32); vec.push_back (string(pe32.szExeFile)); while (Process32Next(hProcessSnap, &pe32)) { vec.push_back (string(pe32.szExeFile)); } f_ima_parrent_process (hProcessSnap, vec); CloseHandle(hProcessSnap); return true; } //+ //+ //+ //+ //+ int main () { SetConsoleCP (1251); SetConsoleOutputCP (1251); f = fopen("rezultat.txt","wb"); while (1) { SpisokProcessov (); } fclose (f); getchar (); return 0; } //+ //+ //+ //+ //+ bool f_ima_parrent_process (HANDLE hProcessSnap, vector<string> vec) { PROCESSENTRY32 pe32; DWORD ParrentPID= 0; pe32.dwSize = sizeof(PROCESSENTRY32); for (int i= 0; i< (int)vec.size(); i++) { char temp [MAX_PATH]; strcpy(temp, vec[i].c_str()); char parrent [MAX_PATH]; //Ñïåðâà íàéä¸ì PID ðîäèòåëüñêîãî ïðîöåññà Process32First(hProcessSnap, &pe32); if (!strcmp (temp, pe32.szExeFile)) { ParrentPID= pe32.th32ParentProcessID; } else { while (Process32Next(hProcessSnap, &pe32)) { if (!strcmp (temp, pe32.szExeFile)) { ParrentPID= pe32.th32ParentProcessID; break; } } } //Òåïåðü åãî èìÿ if (ParrentPID) { Process32First(hProcessSnap, &pe32); if (ParrentPID== pe32.th32ProcessID) { strcpy (parrent, pe32.szExeFile); } else { while (Process32Next(hProcessSnap, &pe32)) { if (ParrentPID== pe32.th32ProcessID) { strcpy (parrent, pe32.szExeFile); break; } } } } //Âûâîä printf (" %s\n",temp); fprintf(f,"%s \n",temp); if (!ParrentPID) { printf ("èìÿ ðîäèòåëÿ íå íàøëè\n\n"); fprintf(f,"èìÿ ðîäèòåëÿ íå íàøëè\n\n"); } else { printf ("Ýòî ðîäèòåëü %s\n\n", parrent); fprintf(f,"Ýòî ðîäèòåëü: %s\n\n", parrent); } } printf ("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n"); fprintf(f,"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n"); return true; }; спасибо, кто откликнется
amvoz У меня дежа вю, или мы это уже обсуждали? Смотрим внимательно MSDN с описанием ф-ии CreateProcess: Переменная окружения PATH ! Причём наиболее вероятно, что сам Dev-C++ её и дополняет нужным путём перед компиляцией.
Де жа вю Посмотрите внимательно на рисунки, которые я приложил к той теме. Там ситуация виделась мне зеркальной нынешней: файл g++ ЕСТЬ в текущей директории, а процесс g++ не создавался (это я так думал, то есть темы не идентичны. Как потом выяснилось, g++ как раз-таки создавался, но он порождал и другие процессы, в частности as.exe и поскольку не мог их найти, выводил дурацкое сообщение: Код (Text): g++ CreateProcerss: No such file or Directory типа так трудно укзатаь, чего именно нет... ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Но это всё дела давно минувших дней. Нет, devcpp.exe не меняет PATH, брякнулся на CreateProcess, посмотрел PATH и прошёлся ещё раз поиском по директориям: Код (Text): C:\windows\system32- make.exe нет; C:\windows- make.exe нет; C:\windows\System32\Wbem- make.exe нет; C:\masm32\bin- make.exe нет; C:\Program Files\Microsoft SQL Server\90\Tools\binn- make.exe нет; E:\MKVtoolnix- make.exe нет; CreateProcess вернула тем не менее 1
А есть какой-нибудь план, как мне "заморозить" make.exe (он очень кратковременный!)? Тогда бы я точно определил, откуда он взялся! ...Поменял в отладчике флаг на CREATE_SUSPENDED, запустил, make.exe создался, "заморозился", но ProcessExplorer отказывается показывать к нему путь! Пытался прогаммно- не вышло... Программу для нахождения пути писал сам, может скинет кто более профессиональную самопальную прогу, как найти полный путь к запущенному процессу, а то я на коленке клепаю свои... С горем пополам получил cm и путь, ожидаемо: cm make.exe --v put E:\Dev-Cpp_nomingw\Bin\make.exe Но откуда оно взялось? Почему так? Буду думать. +++++++++++++++++++++++++++++++++++++++++++++++++++ По бряку на CreateProcess состояние переменной PATH такое: Код (Text): PATH= C:\WINDOWS\system32; C:\WINDOWS; C:\WINDOWS\System32\Wbem; C:\masm32\bin; C:\Program Files\Microsoft SQL Server\90\Tools\binn\; E:\MKVtoolnix; В консоли всё это естественно, в одну строку. В этом свете вопрос: "откуда берётся E:\Dev-Cpp_nomingw\Bin\make.exe" ставится ещё более остро
amvoz Именно так. Но по сути это ничего не меняет. Я и не говорил, что они идентичны. Имелось в виду, что причина нахождения или ненахождения образа одна и та же: наличие пути в переменной PATH. И с прошлого раза Вы эту причину так и не усвоили. Да неужели? И как же Вы проверяли содержимое PATH? Не уж то в контексте процесса devcpp?
А я другой вывод сделал из прошлой темы: g++ не находит некоторых файлов, в частности as.exe потому, что их у меня нет. Я поставил пакет binutils и эти файлы у меня появились. По бряку на CreateProcerss скомандовал в консоли PATH ...Ваша правда была, я брякнулся на CreateProcess и вызвал GetEnvironmentStrings и увидел адрес блока переменных окружения и там нашёл path, точно первое же значение было Код (Text): Path=E:\Dev-Cpp_nomingw\Bin; спасибо, опыта нет вообще я и роду не мог подумать что процесс отсюда берёт эти значения, я думал он как-то эмулирует команду path в консоли. Да, где-то читал об этом, что каждому процессу выделяется блок... и так далее, вспоминаю, но матерьял не отложился в голове. Я исследованием програм занимаюсь от раза к разу к сожалению, не систематически, только по возникновению каких-нибудь проблем.
amvoz Ну... Сейчас уже трудно будет что-то доказать, но не очень-то верится, т.к. MinGW ставится сразу с binutils. Поэтому маловероятно, что as.exe с самого начала не было. Я бы предложил создать cmd (вызовом CreateProcess; если пользоваться чем-то вроде этого, то это не сложнее вызова GetEnvironmentStrings) из контекста devcpp, т.к. по умолчанию окружение наследуется дочерними процессами, и уже оттуда "скомандовать в консоли PATH" , но Ваш вариант тоже ничего.
но я пошёл по-другому пути, я скачал ПУСТУЮ IDE (есть такая возможность) и заполнял её пакетами на свой страх и риск (core, c++ и всякие другие), ибо хотел как бы контролировать предназначение каждого пакета. И вот упустил из виду пакет binutils, но теперь учёный стал.