Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых)

 eXeL@B —› Программирование —› Как узнать CurrentDir другого процесса?
Посл.ответ Сообщение

Ранг: 21.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 мая 2006 13:06
· Личное сообщение · #1

Народ, как узнать рабочий каталог другого процесса в системе?
Ни в WinAPI, ни в Thelp этой ф-ции нет.
Можно ли докопаться до этой инфы из r3 ?




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 11 мая 2006 13:36
· Личное сообщение · #2

Йопт, не судьба поискать в гугле?? Скоро авторы топиков, ответ на вопрос которых находится в гугле в течении нескольких минут, будут баниться.

1.
Самый надежный способ узнать полное имя исполняемого файла (путь к экзешнику) - это получить идентификатор его процесса (GetCurrentProcessId) найти его среди запущенных процессов (Process32First, Process32Next)... Полное имя файла будет содержаться в структуре PROCESSENTRY32->szExeFile.
Как экстримальный вариант можно из CWinApp->m_pszHelpFilePath... Я чесно говоря не пользовался и не знаю при каких условиях он переопределяется... Запустил диалог вроде пути правильные...
(Ответ Straight) Хм... GetModuleFileName тоже работает , может я чего-то торможу... Надо проверить на подводные камни... Век живи век учись!

2. Путь откуда была запущена программа можно узнать (как тут уже правильно подсказали) путем GetCurrentDirectory, однако это совсем не значит что там лежит исполняемый экзешник! Напимер можно запустить экзеху с ярлыка на рабочем столе, тогда курриент директори будет рабочий стол!

Чтобы указать путь к файлу совсем не нужна знать полный путь, вы просто пишете ОткрытьФайл("МойФайл.тэкст"), путь сложеться как Текущая дирректория + ИмяОткрываемогоФайла, т.к. Текущая дирректория в частном случае и есть дирректория где лежит экзешник. Если Вы уверены что будете запускать экзеху только путем двойного на нее нажатия то Вас вполне устроит этот вариант.
Естественно понятно, что приятней читать ОткрытьФайл("файл.тэкст") чем ОткрытьФайл("С:\Програм Файлз\Моя мега крутая компания\Моя мега крутая прога\файл.тэкст"). Чтобы этого издежать нам нужно бить уверенным что текущая дирректроия - это дирректория с экзехой, для этого из пункта 1 моей писанины добываем путь, полученную деррикторию ставим текущей SetCurrentDirectory.
В некоторых своих программах я часто обращаюсь к файлам в дирректории с исполняемым, считаю данный способ оптимальным, т.к. улучшает читабельность. Однако если у Вас файл открывается всего один раз, то смысла проделывать все эти процедуры нет, лучше просто указать полный путь к файлу, дирректорию экзешника можно узнать из пункта 1.
(ц)гугл



Ранг: 21.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 мая 2006 13:50
· Личное сообщение · #3

Пользователь открывает WINCMD и переходит в дир. X
Как узнать X, если моя программа запущенна не из
WINCMD, и сам он запущен из папки Y!=X ???

ЗЫ В Гугле выдается куча всякой фигни , либо по линуху, либо по ТХЕЛП,
но пользы от этого никакой.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 11 мая 2006 13:58
· Личное сообщение · #4

kkcos пишет:
Пользователь открывает WINCMD и переходит в дир. X


kkcos пишет:
Как узнать X, если моя программа запущенна не из
WINCMD, и сам он запущен из папки Y!=X ???

Нифига не понял...При чем тут cmd, если оно тебе не нужно? =) К слову чтоли написал?



Ранг: 21.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 мая 2006 14:06
· Личное сообщение · #5

Мне нужно узнать текущий рабочий каталог процесса.
Например, если открыт cmd, то отслеживать выполнение команды cd.
Только не конкретно для cmd, а для любого процесса, вызывающего
SetCurrentDirectory




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 11 мая 2006 14:12
· Личное сообщение · #6

kkcos пишет:
Только не конкретно для cmd, а для любого процесса, вызывающего
SetCurrentDirectory

Тогда хучь АПИ, инфы дохрена в гугле.



Ранг: 21.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 мая 2006 14:23 · Поправил: kkcos
· Личное сообщение · #7

См. первый пост
Гугл выдаёт фигню.
Ф-ции WinAPI позволяют узнать текущий раб. каталог только текущего процесса.
По крайней мере ф-ции, описанные в SDK к Win2k (из C++ Builder6)
И ТХЕЛП позволяет максимум узнать путь к экзешнику программы.
В Гугле мож и есть куча инфы, только эта инфа где-нить на 55 странице, и то не обязательно.

Где то в системе храниться таблица етих currdir, ведь как-то работает GetCurrentDir
А как узнать не свою или все записи - знает, похоже, один БГ
Или просто SDK устарел

