資源簡介
NetFilter SDK 1.4.0.0 + ProtocolFilters 1.0.8.1 - Full Sources.7z
代碼片段和文件信息
//
//? NetFilterSDK?
//? Copyright?(C)?2009?Vitaly?Sidorov
// All?rights?reserved.
//
// This?file?is?a?part?of?the?NetFilter?SDK.
// The?code?and?information?is?provided?“as-is“?without
// warranty?of?any?kind?either?expressed?or?implied.
//
#include?“stdinc.h“
#include?“addr.h“
#include?“gvars.h“
#include?“mempools.h“
#include?“tcpconn.h“
#include?“tcprecv.h“
#include?“tcpsend.h“
#include?“udprecv.h“
#include?“udpsend.h“
#include?“packet.h“
#include?“ctrlio.h“
#ifdef?_WPPTRACE
#include?“addr.tmh“
#endif
#define?MAX_ADDR_POOL_SIZE 0
static?NTSTATUS?addr_setConnInfo(PNF_UDP_CONN_INFO?pci?PADDROBJ?pAddr)
{
memset(pci?0?sizeof(NF_UDP_CONN_INFO));
pci->processId?=?(ULONG)pAddr->processId;
pci->ip_family?=?*(short*)pAddr->localAddr;
RtlCopyMemory(pci->localAddress?pAddr->localAddr?sizeof(pci->localAddress));
return?STATUS_SUCCESS;
}
static?PADDROBJ?addr_alloc(PIO_STACK_LOCATION?irpSp?void?*?context?int?protocol?PDEVICE_object?pLowerDevice)
{
PADDROBJ?pAddr;
pAddr?=?(PADDROBJ)mp_alloc(sizeof(ADDROBJ));
if?(!pAddr)
{
return?NULL;
}
#if?DBG
g_vars.nAddr++;
KdPrint((“[counter]?nAddr=%d\n“?g_vars.nAddr));
#endif
RtlZeroMemory(pAddr?sizeof(ADDROBJ));
pAddr->lowerDevice?=?pLowerDevice;
pAddr->fileobject?=?(HASH_ID)irpSp->Fileobject;
pAddr->protocol?=?protocol;
//?Assign?next?unique?identifier
g_vars.nextAddrId++;
while?((g_vars.nextAddrId?==?0)?||?
ht_find_entry(g_vars.phtAddrById?g_vars.nextAddrId))
{
g_vars.nextAddrId++;
}
pAddr->id?=?g_vars.nextAddrId;
pAddr->processId?=?*(ULONG*)&context;
sl_init(&pAddr->lock);
if?(protocol?==?IPPROTO_UDP)
{
InitializeListHead(&pAddr->pendedReceivedPackets);
InitializeListHead(&pAddr->receivedPackets);
InitializeListHead(&pAddr->pendedReceiveRequests);
InitializeListHead(&pAddr->pendedSendPackets);
InitializeListHead(&pAddr->sendPackets);
InitializeListHead(&pAddr->pendedSendRequests);
InitializeListHead(&pAddr->pendedConnectRequest);
}
return?pAddr;
}
void?addr_free_queues(PADDROBJ?pAddr)
{
PNF_PACKET pPacket;
PLIST_ENTRY pListEntry;
PIRP irp;
KIRQL irqld;
if?(!pAddr)
return;
KdPrint((DPREFIX“addr_free_queues[%I64d]\n“?pAddr->id));
if?(pAddr->protocol?==?IPPROTO_UDP)
{
sl_lock(&pAddr->lock?&irqld);
while?(!IsListEmpty(&pAddr->receivedPackets))
{
pPacket?=?(PNF_PACKET)RemoveHeadList(&pAddr->receivedPackets);
????????
KdPrint((DPREFIX“addr_free[%I64d]:?Orphan?receivedPackets?NF_PACKET?-?status=0x%8.8x?bytes=%d\n“
pAddr->id?pPacket->ioStatus?pPacket->dataSize?));
????????
nf_packet_free(pPacket);
}
while?(!IsListEmpty(&pAddr->pendedReceivedPackets))
{
pPacket?=?(PNF_PACKET)RemoveHeadList(&pAddr->pendedReceivedPackets);
????????
KdPrint((DPREFIX“addr_free[%I64d]:?Orphan?pendedReceivedPackets?NF_PACKET?-?status=0x%8.8x?bytes=%d\n“
評論
共有 條評論