Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Не работает функция возврата командной строки чужого процесса (http://forum.oszone.net/showthread.php?t=302905)

qpash 26-07-2015 15:08 2532674

Не работает функция возврата командной строки чужого процесса
 
Подскажите пожалуйста, как наладить функцию возврата CmdLine запущенного чужого процесса. Использую код:

Код:

procedure TForm1.Button1Click(Sender: TObject);
var pID:Cardinal;
    op,hKernel32:Cardinal;
    GCL,DW,StrAddr,i,L,j:Cardinal;
    Str:String;
begin
 try
  pID:=StrToInt(Edit1.Text); //из edit берется идентификатор стороннего процесса
 except
  pID:=GetCurrentProcessID(); //типо если ошибка - берем идентификатор текущего процесса
 end;
 op:=OpenProcess(PROCESS_VM_READ,false,pID);
 if op<>0 then
  begin
  hKernel32:=LoadLibrary('Kernel32.dll');
  if hKernel32<>0 then
    begin
    GCL:=Cardinal(GetProcAddress(hKernel32,'GetCommandLineA'));
    FreeLibrary(hKernel32);
    if GCL<>0 then
      if ReadProcessMemory(op,Pointer(GCL+1),@DW,4,i)and(i=4)and
        ReadProcessMemory(op,Pointer(DW),@StrAddr,4,i)and(i=4) then
      begin
        L:=0;
        repeat
        j:=L;
        L:=L+Max_Path;
        SetLength(Str,L);
        if ReadProcessMemory(op,Pointer(StrAddr+j),Pointer(PChar(Str)+j),Max_Path,i) then
          begin
          for i:=j+1 to i do
            if Str[i]=#0 then DW:=0;
          end else DW:=0;
        until (DW=0);
        Caption:=trim(Str); //В caption заносим ответ
      end;
    end;
  CloseHandle(op);
  end;

end;

Ругается на ReadProcessMemory - неправильные аргументы. Делаю на XE7. Система 64х

opel431 26-07-2015 16:47 2532699

Лучше, если делать с обработкой ошибок. Убедится, что функции возвращают результат...
Код:

var
Res : Integer;
....
Res:= ReadProcessMemory('hProcess', 'lpBaseAddress', 'lpBuffer, nSize', '*lpNumberOfBytesRead');
  if Res <> 0 then
  RaiseLastOSError
else
begin
 //
end;...

времени много, посмотрел советы у других
1. Попробовать явно сделать приведение типов
Код:

type
 size_t = cardinal;

2. или последний параметр изменить - SizeOf(i)

qpash 26-07-2015 17:39 2532711

Попробовал на delphi 2009 и ошибка пропала, но в заголовке вместо параметра командной строки выводит иероглифы. Пробовал добавить AnsiString - теперь вместо иероглифов вопросы (добавил тут Caption:=AnsiString (trim(Str));)

qpash 26-07-2015 17:55 2532721

Часто в сети встречается вот такой код:

Код:

function GetProcessCmdLine(PID:DWORD):string;
{©Drkb v.3(2007): www.drkb.ru}
var
 h:THandle;
 pbi:TProcessBacicInformation;
 ret:NTSTATUS;
 r:Cardinal;
 ws:WideString;
begin
 result:='';
 if pid=0 then exit;
 h:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pid);
 if h=0 then exit;
 try
  ret:=NtQueryInformationProcess(h,ProcessBasicInformation,@pbi,sizeof(pbi),@r);
  if ret=STATUS_SUCCESS then
  if ReadProcessMemory(h,pbi.PebBaseAddress.ProcessParameters.CommandLine.Buffer,PWideChar(ws),
  pbi.PebBaseAddress.ProcessParameters.CommandLine.Length,r) then
  result:=string(ws);
 finally
 closehandle(h)
 end
end;

Но тут ругается сразу же на TProcessBacicInformation - не найден. Наверное что-то прописать еще надо, библиотеку какую-то

opel431 26-07-2015 18:31 2532730

Если уж unicode, то почему не - GetCommandLineW?
function WideCharToString(Source: PWideChar): string;

opel431 26-07-2015 19:00 2532738

Цитата:

Цитата qpash
Часто в сети встречается вот такой код: »

Смотреть нужно из первого источника - http://www.delphikingdom.com/asp/ans...IDAnswer=62376


Время: 01:39.

Время: 01:39.
© OSzone.net 2001-