Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.12.07;
Скачать: [xml.tar.bz2];

Вниз

Что за странный способ работы с сетью (recv и WSA_IO_PENDING)?   Найти похожие ветки 

 
Хинт   (2014-05-06 14:57) [0]

Пишу сниффер для конкретной программы, используя LSP/SPI. Проблема в том, что это приложение очень странно работает с сетью, такого я еще не видел. Копаюсь уже несколько дней, но ничего не могу придумать.
Мой LSP/SPI провайдер обрабатывает вызовы WSPConnect, WSPSend, WSPRecv и WSPCloseSocket.
Первая странность в том, что я не вижу вызовов WSPConnect. Данные передаются, принимаются, сокеты закрываются, но нет ни одного вызова WSPConnect. Ставил отдельные хуки на connect и WSAConnect, но они ни разу не сработали.
Вторая странность в том, что WSPRecv всегда возращает ошибку WSA_IO_PENDING, но я не могу понять, как приложение в итоге считывает полученные данные. lpOverlapped указан, но hEvent нулевой. lpCompletionRoutine не передается. При этом нет ни одного вызова GetOverlappedResult, WSAGetOverlappedResult, WSPGetOverlappedResult, GetQueuedCompletionStatus и GetQueuedCompletionStatusEx. Ставил хуки - ни одного вызова (хуки рабочие на 100%). Как такое вообще может быть? Может существует еще какой-то способ узнать о завершении операции, о котором я не знаю?

Помоги, пожалуйста, разобраться как всё-таки это приложение работает с сетью. Моего опыта, к сожалению, оказалось недостаточно.


 
Cobalt ©   (2014-05-06 18:35) [1]

А название программы какое?


 
Хинт   (2014-05-06 18:40) [2]

Это игра на CryEngine 3.


 
Хинт   (2014-05-06 19:39) [3]

Через "Process Monitor" посмотрел стек вызовов при событии "TCP Connect": из CryNetwork.dll идёт сразу вызов MSWSock.dll.


 
Хинт   (2014-05-06 21:12) [4]

Вообще лог из SPI сейчас такой (WSPRecv, WSPSend, WSPCloseSocket):
[21:03:38] Rеcv. S = 2316, Оvеrlаpped = 263FA540 (hЕvent = 0), CоmplеtiоnRоutine = 00000000. Result = WSA_IO_PENDING.
[21:03:38] Sеnd. S = 2316.
[21:03:38] Rесv. S = 2316, Оverlаpped = 263F6130 (hЕvent = 0), ComplеtiоnRоutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:38] Reсv. S = 2316, Ovеrlapped = 263FA540 (hЕvent = 0), CоmpletiоnRоutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:38] Sеnd. S = 2316.
[21:03:38] Rесv. S = 2316, Overlapped = 263F6130 (hEvent = 0), CоmpletiоnRoutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:42] Send. S = 2316.
[21:03:42] Reсv. S = 2316, Overlapped = 263FA540 (hЕvеnt = 0), CоmpletiоnRоutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:42] ClosеSocket. S = 2316.

Видно и send, и recv (всегда завершается ошибкой с WSA_IO_PENDING).
hEvent нулевой, CоmpletiоnRоutinе не установлен. Т. е. и события никто не ждет, и обратного вызова нет. Единственный вариант по логике - GetQueuedCompletionStatus(Ex), но вызова не происходит.

На всякий случай ставил хуки на ReadFile и на ReadFileEx - пусто.


 
Rouse_ ©   (2014-05-06 21:15) [5]

Асинхронка не только на эвентах делается, пошукай по поводу очереди сообщений


 
Хинт   (2014-05-06 21:21) [6]

Что за очередь сообщений?)


 
Inovet ©   (2014-05-06 21:25) [7]

> [6] Хинт   (06.05.14 21:21)

Это эвенты в профиль.


 
Хинт   (2014-05-06 21:47) [8]

Читал сейчас про очередь сообщений, но так и не понял, как программа сможет узнать число прочитанных байт из сокета после асинхронного recv?


 
Rouse_ ©   (2014-05-06 22:06) [9]

Что значит как? После FD_READ recv вернет кол-во байт.


 
Хинт   (2014-05-06 22:12) [10]

Так в том и дело, что recv больше не вызывается. Я выше скинул полный лог вызовов recv.


 
Rouse_ ©   (2014-05-06 22:14) [11]


> Хинт   (06.05.14 22:12) [10]
> Так в том и дело, что recv больше не вызывается. Я выше
> скинул полный лог вызовов recv.

По которому собственно и видно что IOCompletion не работает:

[21:03:38] Rеcv. S = 2316, Оvеrlаpped = 263FA540 (hЕvent = 0), CоmplеtiоnRоutine = 00000000. Result = WSA_IO_PENDING.

А стало быть работает очередь событий.


 
Хинт   (2014-05-06 22:35) [12]

> По которому собственно и видно что IOCompletion не работает
Почему не работает? Вроде бы как раз похоже на то, что работает.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2014.12.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.002 c
15-1399062603
Юрий
2014-05-03 00:30
2014.12.07
С днем рождения ! 3 мая 2014 суббота


15-1399667402
Юрий
2014-05-10 00:30
2014.12.07
С днем рождения ! 10 мая 2014 суббота


15-1398812815
GrayFace
2014-04-30 03:06
2014.12.07
Чем нарисовать график функции (таблица x,y)?


15-1399371710
Дмитрий СС
2014-05-06 14:21
2014.12.07
Функция возвращающая интерфейс


15-1399374780
Aleks2014
2014-05-06 15:13
2014.12.07
Как сменить программно IP сетевушки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский