PDA

Просмотр полной версии : Получить параметры командной строки


Yegor
18.06.2010, 20:38
Хочу автоматизировать создание ярлыков для Л2. Кто может подсказать как можно получить параметры командной строки другого приложения. Какие то существует для этого функции в WINAPI, а то гугл молчит как партизан?

alexteam
18.06.2010, 20:55
в аттаче

Yegor
18.06.2010, 21:26
Спасибо. А как можно программно узнать последовательность запуска процессов?

alexteam
18.06.2010, 22:48
отслеживая их запуск ? %)

Yegor
19.06.2010, 03:27
А не отслеживая? Разве нет какой нибудь иерархии вызовов и функций работы сними, что то вроде getprocparent ... ?

lam
19.06.2010, 03:29
по времени создания процесса?
_ttp://www.codeproject.com/KB/threads/getprocesstimes.aspx

Yegor
20.06.2010, 06:13
lam, могут быть неоднозначности когда 2 процесса запускаются почти одновременно..
ProcessExplorer откуда то показывает точные сведения.

Добавлено через 26 минут
О что то нашел, используя Process32First, Process32Next ищем наш процесс. Когда найдем, в возращенной функцией структуре будет все нужное. Сейчас проверю.


typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32, *PPROCESSENTRY32;

Добавлено через 18 часов 5 минут
Все получилось. Вот рабочая функция, может кому пригодится.


function GetParentProcessID(procID: cardinal): cardinal;
var
hSnap: cardinal;
procEntry: tagPROCESSENTRY32;
begin
Result:= 0;
hSnap:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
procEntry.dwSize:= SizeOf(procEntry);
if Process32First(hSnap, procEntry) then
begin
repeat
if procEntry.th32ProcessID = curProcID then
begin
Result:= procEntry.th32ParentProcessID;
break;
end;
until not Process32Next(hSnap, procEntry);
end
else
begin
ShowMessage(SysErrorMessage(GetLastError));
end;
CloseHandle(hSnap);
end;

Prixmegently
20.06.2010, 11:02
И как тебе ид парент процесса поможет узнать последовательность запуска процессов?

Yegor
20.06.2010, 12:36
Prixmegently, а что из функции не видно как?

procEntry.th32ParentProcessID

Добавлено через 25 минут
alexteam, что то твоя функция постоянно возвращает пустую строку. Ты её проверял?



LengthCmdLine := PWord(Longint(Buffer) + $42)^; возращает 2 хотя командная строка гораздо длиннее.

После выполнения PosCmdLine := Pointer(PLongint(Longint(Buffer) + $44)^); PosCmdLine = nil.

Morfik
20.06.2010, 12:50
проверил GetProcessCmdLine
MessageBox(0,pchar(GetProcessCmdLine(GetCurrentPro cessID)),'',0); и правда непашет :)

можеш изнутри процесса выцепить свои логин и пасс


procedure LineageII_acc_manager;
var
get_param,login,pass:string;
i:integer;
begin
i:=1;
get_param:=ParamStr(1);
while (get_param[i]<>':') do Inc(i);
Inc(i);
while (get_param[i]<>char(0)) do
begin
login:=login+get_param[i];
Inc(i);
end;

i:=1;
get_param:=ParamStr(2);
while (get_param[i]<>':') do Inc(i);
Inc(i);
while (get_param[i]<>char(0)) do
begin
pass:=pass+get_param[i];
Inc(i);
end;
MessageBox(0,pchar(login),pchar(pass),0);

end;

alexteam
20.06.2010, 13:01
во первых. не моя.
гугл. как бэ.

Добавлено через 2 минуты
исправил на рабочий вариант.
и все же лучше получать ее создав к примеру нить ремоттшридом, копаццо в пеб - изврат.
да и привелегии отладчика могут понадобится.

Yegor
20.06.2010, 14:03
Работает.


Мое приложение прослушивает порт к которому конектятся внедренные dll. Как то реально вычислить threadID подключаемого к сокету процесса или проще чтобы сам процесс прислал это значение?

alexteam
20.06.2010, 14:05
чтобы сам процесс прислал это значение
как бы..

Yegor
20.06.2010, 14:20
alexteam, прийдется VC ставить чтобы перекомпилить dll :(

Очередной раз поставил delphi 2007 и убедился что там глюк на глюке. После Delphi 7 что то выпускалось полностью рабочее из этой серии?

xkor
20.06.2010, 20:46
Как то реально вычислить threadID подключаемого к сокету процессаthreadID хз, proccessId как нефиг делать)

Yegor
20.06.2010, 20:54
xkor, мне этого будет достаточно. Как это можно вычислить?

alexteam
20.06.2010, 21:13
http://smeschini.altervista.org/download/netstat32.php

Yegor
21.06.2010, 00:19
Я смотрю чтобы однозначно идентифицировать нужный процесс из нескольких подключившихся к моему сокету нужно знать его RemotePort. Как его вычислить? Мне известен только номер сокета в моем приложении к которому он подключился.

J-Fobos
21.06.2010, 00:27
Чуть не в тему...
Не подскажите какие еще параметры запуска поддерживает клиент линейки кроме -INI, -USERINI и -L2PROTOCOLVERSION ?

Yegor
21.06.2010, 01:16
О нашел, адрес и порт клиента возвращается при выполнении функции Accept

lam
21.06.2010, 01:59
Чуть не в тему...
Не подскажите какие еще параметры запуска поддерживает клиент линейки кроме -INI, -USERINI и -L2PROTOCOLVERSION ?

.exe-шник от fyyre похоже может эти:
-REPLAY <?параметр имя реплея?>
-L2ProtocolVersion (синоним -L2PV)
-L2CheckResource (синоним -L2CR)
-L2NPGE (при наличии этой установит какую-то переменную из core.dll в 1
ИДА подсказывает что её зовут "int GL2NPGEPacking")

P.S. для GFE который

Yegor
21.06.2010, 04:39
Если кому надо тут подробно описано получение информации об открытых соединениях с помощью функции AllocateAndGetTcpExTableFromStack
http://www.xakep.ru/magazine/xa/098/122/1.asp

Добавлено через 46 минут
Мля, так и знал что будет подвох. Все сделал и в конечном итоге получил pid файрволла через который идут все соедения. Наверно прийдется все таки присылать pid процесса.

xkor
21.06.2010, 10:56
Yegor, ну раз соединения идут не напрямую а через процесс фаервола то да...

Yegor
21.06.2010, 12:08
xkor, да я вот поставил Eset Smart Sequrity, не могу найти как для избранных приложений пустить трафф без проверки. Тупой какой то антивирус. Буду возращаться на КИС.