Так что, кто знает, please help
и не надо всяких "go to google.com ..." или "смотри SDK"




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 11 мая 2006 14:44
· Личное сообщение · #8

kkcos пишет:
Ф-ции WinAPI позволяют узнать текущий раб. каталог только текущего процесса.

Бля. Читай второй пост.



Ранг: 64.6 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 11 мая 2006 14:45
· Личное сообщение · #9

kkcos
Тебе же Ara обьяснил: ставшишь хук на Апи в другом процессе и фильтруеш вхождения. Лишь таким способом ты сможешь реагировать на изменение текущей директории процесса. Не стоит забывать, что текущая директория одна, а потоков может быть много...
Для начала поробуй это в дебагере, а уж потом и сам догадаешься какую строку поиска нужно ввести в гугл для предотвращения "эффекта 55 страници"



Ранг: 21.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 мая 2006 14:50
· Личное сообщение · #10

Step
спасибо
это будет вариант № 1
правда он будет полезен только, если
сам запускаешь другую прогу (или её
запускает пользователь, но после запуска
"шпиона" )



Ранг: 42.4 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 11 мая 2006 17:20
· Личное сообщение · #11

А что, так проблемно грузить шпион при загрузке машины?




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 11 мая 2006 17:22
· Личное сообщение · #12

kkcos
Похоже ты сам не знаешь, что хочешь. Сделай драйвер с глобальным перехватом API



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 11 мая 2006 18:26
· Личное сообщение · #13

Как же мне надоели трояно и шпионо писатели, особенно такие которые с ассемблером
и Win API только вчера познакомились..
И вообще не понятно каким боком такая деятельность относится к кряку?



Ранг: 10.5 (новичок)
Активность: 0=0
Статус: Участник

Создано: 12 мая 2006 06:23 · Поправил: kropalik
· Личное сообщение · #14

в качестве варианта:
OpenProcess(...); // выбираем процесс
VirtualAllocEx(...); /* выделим в нем децл памяти
можно не выделять а использовать ненужный самой
проге участок например выравнивание между
секциями в какой нибудь dll */
WriteProcessMemory(...); /* запишем туда кусок кода который
вызовет GetCurrentDirectory() и затем ExitThread() */
CreateRemoteThread(...); // выполним этот код
ReadProcessMemory(...); // прочитаем результат



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 12 мая 2006 11:46
· Личное сообщение · #15

kropalik пишет:
вызовет GetCurrentDirectory()

Попытаюсь поянить, что спрашивают. GetCurrentDirectory() берет инфу из каких-то системных таблиц. Товарища интересует доступ к этим таблицам, минуя длинную цепочку АПИ и всяческие хуки.



Ранг: 186.8 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 12 мая 2006 14:27
· Личное сообщение · #16

tundra37 пишет:
GetCurrentDirectory() берет инфу из каких-то системных таблиц. Товарища интересует доступ к этим таблицам, минуя длинную цепочку АПИ и всяческие хуки.

Ради интереса поковырялся сейчас в недрах GetCurrentDirectoryA... Ну что я могу сказать - за 5 минут можно выдрать алго для своей винды, за час - сделать общий немного поковырявшись в мануалах. Вывод: делать вес ручками - полезно будет.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 12 мая 2006 17:44
· Личное сообщение · #17

а вот еще вариант!
kkcos
Ты хотя бы подробней написал, зачем оно тебе все это надо!
А вообще тебе на wasm.ru там Ms-Rem тебе подробно объяснит в своих статьях как тебе найти то, что ты так долго искал, да и еще в исходниках покажет.(таким как kkcos всем туда!)
Сам я такое не читаю, потому что знаю, а смотрел так быстрым взглядом, думал, может, что-то новое для себя найду.
Ну а если лень как там выше "Скоро авторы топиков, ответ на вопрос которых находится в гугле в течение нескольких минут, будут баниться!" то тогда вот кусок кода, который выдернет директорию другого процесса хоть из

GetWindowThreadProcessId,здесь хендл окна того процесса, что создал это окно,ADDR ProcessID
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




Ранг: 46.5 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 12 мая 2006 17:52
· Личное сообщение · #18

Asterix пишет:
И вообще не понятно каким боком такая деятельность относится к кряку?

Действительно ведь раздел называется околокрэкинговое программирование, а тут хотят написать какой то шпион или троян



Ранг: 21.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 мая 2006 18:36
· Личное сообщение · #19

не шпион и не троян, а вполне нормальная оболочка
короче, пора скачивать символы к системным библиотекам
и идти на wasm.ru
короче, "крэкеры", вопрос исчерпан


 eXeL@B —› Программирование —› Как узнать CurrentDir другого процесса?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати