Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2012, 08:01   #1
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию Синхронизация HandleWindow в двух программах

В общем проблема такая, есть глобальный хук на функцию WriteProcessMemory( это все работает), заменяющая функция имеет такой вид:
Код:
function NewWriteProcessMemory(hProcess: THandle;const lpBaseAddress: Pointer;lpBuffer: Pointer;
        nSize: DWORD;var lpNumberOfBytesRead: DWORD):boolean; stdcall;
begin
VipProgHandle:=FindWindow(nil,VipProgName);
PrProgHandle:=FindWindow(nil,PrProgName);
CloseHandle(PrHandleWindow);
CloseHandle(VipHandleWindow);
if PrProgHandle<>0 then   Begin
  GetWindowThreadProcessId(PrProgHandle,@PrProcessId);
  PrHandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,PrProcessId);
End;
if VipProgHandle<>0 then   Begin
  GetWindowThreadProcessId(VipProgHandle,@VipProcessId);
  VipHandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,VipProcessId);
End;
  if ((hProcess=PrHandleWindow) and (PrHandleWindow<>0))
        or ((hProcess=VipHandleWindow) and (VipHandleWindow<>0)) then
      Begin
      Result:=false;
      End Else Begin
        UnHookCodeHook(@WPMFunc);
        Result:=WriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);
        SetCodeHook(WPMFunc.Address,@NewWriteProcessMemory,@WPMFunc);
     End;
end;
В общем проверяется, если WriteProcessMemory не затрагивает нужную программу, то разрешаем применить WriteProcessMemory. Но вот проблема hProcess и VipHandleWindow не совпадают, в интернете посмотрел, они локальные для каждой программы. Как же тогда быть?

Вот код программы которая делает WriteProcessMemory
Код:
procedure TForm1.Button1Click(Sender: TObject);
var b:boolean;
hdl,ProcessId,HandleWindow:THandle;
ThreadId:Integer;
buf:PChar;
Write:Cardinal;
begin
VIPHandle:=FindWindow(nil,'VipProgName');
  if VIPHandle<>0 then
    Begin
      showmessage('есть окно');
      ThreadId := GetWindowThreadProcessId(VIPHandle,@ProcessId);
      HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
      GetMem(buf,1);
      buf^ := Chr(PokeValue);
      b:=WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
      FreeMem(buf);
        if b then Showmessage('true '+inttostr(HandleWindow)) else
          Showmessage('false '+inttostr(HandleWindow));
    End else
      showmessage('нет окна');
end;
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 03.08.2012, 10:05   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Воспользуйтесь GetProcessId() - это даст вам уникальное ID процесса.
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 13:27   #3
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Дать то оно даст, но вот в чем загвоздка, значит на входе функции NewWriteProcessMemory поступает hProcess: THandle. Именно это значение я мог бы использовать для идентификации программы на которую направлена WriteProcessMemory. А если использовать идентификатор процесса, тогда с чем его сравнить?
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 03.08.2012, 16:40   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А с чем вы сравниваете hProcess? Очевидно с другим манипулятором... Доставайте ID из обоих и сравнивайте.
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 17:52   #5
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Дело в том, что кроме hProcess(которая не действительна для dll в которой хук) мне ничего не дано, ни названия окна цели для функции GetProcessId, ни ид процесса для сравнения. Еслибы хоть что-нибудь глобальное узнать о цели с помощью чего можно вычеслить PID, тогда дело бы продвинулось.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация двух листов. RealBot Microsoft Office Excel 0 17.06.2012 11:40
Синхронизация втавки строки в таблицу на двух листах (с копированием формул и ссылок) allaire Microsoft Office Excel 5 08.05.2012 13:38
Реклама в программах ivan_b Общие вопросы Delphi 9 15.01.2012 15:50
Синхронизация двух файлов Excel East Microsoft Office Excel 1 21.09.2011 18:26
Информация о программах Капитан Софт 0 18.10.2010 18:34