Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

По два раза приходят перехваченные пакеты через WM_COPYDATA. [D7, WinXP]


AKomander ©   (2010-06-22 21:07:00) 

Перехватываю пакеты у приложения и отправляю его клиентской программе через Dll инжектинг.

Две проблемы:
1) Данные приходят по два раза (причем когда как, иногда один)
2) Длинна принимаемых данных больше, чем само сообщение. Т.е. в cbData при приеме сообщения WM_COPYDATA, больше, чем реальные данные и я принимаю дофига левых данных.
Помогите.

Функция передачи данных:

procedure SendData(Data:Pointer; len:integer);
var
 d:TCopyDataStruct;
begin
 d.lpData := data;
 d.cbData := len;
 d.dwData := 0;
 SendMessage(FindWindow(nil,'Sniffer'), WM_COPYDATA, 0, LongInt(@d));
End;


Функция заменяющая Recv:

function NewRecv (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
 Result := OldRecv (s, Buf, len, flags);
 SendData(addr(string(buf)), len);
end;


Принимаю сообщения у себя в программе:

private
   procedure SniffMessage(var Msg: TWMCopyData); message WM_COPYDATA;
...
procedure TMainForm.SniffMessage(var Msg: TWMCopyData);
var
 ReceivedText: string;
begin
 SetString(ReceivedText, PChar(Msg.CopyDataStruct.lpData),Msg.CopyDataStruct.cbData);

 MessMemo.Lines.Add(ReceivedText);
 MessMemo.Lines.Add('-------------');
end;


Leonid Troyanovsky   (2010-06-23 08:08:00) [1]


> AKomander   (22.06.10 21:30) [3]

> И что я должен был увидеть в msdn?

http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx

со всеми остановками.

> _Юрий ©   (22.06.10 22:54) [4]

> Вероятно, там отсутствует терминирующий ноль.

Скорее null внутри буфера:

> 2) Длинна принимаемых данных больше, чем само сообщение.

бо, кастится к string.

--
Regards, LVT.


_Юрий   (2010-06-22 22:54:00) [2]

Вероятно, там отсутствует терминирующий ноль.

Зачем кастить к строке при SendData, тоже не очень ясно


AKomander   (2010-06-22 21:30:00) [3]

И что я должен был увидеть в msdn?
>и как всегда никакой обработки результата...
А зачем? Пришло оно или нет, какая мне разница. Я не теряю сообщения, а получаю их в избытке.


KilkennyCat   (2010-06-22 21:13:00) [4]


> d.dwData := 0;
>  SendMessage(FindWindow(nil,'Sniffer'), WM_COPYDATA, 0,
> LongInt(@d));
> End;

и как всегда никакой обработки результата...


KilkennyCat   (2010-06-22 21:12:00) [5]

http://msdn.microsoft.com/en-us/library/ms649009%28v=VS.85%29.aspx


Наверх

Титульная страница Поиск, карта сайта Написать письмо