Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› NDIS Intermediate |
Посл.ответ | Сообщение |
|
Создано: 03 августа 2006 02:27 · Личное сообщение · #1 |
|
Создано: 03 августа 2006 04:24 · Личное сообщение · #2 |
|
Создано: 04 августа 2006 09:42 · Поправил: s0larian · Личное сообщение · #3 В DDK есть пример - называется passthru. Это и есть документированный NDIS intermediate driver. На http://ntndis.com http://ntndis.com низкоуровневый перехвадчик (kernel hooks). В user mode пакеты передаются через DeviceIOControl() или Read(). В любом случае обрабытывать будешь IRPs. Эта, если ты не работал с драйверами и NDIS, будешь разбираться много недель. Так что, IMHO, если тебе для комерческого проекта, то просто купи кусок кода - это всё продаётся. ![]() |
|
Создано: 07 августа 2006 04:46 · Личное сообщение · #4 Спасибо К сожалению, не для коммерческого. С passthru разбираюсь уже, наверное, больше месяца - с тем что написано в общем разобрался, но вот как дописывать пока не знаю. Была мысль не делать индикацию получения пакета в протоколе - но тогда надо 1. Как-то полностью сохранять пакет (представление о его структуре довольно смутное. 2. Достучаться до него из обработчиков Read и IoCtl - похоже, контекст там уже другой будет. Можно ли оттуда делать индикацию? Плюс вопрос, как ориентироваться, где какие заголовки и данные - в общем, как потрошить это дело? ![]() |
|
Создано: 08 августа 2006 00:38 · Поправил: s0larian · Личное сообщение · #5 Dian пишет: Как-то полностью сохранять пакет (представление о его структуре довольно смутное. Эта.... тебе надо скопировать пакет и данные. Для этого: - allocate a block of memory - allocate an NDIS_BUFFER (MDL) from your pool - attach one to the other - allocate an NDIS_PACKET from your pool - attach the buffer to the packet - copy the data, the OOB data and flags То есть, NDIS_BUFFER это descriptor куска памяти. Сама структура будет из pool, а блок пямяти отдельно. NDIS_PACKET это штука к которой цепляутся NDIS_BUFFERS. Напримет Eth прицепит 14-ти байтовый блок в начало IP пакета. После этого, можешь этот новый пакет запердолить в очередь, список и т.д. Dian пишет: Достучаться до него из обработчиков Read и IoCtl - похоже, контекст там уже другой будет. Будет, но это не важно. Кста, разницы между Read() и DeviceIOControl() нету... те же IRP в ядре. Dian пишет: Можно ли оттуда делать индикацию? Да. Dian пишет: Плюс вопрос, как ориентироваться, где какие заголовки и данные - в общем, как потрошить это дело? То есть? По RFC - сначала там Ethernet header (14 bytes), then IP header.... и понеслась... Только это всё данные внутри блоков пямяти, и NDISу на них плевать. Если всё копипрование у тебя работает, то одному слою говоришь ОК, больше мне пакет не нужен, и потом скармливаешь саою копию другому. Ну а тот слой может вернуть его синхронно или асинхронно - внимательно читай доки фунций - там много заморочек с ProtocolReceive(), TransferData(), TransferDataComplete().... Так вот, когда traffic начнёт ходить, будешь пробовать изменять содержимое и попаришься с IP/TCP/UDP checksums. Кста, совет - поставь VmWare и отлаживай драйвер WinDBG из пот главной операционки - типа удалённая отладка через порт. ![]() |
|
Создано: 08 августа 2006 05:07 · Поправил: s0larian · Личное сообщение · #6 Here is the break down of the IP packet: [url=http://www.networksorcery.com/enp/protocol/ip.htm ]http://www.networksorcery.com/enp/protocol/ip.htm [/url] Don't forget about network byte order. And, you will also need struct definitions of this kind: struct EthHeader
![]() |
|
Создано: 21 августа 2006 03:59 · Личное сообщение · #7 Приветствую Попытался реализовать... но не очень-то получилось ![]() Похоже, что либо не все скопировал, либо глюк в индикации. Вобщем, код в аттаче - очень прошу глянуть ![]() ![]() |
|
Создано: 21 августа 2006 04:07 · Личное сообщение · #8 |
|
Создано: 28 августа 2006 12:26 · Личное сообщение · #9 ![]() очередь делал свою с указателями на пакеты(пакет, контекст, указатель на следующий пакет), в ринг 3 все идет через IOCTL + синхронизация сообщениями некоторым пакетам принудительно присваивал статус NDIS_STATUS_RESOURCES + в функции обработки очереди должно быть ожидание асинхронных операций, если у тебя в 3 ринге обрабатывается только 1 пакет ![]() |
|
Создано: 29 августа 2006 18:27 · Личное сообщение · #10 |
|
Создано: 03 сентября 2006 11:34 · Личное сообщение · #11 Ставил в очередь в ProtocolReceive для входящих, и в MiniportSendPackets для исходящих правильнее будет ставить в очередь для всех точек входа минипорта и протокола, для правильного копирования нужно сделать то же самое что и в драйвере Passthru, который идет вместе с DDK, плюс если ты хочешь изменять буферы пакета, нужно приделать свой буфер с данными (их НДИС не контролирует и можно извращаться как хочешь, только нужно помнить, что например драйвер ARP или другго вышележащего протокола при вызове будет рассматривать часть буфера как свой и может зависнуть при обработке), к новому пакету причем старый пакет обратно нужно вернуть все так же как и взял. ![]() |
|
Создано: 03 сентября 2006 11:36 · Личное сообщение · #12 |
|
Создано: 03 сентября 2006 15:42 · Личное сообщение · #13 |
![]() |
eXeL@B —› Программирование —› NDIS Intermediate |