Чтение Параметров командной строки Другого Процесса (Win32 C код)

Я согласен с @Aaron, но если вы все еще хотите точно sed, посмотрите на это:

$  cat /tmp/del.txt
void some_function_declaration(char var1, char var2)
{
  ...
}
void enother_function_declaration(char var1, char var2)
{
  ...
}

И применяя sed:

$ cat /tmp/del.txt | sed ':a;N;$!ba;s/)\n{/)\{\ntime_exe(__func__, cl(clock()));/g'
void some_function_declaration(char var1, char var2){
time_exe(__func__, cl(clock()));
  ...
}
void enother_function_declaration(char var1, char var2){
time_exe(__func__, cl(clock()));
  ...
}

Я думаю, это выглядит так, как вы хотели

UPD

Позвольте мне объяснить ..

Более кроссплатформенный совместимый синтаксис:

sed -e ':a' -e 'N' -e'$!ba' -e 's/)\n{/)\n{ ... ;/g'

, где

  • ':a' - создает метку ветви (с именем a) которые могут быть возвращены позже
  • 'N' - добавляет следующую строку к текущей (с \n между ними)
  • '$!ba' - переходит на метку a, если следующая строка - последняя строка
  • 's/)\n{/)\n{ ... ;/g' - выполняет глобальное замещение в одной строке, состоящей из всех строк и \n с
9
задан Jay 9 October 2009 в 17:50
поделиться

4 ответа

Для ответа на мой собственный вопрос я наконец нашел решение CodeProject, которое делает точно, что я ищу:

http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx

Как @Reuben уже указанный, можно использовать NtQueryProcessInformation для получения этой информации. Unfortuantely это не рекомендуемый подход, но, учитывая единственное другое решение, кажется, для несения издержек запроса WMI, я думаю, что мы проявим этот подход на данный момент.

Обратите внимание, что это, кажется, не работает при использовании кода, скомпилированного из Windows на 32 бита в Windows OS на 64 бита, но так как наши модули компилируются из источника на цели, которая должна быть хорошо для наших целей. Я использовал бы этот существующий код и если он прерывает Windows 7 или более позднюю дату, мы можем снова посмотреть на использование WMI. Спасибо за ответы!

ОБНОВЛЕНИЕ: более краткое и C только (в противоположность C++) версия той же техники проиллюстрированы здесь:

http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/

6
ответ дан 4 December 2019 в 13:05
поделиться

Кэшируемое решение: http://74.125.45.132/search?q=cache:-wPkE2PbsGwJ:windowsxp.mvps.org/listproc.htm+running+process+command+line&hl=es&ct=clnk&cd=1&gl=ar&client=firefox-a

in CMD
WMIC /OUTPUT:C:\ProcessList.txt PROCESS get Caption,Commandline,Processid

or

WMIC /OUTPUT:C:\ProcessList.txt path win32_process get Caption,Processid,Commandline

Также: http://mail.python.org/pipermail/python-win32/2007-December/006498.html

http://tgolden.sc.sabren.com/python/wmi_cookbook.html#running_processes 
seems to do the trick:

import wmi
c = wmi.WMI ()
for process in c.Win32_Process ():
  print process.CommandLine
5
ответ дан 4 December 2019 в 13:05
поделиться

Подход WMI, упомянутый в другом ответе, является, вероятно, самым надежным способом сделать это. Просматривая MSDN, я определил то, что похоже на другой возможный подход; это документируется, но не ясный, поддерживается ли это полностью. На языке MSDN, этом-

может быть изменен или недоступный в будущих версиях Windows...

В любом случае, при условии, что Ваш процесс имеет правильные полномочия, необходимо смочь звонить NtQueryProcessInformation с a ProcessInformationClass из ProcessBasicInformation. В возвращенном PROCESS_BASIC_INFORMATION структура, необходимо возвратить указатель на блок выполнения процесса целевого процесса (как поле PebBaseAddress). ProcessParameters поле PEB даст Вам подсказку к RTL_USER_PROCESS_PARAMETERS структура. CommandLine поле той структуры будет a UNICODE_STRING структура. (Будьте осторожны не, также делают слишком много предположений о строке; нет никаких гарантий, что это будет ЗАВЕРШЕНО ПУСТЫМ УКАЗАТЕЛЕМ, и не ясно, необходимо ли будет снять изоляцию с названия выполняемого приложения с начала командной строки.)

Я не попробовал этот подход - и как я упомянул выше, это кажется немного... сомнительным (чтение: непортативный) - но это могло бы стоить попытки. Всего наилучшего...

2
ответ дан 4 December 2019 в 13:05
поделиться

Если Вы не родитель этих процессов, то это не зарегистрированные функции возможного использования :( Теперь, если Вы - родитель, можно сделать прием CreateRemoteThread, но иначе Вы почти наверняка получите Доступ запрещен, если Ваше приложение не будет иметь права администратора.

0
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: