Конференция "WinAPI" » Не работает функция возврата командной строки чужого процесса
 
  • qpash © (26.07.15 14:02) [0]
    Подскажите пожалуйста, как наладить функцию возврата CmdLine запущенного чужого процесса. Использую код:
    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,PWid eChar(ws),
                              pbi.PebBaseAddress.ProcessParameters.CommandLine.Length,r) then
      result:=string(ws);
    finally
     closehandle(h)
    end
    end;

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

  • qpash © (26.07.15 14:10) [1]
    Вот получше код, но ошибка та же.

    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;
  • Leonid Troyanovsky © (27.07.15 07:25) [2]

    > qpash ©   (26.07.15 14:10) [1]

    > Вот получше код, но ошибка та же.

    https://groups.google.com/d/msg/fido7.su.windows.nt.prog/rrx6ZmaJUWU/6MPSYg8jyXYJ

    --
    Regards, LVT.
  • Германн © (29.07.15 11:39) [3]

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

    Два последних параметра этой функции начиная с какой-то версии Дельфи имеют тип SIZE_T (или NativeUInt).
 
Конференция "WinAPI" » Не работает функция возврата командной строки чужого процесса
Есть новые Нет новых   [118676   +67][b:0][p:0.001]