Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Как узнать CurrentDir другого процесса? |
Посл.ответ | Сообщение |
|
Создано: 11 мая 2006 13:06 · Личное сообщение · #1 |
|
Создано: 11 мая 2006 13:36 · Личное сообщение · #2 Йопт, не судьба поискать в гугле?? Скоро авторы топиков, ответ на вопрос которых находится в гугле в течении нескольких минут, будут баниться. 1. Самый надежный способ узнать полное имя исполняемого файла (путь к экзешнику) - это получить идентификатор его процесса (GetCurrentProcessId) найти его среди запущенных процессов (Process32First, Process32Next)... Полное имя файла будет содержаться в структуре PROCESSENTRY32->szExeFile. Как экстримальный вариант можно из CWinApp->m_pszHelpFilePath... Я чесно говоря не пользовался и не знаю при каких условиях он переопределяется... Запустил диалог вроде пути правильные... (Ответ Straight) Хм... GetModuleFileName тоже работает , может я чего-то торможу... Надо проверить на подводные камни... Век живи век учись! 2. Путь откуда была запущена программа можно узнать (как тут уже правильно подсказали) путем GetCurrentDirectory, однако это совсем не значит что там лежит исполняемый экзешник! Напимер можно запустить экзеху с ярлыка на рабочем столе, тогда курриент директори будет рабочий стол! Чтобы указать путь к файлу совсем не нужна знать полный путь, вы просто пишете ОткрытьФайл("МойФайл.тэкст"), путь сложеться как Текущая дирректория + ИмяОткрываемогоФайла, т.к. Текущая дирректория в частном случае и есть дирректория где лежит экзешник. Если Вы уверены что будете запускать экзеху только путем двойного на нее нажатия то Вас вполне устроит этот вариант. Естественно понятно, что приятней читать ОткрытьФайл("файл.тэкст") чем ОткрытьФайл("С:\Програм Файлз\Моя мега крутая компания\Моя мега крутая прога\файл.тэкст"). Чтобы этого издежать нам нужно бить уверенным что текущая дирректроия - это дирректория с экзехой, для этого из пункта 1 моей писанины добываем путь, полученную деррикторию ставим текущей SetCurrentDirectory. В некоторых своих программах я часто обращаюсь к файлам в дирректории с исполняемым, считаю данный способ оптимальным, т.к. улучшает читабельность. Однако если у Вас файл открывается всего один раз, то смысла проделывать все эти процедуры нет, лучше просто указать полный путь к файлу, дирректорию экзешника можно узнать из пункта 1. (ц)гугл ![]() |
|
Создано: 11 мая 2006 13:50 · Личное сообщение · #3 |
|
Создано: 11 мая 2006 13:58 · Личное сообщение · #4 |
|
Создано: 11 мая 2006 14:06 · Личное сообщение · #5 |
|
Создано: 11 мая 2006 14:12 · Личное сообщение · #6 |
|
Создано: 11 мая 2006 14:23 · Поправил: kkcos · Личное сообщение · #7 См. первый пост ![]() Гугл выдаёт фигню. Ф-ции WinAPI позволяют узнать текущий раб. каталог только текущего процесса. По крайней мере ф-ции, описанные в SDK к Win2k (из C++ Builder6) И ТХЕЛП позволяет максимум узнать путь к экзешнику программы. В Гугле мож и есть куча инфы, только эта инфа где-нить на 55 странице, и то не обязательно. Где то в системе храниться таблица етих currdir, ведь как-то работает GetCurrentDir А как узнать не свою или все записи - знает, похоже, один БГ Или просто SDK устарел ![]() Так что, кто знает, please help и не надо всяких "go to google.com ..." или "смотри SDK" ![]() |
|
Создано: 11 мая 2006 14:44 · Личное сообщение · #8 |
|
Создано: 11 мая 2006 14:45 · Личное сообщение · #9 kkcos Тебе же Ara обьяснил: ставшишь хук на Апи в другом процессе и фильтруеш вхождения. Лишь таким способом ты сможешь реагировать на изменение текущей директории процесса. Не стоит забывать, что текущая директория одна, а потоков может быть много... Для начала поробуй это в дебагере, а уж потом и сам догадаешься какую строку поиска нужно ввести в гугл для предотвращения "эффекта 55 страници" ![]() |
|
Создано: 11 мая 2006 14:50 · Личное сообщение · #10 |
|
Создано: 11 мая 2006 17:20 · Личное сообщение · #11 |
|
Создано: 11 мая 2006 17:22 · Личное сообщение · #12 |
|
Создано: 11 мая 2006 18:26 · Личное сообщение · #13 |
|
Создано: 12 мая 2006 06:23 · Поправил: kropalik · Личное сообщение · #14 в качестве варианта: OpenProcess(...); // выбираем процесс VirtualAllocEx(...); /* выделим в нем децл памяти можно не выделять а использовать ненужный самой проге участок например выравнивание между секциями в какой нибудь dll */ WriteProcessMemory(...); /* запишем туда кусок кода который вызовет GetCurrentDirectory() и затем ExitThread() */ CreateRemoteThread(...); // выполним этот код ReadProcessMemory(...); // прочитаем результат ![]() |
|
Создано: 12 мая 2006 11:46 · Личное сообщение · #15 |
|
Создано: 12 мая 2006 14:27 · Личное сообщение · #16 tundra37 пишет: GetCurrentDirectory() берет инфу из каких-то системных таблиц. Товарища интересует доступ к этим таблицам, минуя длинную цепочку АПИ и всяческие хуки. Ради интереса поковырялся сейчас в недрах GetCurrentDirectoryA... Ну что я могу сказать - за 5 минут можно выдрать алго для своей винды, за час - сделать общий немного поковырявшись в мануалах. Вывод: делать вес ручками - полезно будет. ![]() |
|
Создано: 12 мая 2006 17:44 · Личное сообщение · #17 а вот еще вариант! kkcos Ты хотя бы подробней написал, зачем оно тебе все это надо! А вообще тебе на wasm.ru там Ms-Rem тебе подробно объяснит в своих статьях как тебе найти то, что ты так долго искал, да и еще в исходниках покажет.(таким как kkcos всем туда!) Сам я такое не читаю, потому что знаю, а смотрел так быстрым взглядом, думал, может, что-то новое для себя найду. Ну а если лень как там выше "Скоро авторы топиков, ответ на вопрос которых находится в гугле в течение нескольких минут, будут баниться!" то тогда вот кусок кода, который выдернет директорию другого процесса хоть из ![]() GetWindowThreadProcessId,здесь хендл окна того процесса, что создал это окно ![]() invoke OpenProcess,410h,0,ProcessID push eax mov edi,[esp] invoke EnumProcessModules,edi,ADDR ProcessInstance,128,ADDR ProcessID invoke GetModuleFileNameEx,edi,ProcessInstance,ADDR Buffer,512 invoke SetDlgItemText,hDlg,ID_DIRECTFILENAME,ADDR Buffer call CloseHandle Сам когда-то писал шпион, который показывал мне ID меню ну и всякую прочую чепуху, которая мне нужна была для исследования кода. Kill Demon666 ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 12 мая 2006 17:52 · Личное сообщение · #18 |
|
Создано: 12 мая 2006 18:36 · Личное сообщение · #19 |
![]() |
eXeL@B —› Программирование —› Как узнать CurrentDir другого процесса? |
Эта тема закрыта. Ответы больше не принимаются. |