effeciency of NAT Driver: the speed

Hi, all
I use ndis hook technique to implement an NAT driver. Now all work
fine. But still one problem. When I use computers in my privated
network to access ftp suite outside, this ftp computer is in the same
subnet with my public adapter. The speed of download a file can only
up to 250k/s. If I use winroute to perfome NAT, it can get up to
600k/s. So big difference!

I use a timer in my driver to perform resend the modified packet.
Here is the code.
How can I speed up my NAT effeciency?

best regards
yours brucie
brucie@263.net
//////////////////////////////////
LARGE_INTEGER IntervalFromNow;
void InitTimer(
POpenBlockHandler templist // present NDIS_OPEN_BLOCK associated with
NDIS_PROTOCOL_BLOCK
)
{
IntervalFromNow =RtlConvertLongToLargeInteger(-2);
KeInitializeDpc(&templist->timeDpc,TCPH_TimerProc,templist);
KeInitializeTimer(&templist->m_NdisTimer);
templist->m_bTimerEnabled = TRUE;
KeSetTimer(&templist->m_NdisTimer,IntervalFromNow,&templist->timeDpc);
return;
}

VOID TCPH_TimerProc(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
)
{
PLIST_ENTRY pLinkage;
PLIST_ENTRY pNextLinkage;

NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PNDIS_PACKET MyPacket = NULL;
POpenBlockHandler templist = NULL;
POpenBlockHandler sendlist = NULL;
templist = (POpenBlockHandler)DeferredContext;
if (!Globals.DeviceState) goto TimerExit;
if (Globals.FilterState != 1) goto TimerExit;

pLinkage = templist->MySendDataList.Flink;
while( (!IsListEmpty(&templist->MySendDataList))&&(pLinkage != &templist->MySendDataList)
&&(pLinkage != NULL))
{
PRSVD pkContext;
NDIS_STATUS Status;

pNextLinkage = pLinkage->Flink;
MyPacket = NDISPACKET_FROM_PACKET_CONTEXT(pLinkage);
pkContext = PROTOLRSVD_FROM_PACKET(MyPacket);
if (pkContext != NULL)
{
sendlist = pkContext->WhoSend;
if(sendlist != NULL)
{
RemoveEntryList(pLinkage);
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
Status = sendlist->OldSend(sendlist->MacBindingHandle,
MyPacket);
if (Status != NDIS_STATUS_PENDING)
{
NewSendCompleteHandler(
sendlist->ProtocolBindingContext,
MyPacket,
Status);
}
}
}
pLinkage = pNextLinkage;
}
TimerExit:
if(templist->m_bTimerEnabled)
{
KeSetTimer(
&templist->m_NdisTimer,
IntervalFromNow,
&templist->timeDpc
);
}
return;
}

VOID DeleteTimer(
POpenBlockHandler templist

)
{
BOOLEAN bTimerCanceled;
bTimerCanceled = templist->m_bTimerEnabled;
templist->m_bTimerEnabled = FALSE;
if( bTimerCanceled )
{
KeCancelTimer(
&templist->m_NdisTimer
);
KeRemoveQueueDpc(&templist->timeDpc);
}
}
/////////////////////////////////