JIOST
Интересующийся
Offline
Пол:
|
|
« : 19-04-2015 17:54 » |
|
Доброе время суток! Разбираюсь с промежуточным драйвером (тестирую на WinXP), конкретно с примером passthru из WDK(DDK). Получилось выловить IP-адреса приходящих пакетов в функции PtReceive из LookAheadBuffer (поиск по форуму помог), а вот получить IP-адрес исходящих пакетов не могу понять как. Вроде ловить пакеты можно в MPSendPackets, но не знаю как. Драйвер пока тестирую на WinXP. Было бы прекрасно разъяснить следующие вопрос: 1) Каким образом можно получить IP-адреса(source ip, destination ip) исходящих пакета в MPSendPackets? 2) Как можно организовать отслеживание числа потерянных пакетов? 3) Как отправлять пакеты через определённый промежуток времени? Пробовал использовать NDISMSleep но получал BSOD. В kernel-mode и драйверах совсем новичок.
Заранее благодарен!
|
|
|
Записан
|
|
|
|
JIOST
Интересующийся
Offline
Пол:
|
|
« Ответ #1 : 20-04-2015 16:35 » |
|
Разобрался как вытащить IP-адрес пакетов в MPSendPackets из PNDIS_BUFFER, с помощю:
|
|
|
Записан
|
|
|
|
JIOST
Интересующийся
Offline
Пол:
|
|
« Ответ #2 : 20-04-2015 16:43 » |
|
NdisQueryPacket(Packet, null, null, &FirstBuffer, null); NdisQueryBuffer(FirstBuffer, &data, &datalength); NdisGetNextBuffer(FirstBuffer, &FirstBuffer); out буфер data привёл к структуре ethernet_header/ip_header
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 20-04-2015 16:48 » |
|
это хорошо) а то я к сожалению не силен сетевых решениях, и все думал чем бы помочь и так и не придумал)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
JIOST
Интересующийся
Offline
Пол:
|
|
« Ответ #4 : 12-06-2015 16:53 » |
|
Можно ли в функции MPSendPackets организовать задержку/паузу/ожидание на 100-500 мс. так, чтобы не висла машина?) Задача: отправить пакет в нужное время. тщетно экспериментировал со следующими функциями: KeDelayExecutionThread() - есть задержка но и тормоза системы, бывал bsod; NdisMSleep() - чаще bsod, чем sleep; NdisStallExecution() - нормально работает даже при >50 мкс. (хотя в WDK рекомендуют не более 50) и также тормозит всё.
Или может другие варианты есть?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 13-06-2015 08:50 » |
|
а какой там IRQL?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
JIOST
Интересующийся
Offline
Пол:
|
|
« Ответ #6 : 13-06-2015 09:10 » |
|
DISPATCH_LEVEL
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 13-06-2015 11:21 » |
|
не, ну а как вы хотели))) это уровень, блокировки переключения контекста. будет работать только обработка прерываний.
Добавлено через 1 минуту и 19 секунд: ЗЫ StallExecution() -поэтому и рекомендуют не более 50 мкс...
Добавлено через 59 секунд: PS меняйте логику обработки, делайте отложенную обработку на PASSIVE если не можете завершить сразу.
|
|
« Последнее редактирование: 13-06-2015 11:24 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
JIOST
Интересующийся
Offline
Пол:
|
|
« Ответ #8 : 13-06-2015 12:09 » |
|
Понизить IRQL до PASSIVE и после паузы возвращать DISPATCH?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #9 : 14-06-2015 20:06 » |
|
нет, вы не можете вниз IRQL переключать - глюки начнутся. только вверх. я имею в виду, что нибудь типа отложенной обработки делать. не знаю как это применительно к NDIS правда будет. там обязательно сразу пакет завершать? или можно его пометить как незавершенный?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|