Похоже путь предстоит долгий
А раз так, подумала, что буду выкладывать тут результаты своего знакомства с увлекательным миром программирования сети в нулевом кольце.
Может кому пригодится впоследствии.
Итак.
Нашла (на этом форуме) пример, как получить IP адреса в PtReceive
PCHAR Buf = HeaderBuffer;
// Check the packet //
PktType = ((USHORT) Buf[12]) * 0x100U + (USHORT) Buf[13];
switch(PktType)
{
case 0x0800:
DbgPrint("Packet type IP 0x%x\n", PktType);
// Trying to check IP adderss...
pIpHdr = (PIP_HDR)LookAheadBuffer;
pOctSrc = (PUCHAR) &(pIpHdr->iph_src);
pOctDst = (PUCHAR) &(pIpHdr->iph_dest);
DbgPrint("Packet from %d.%d.%d.%d to %d.%d.%d.%d\n",\
*pOctSrc, *(pOctSrc+1), *(pOctSrc+2), *(pOctSrc+3),\
*pOctDst, *(pOctDst+1), *(pOctDst+2), *(pOctDst+3) );
switch(pIpHdr->iph_protocol)
{
case 0x01:
DBGPRINT(("ICMP: ...\n"));
break;
case 0x06:
// Trying to check TCP related parameters
pTcpHdr = (PTCP_HDR)((PUCHAR)LookAheadBuffer + sizeof(IP_HDR));
DbgPrint("TCP: from port %d to port %d\n", pTcpHdr->tcp_src, pTcpHdr->tcp_dest);
break;
case 0x11:
DbgPrint("UDP: ...\n");
break;
}
break;
case 0x0806:
DbgPrint("Packet type ARP 0x%x\n", PktType);
break;
}
Насколько мне (стало) известно 12-й и 13-й байт во фрейме Ethernet определяют тип протокола, использующего данный фрейм.
Стало быть HeaderBuffer таки содержит данные пакета, в котором поле Data начинается сразу за 13-м байтом и имеет размер не менее 46 и не более 1500 байт.
Уже хорошо.
Так же из кода понятно, что LookAheadBuffer содержит IP адреса источника и назначения пакета, а так же сигнатуру протокола транспортного уровня TCP/IP.
Добавлено через 5 минут и 43 секунды:Что значит "на том же уровне"? Не бывает такого. Есть стэк устройств, все идут по порядку.
Да, я видимо не до конца понимаю устройство среды NDIS.
Т.е. если хоть один драйвер в цепочке не пропустит пакет, этого будет достаточно, чтобы пакет не ушёл?