Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2011, 20:25   #1
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию Командлайн чужого процесса

Здравствуйте, уважаемые!

Есть такая замечательная прога, как Process Explorer.
В ней можно включить отображение Командной строки запущенного процесса.

Как сие можно получить? Мне нужно узнать, с какими параметрами был запущен процесс.

PS: Ни в жизнь не поверю, что только ковыряниями в памяти.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 13.07.2011, 20:37   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

CreateRemoteThread в другом процессе.
Естественно из dll.
Человек_Борща вне форума Ответить с цитированием
Старый 13.07.2011, 20:46   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Такой вариант рассматривал... Только не создание удаленного потока, а внедрение dll и в дальнейшем WM_COPYDATA или мьютекс... Но... Это слишком долго.
Есть ещё одна идеечка, если получится - поделаюсь.

Но я всё ещё жду Ваших советов!

Добавлено:

В функции OpenProcess параметр PROCESS_ALL_ACCESS включает в себя PROCESS_QUERY_INFORMATION и PROCESS_CREATE_THREAD? Или не прав? Почему в разных примерах используют только конкретные флаги? Почему не используют полный доступ, если есть такая возможность (после получения дебаговых привилегий)?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 13.07.2011 в 20:50.
Johnson вне форума Ответить с цитированием
Старый 13.07.2011, 21:07   #4
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Хм... Получилось что-то среднее.. Думаю, это быстрее, чем орудовать с библиотеками своими. Но память читать всеравно пришлось, хоть и по известному адресу...

Вопрос профессионалам - как сей программизм можно оптимизировать? Добавление в список тут самый медленный процесс, как я считаю, но это временная демонстрационная мера. В дальнейшем я буду загонять в массив.
Как можно оптимизировать сам поиск командлайна?
Буду ОЧЕНЬ благодарен за советы!

Код (думаю, кому надо - применить смогут):
Код:
procedure GetProcessFullInfo;
var
  procCount:Cardinal;
  hProc,hThread: THandle;
  i:Integer;
  pGetCommandLine : Pointer;
  dwTID, dwRead : DWord;
  pCommandLine : PChar;
  szBuffer : array[0..255] of Char;
  procs: array[0..$FFF] of dword; //массив для хранения дескрипторов процессов
begin
  if not EnumProcesses(@procs, sizeof(procs), procCount) then exit;

  MainForm.list1.Clear;

  for i := 0 to procCount div 4 - 1 do if procs[i]<>4 then begin
    EnablePrivilegeEx(INVALID_HANDLE_VALUE,'SeDebugPrivilege');
    hProc := OpenProcess(PROCESS_ALL_ACCESS, false, procs[i]);
    if (hProc <> 0) then try
      pGetCommandLine := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetCommandLineA');
      if (pGetCommandLine <> nil) then begin
        hThread := CreateRemoteThread(hProc, NIL, 0, pGetCommandLine, nil, 0, dwTID);
        if (hThread <> 0) then try
            if WAIT_OBJECT_0 = WaitForSingleObject(hThread, 10000) then begin
              if GetExitCodeThread(hThread, PDWord(@pCommandLine)^) then begin
                if ReadProcessMemory(hProc, pCommandLine, @szBuffer, 255, dwRead) then begin
                  szBuffer[dwRead] := #0;
                end
              end
            end
        finally
          CloseHandle(hThread);
        end;
      end;
    finally
      CloseHandle(hProc);
    end;
    with MainForm.list1.Items.Add do begin
      Caption := String(szBuffer);
    end;
  end;

end;

На EnablePrivilegeEx не смотрите - это у меня свой модель технический. В сети полно способов получить дебаг привилегии.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 13.07.2011 в 21:10.
Johnson вне форума Ответить с цитированием
Старый 13.07.2011, 21:17   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Почему не используют полный доступ, если есть такая возможность (после получения дебаговых привилегий)?
запрашивайте только нужные привилегии.
а то окажется так что у вас нет привилегии, той которая вам не нужна(но в куче вы её просите), глупо валится изза такой мелочи.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.07.2011, 21:43   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

есть ещё NtQueryInformationProcess().
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чистка памяти чужого процесса Virus25 Общие вопросы Delphi 1 30.05.2011 07:42
закрытие чужого процесса Dimon Win Api 7 12.05.2010 12:01
Изменение чужого процесса Namolem Общие вопросы C/C++ 3 02.02.2010 13:38
Приоритет чужого процесса (консультация) Air Win Api 9 06.03.2008 20:05
Ждать завершения чужого процесса ERASERROR Win Api 2 04.02.2008 08:23