Тема: AHK: Получение дополнительной инфы о процессах (Help2Ahk_L)
Из Коллекции скрипт.
Как оказалось — один из этаких краеугольных камней моего постоянно работающего.
Нужен в AHK_L виде.
Прошу не отказать.
#SingleInstance Force
1::
WinGet, PID_Target, PID, % "ahk_id " WinExist("A")
result := GetRemoteCommandLine( PID_Target )
msgbox %result%
return
;*******************************************************************************
; AutoHotkey Version: 1.0.44.09+
; Автор: Androgen Belkin
; Имя скрипта: GetExtProccessInfo().ahk (v.1.1)
;*******************************************************************************
; Функции для:
; 1. Получения пути к исполнимому файлу процесса
; 2. Получения командной строки для процесса
; Известные ограничения:
; а) не удается получить доступ к некоторым (немногим) системным процессам,
; в этом случае функции возвращают пустую строку
; б) функции, возможно, не будут работать в линейке WIN 9x, но я не проверял
;*******************************************************************************
;-------------------------------------------------------------------------------------------------------------
GetModuleFileNameEx( p_pid ) ; функция получения пути к исполнимому файлу процесса (по его PID'у)
{
h_process := DllCall( "OpenProcess", "UInt", 0x10|0x400, "Int", false, "UInt", p_pid ) ; открываем хэндл для PID процесса...
; ...с нужными правами (они понадобятся для GetModuleFileNameExA) и без наследования хэндла
; права: 0x10 = PROCESS_VM_READ, 0x400 = PROCESS_QUERY_INFORMATION
If ( ErrorLevel OR h_process = 0 ) ; если почему-либо не удалось открыть хэндл (или он открыт для несуществующего PID'а)...
Goto, Return_1 ; перейти к закрытию хэндла и выйти из функции
VarSetCapacity( pPath, 259 ) ; обеспечиваем достаточную вместимость переменной (в символах, путь длиннее не бывает)
DllCall( "psapi.dll\GetModuleFileNameExA", "UInt", h_process, "UInt", 0, "Str", pPath, "UInt", 259 ) ; получаем путь...
; ...для указанного хэндла процесса. GetModuleFileNameExA (ANSI), GetModuleFileNameExW (Unicode)
Return_1: ; метка перехода к закрытию хэндла
DllCall( "CloseHandle", h_process ) ; закрываем хэндл
Return, pPath ; возвращаем путь к файлу процесса
} ; конец функции
;-------------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------------
GetRemoteCommandLine( p_pid_target ) ; функция получения командной строки для процесса (по его PID'у)
{
hp_target := DllCall( "OpenProcess", "UInt", 0x10, "Int", false, "UInt", p_pid_target ) ; открываем хэндл для PID процесса...
; ...с правами для чтения 0x10 = PROCESS_VM_READ (нужны для ReadProcessMemory) и без наследования хэндла
If ( ErrorLevel OR hp_target = 0 ) ; если почему-либо не удалось открыть хэндл (или он открыт для несуществующего PID'а)...
Goto, Return_2 ; перейти к закрытию хэндла и выйти из функции
hm_kernel32 := DllCall( "GetModuleHandle", "Str", "kernel32.dll" ) ; узнаем хэндл библиотеки kernel32.dll
pGetCommandLineA := DllCall( "GetProcAddress", "UInt", hm_kernel32, "Str", "GetCommandLineA" ) ; получаем указатель...
; ...на адрес функции GetCommandLineA (ANSI), содержащейся в kernel32.dll
buffer_size = 6 ; количество байт для переменной
VarSetCapacity( buffer, buffer_size ) ; обеспечиваем достаточную вместимость переменной
DllCall( "ReadProcessMemory", "UInt", hp_target, "UInt", pGetCommandLineA, "UInt", &buffer, "UInt", buffer_size, "UInt", 0 )
; для хэндла PID'а получаем перенаправление функцией GetCommandLineA на указатель на адрес командной строки...
; ...и кладем его по адресу "buffer" в памяти
Loop, 4 ; преобразовываем указатель на адрес командной строки в целое число
ppCommandLine += ( ( *( &buffer+A_Index ) ) << ( 8*( A_Index-1 ) ) ) ; создаем целое число, складывая его байты
buffer_size = 4 ; количество байт для переменной
VarSetCapacity( buffer, buffer_size, 0 ) ; обеспечиваем достаточную вместимость переменной, и очищаем её
DllCall( "ReadProcessMemory", "UInt", hp_target, "UInt", ppCommandLine, "UInt", &buffer, "UInt", buffer_size, "UInt", 0 )
; для хэндла PID'а читаем адрес командной строки, и кладем его по адресу "buffer" в памяти
Loop, 4 ; преобразовываем адрес в целое число
pCommandLine += ( ( *( &buffer+A_Index-1 ) ) << ( 8*( A_Index-1 ) ) ) ; создаем целое число, складывая его байты
; Адрес командной строки получен, теперь извлекаем его содержимое
buffer_size = 520 ; столько символов будем читать из командной строки (мне кажется, длиннее быть не может)
VarSetCapacity( result, buffer_size, 1 ) ; обеспечиваем достаточную вместимость переменной, делаем её побайтной
DllCall( "ReadProcessMemory", "UInt", hp_target, "UInt", pCommandLine, "UInt", &result, "UInt", buffer_size, "UInt", 0 )
; для хэндла PID'а читаем командную строку, и кладем её по адресу "result" в памяти (просто помещаем значение в переменную)
Return_2: ; метка перехода к закрытию хэндла
DllCall( "CloseHandle", "UInt", hp_target ) ; закрываем хэндл
Return, result ; возвращаем полную командную строку для PID'а процесса
} ; конец функции
;-------------------------------------------------------------------------------------------------------------
^!9::exitapp