|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не работает функция возврата командной строки чужого процесса
Подскажите пожалуйста, как наладить функцию возврата 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,PWideChar(ws), pbi.PebBaseAddress.ProcessParameters.CommandLine.Length,r) then result:=string(ws); finally closehandle(h) end end; Ругается на ReadProcessMemory - неправильные аргументы. Делаю на XE7. Система 64х |
#2
|
|||
|
|||
Вот получше код, но ошибка та же.
Код:
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; |
#3
|
||||
|
||||
Похоже платформу смените, если два процесса возвращают один результат, то один ответ ожидается
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |