Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Не работает функция возврата командной строки чужого процесса

Ответить
Настройки темы
Delphi - Не работает функция возврата командной строки чужого процесса

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Подскажите пожалуйста, как наладить функцию возврата 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х

Отправлено: 15:08, 26-07-2015

 

Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Лучше, если делать с обработкой ошибок. Убедится, что функции возвращают результат...
Код: Выделить весь код
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)

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 27-07-2015 в 00:17.


Отправлено: 16:47, 26-07-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:39, 26-07-2015 | #3


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
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 - не найден. Наверное что-то прописать еще надо, библиотеку какую-то

Отправлено: 17:55, 26-07-2015 | #4


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


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

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Отправлено: 18:31, 26-07-2015 | #5


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


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

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Отправлено: 19:00, 26-07-2015 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Не работает функция возврата командной строки чужого процесса

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Доступ - [решено] Запуск командной строки от имени Администратора из командной строки emcee Microsoft Windows 8 и 8.1 12 06-05-2023 07:36
CMD/BAT - запуск командной строки от имени администратора из командной строки jah Скриптовые языки администрирования Windows 18 19-09-2015 08:59
Разное - Windows 7 безопасный режим с поддержкой командной строки не работает defrag GrayMagellan Microsoft Windows 7 1 05-11-2014 20:25
Delphi - Delphi | Работа с памятью чужого процесса, перехват API Savant Программирование и базы данных 17 11-04-2012 13:06
WinAPI | Изменение контекстного меню чужого процесса megad Программирование и базы данных 8 17-08-2005 21:42




 
Переход