четверг, 13 декабря 2007 г.

Реинжект на FWPM_LAYER_INBOUND_IPPACKET_V4

В WFP есть одна маленькая хитрость для реинжекта входящих пакетов на сетевом уровне: необходимо что бы данные начинались с IP заголовка, а не сразу за ним как это происходит в буферах по дефолту.

Т.е. где то в коде (до или после клонирования) нужно вызвать NdisRetreatNetBufferDataStart на размер IP заголовка. Это будет выглядеть приблизительно следующим образом:

...
NdisRetreatNetBufferDataStart( pNetBuffer,
inMetaValues->ipHeaderSize, //размер IP заголовка
0, NULL );
...
FwpsAllocateCloneNetBufferList0(
pNetBufferList,
NULL,
NULL,
0,
&pClonedNetBufferList);

FwpsInjectNetworkReceiveAsync0( ... , pClonedNetBufferList, ... );

P.S. Как показала практика лучше делать NdisRetreatNetBufferDataStart до клонирования, иначе можно получить совсем не то что ожидается.