Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
ВнизКомандная строка процесса Найти похожие ветки
← →
FireHack (2003-10-08 12:35) [0]Усем привет!!!
Возможно ли узнать с какой командной строкой был создан тот или иной процесс - ессесно, НЕ свой собственный.
Всем спасибо.
← →
Игорь Шевченко (2003-10-08 12:58) [1]Возможно.
Я думаю, не составит труда убрать HWnd а вместо него поставить нужные параметры
{ Получение командной строки для процесса выбранного окна }
function HSGetWindowCommandLine (AWindowHandle : HWND) : String;
const
PEBAddress = $7FFDF000;
var
AProcessID : DWORD;
AProcessHandle : THandle;
ATargetProcessParametersPointer : Ptr32;
ATargetProcessParameters : TRTL_USER_PROCESS_PARAMETERS;
ATargetCommandLine : array[0..MAX_PATH] of WideChar;
AReturned : DWORD;
APathBytes : WORD;
begin
Result := "";
{ Алгоритм пригоден только для NT-платформ }
if Win32Platfrom = VER_PLATFORM_WIN32_NT then begin
{ PID для процесса, создавшего окно }
{$IFDEF VER140}
GetWindowThreadProcessID(AWindowHandle, AProcessID);
{$ELSE}
GetWindowThreadProcessID(AWindowHandle, @AProcessID);
{$ENDIF}
{ handle этого процесса }
AProcessHandle := OpenProcess(PROCESS_VM_READ, false, AProcessID);
if AProcessHandle = 0 then
RaiseLastWin32Error();
try
{ Получение адреса структуры параметров процесса }
if NOT ReadProcessMemory(AProcessHandle,
{ Этот оператор нужен для подсчета смещения в блоке
PEB на указатель на параметры процесса }
@PPEB(PEBAddress)^.ProcessParameters,
@ATargetProcessParametersPointer, SizeOf(Ptr32),
AReturned) then
RaiseLastWin32Error();
{ Проверка избыточна, но вставлена для пущей надежности. }
if AReturned <> SizeOf(Pointer) then
raise Exception.CreateFmt(
"ReadProcessMemory прочитала неверное количество данных, ожидалось %d, получено %d",
[SizeOf(Ptr32), AReturned]);
{ Получение структуры параметров процесса }
if not ReadProcessMemory(AProcessHandle, ATargetProcessParametersPointer,
@ATargetProcessParameters,
SizeOf(ATargetProcessParameters),
AReturned) then
RaiseLastWin32Error();
{ Проверка избыточна, но вставлена для пущей надежности. }
if AReturned <> SizeOf(ATargetProcessParameters) then
raise Exception.CreateFmt(
"ReadProcessMemory прочитала неверное количество данных, ожидалось %d, получено %d",
[SizeOf(ATargetProcessParameters), AReturned]);
{ размер командной строки в байтах }
APathBytes := ATargetProcessParameters.CommandLine.Length;
if APathBytes > MAX_PATH * SizeOf(WideChar) then
APathBytes := MAX_PATH * SizeOf(WideChar);
{ Получение командной строки для указанного процесса }
if not ReadProcessMemory(AProcessHandle,
ATargetProcessParameters.CommandLine.Buffer,
@ATargetCommandLine,
APathBytes,
AReturned) then
RaiseLastWin32Error();
{ Для преобразования в Ansi подсчитывается число символов Unicode без
завершающего нуля. lstrlenW почему-то дала неверный результат. Странно.}
Result := WideCharLenToString(ATargetCommandLine,
Pred(AReturned div SizeOf(WideChar)));
finally
CloseHandle(AProcessHandle);
end;
end;
end;
← →
Игорь Шевченко (2003-10-08 12:59) [2]И описание структур:
{ Структура UNICODE_STRING - Передача строковых параметров для Native API и
хранение строк во внутренних структурах Windows }
type
TUNICODE_STRING = packed record
Length : WORD;
MaximumLength : WORD;
Buffer : PWideChar;
end;
type
{ Переопределение типов }
UChar = Byte;
Ptr32 = Pointer;
Uint4B = Cardinal;
{ Текущий каталог }
type
TCURDIR = packed record
DosPath : TUNICODE_STRING;
Handle : Ptr32;
end;
{ User Process Parameters - пользовательские параметры процесса }
type
TRTL_USER_PROCESS_PARAMETERS = packed record
MaximumLength : Uint4B;
Length : Uint4B;
Flags : Uint4B;
DebugFlags : Uint4B;
ConsoleHandle : Ptr32;
ConsoleFlags : Uint4B;
StandardInput : Ptr32;
StandardOutput : Ptr32;
StandardError : Ptr32;
CurrentDirectory : TCURDIR;
DllPath : TUNICODE_STRING;
ImagePathName : TUNICODE_STRING;
CommandLine : TUNICODE_STRING;
Environment : Ptr32;
StartingX : Uint4B;
StartingY : Uint4B;
CountX : Uint4B;
CountY : Uint4B;
CountCharsX : Uint4B;
CountCharsY : Uint4B;
FillAttribute : Uint4B;
WindowFlags : Uint4B;
ShowWindowFlags : Uint4B;
WindowTitle : TUNICODE_STRING;
DesktopInfo : TUNICODE_STRING;
ShellInfo : TUNICODE_STRING;
RuntimeData : TUNICODE_STRING;
end;
PRTL_USER_PROCESS_PARAMETERS = ^TRTL_USER_PROCESS_PARAMETERS;
{ Process Environment Block - блок окружения процесса }
type
TPEB = packed record
InheritedAddressSpace : UChar;
ReadImageFileExecOptions : UChar;
BeingDebugged : UChar;
SpareBool : UChar;
Mutant : Ptr32;
ImageBaseAddress : Ptr32;
Ldr : Ptr32;
ProcessParameters : PRTL_USER_PROCESS_PARAMETERS;
SubSystemData : Ptr32;
ProcessHeap : Ptr32;
{ Остальные данные опущены }
end;
PPEB = ^TPEB;
← →
FireHack (2003-10-08 14:11) [3]Ну что ж, в который раз - спасибо!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c