VOID AddrFileFree( PVOID Object) /* * FUNCTION: Frees an address file object * ARGUMENTS: * Object = Pointer to address file object to free */ { PADDRESS_FILE AddrFile = Object; KIRQL OldIrql; PDATAGRAM_RECEIVE_REQUEST ReceiveRequest; PDATAGRAM_SEND_REQUEST SendRequest; PLIST_ENTRY CurrentEntry; TI_DbgPrint(MID_TRACE, ("Called.\n")); /* We should not be associated with a connection here */ ASSERT(!AddrFile->Connection); /* Remove address file from the global list */ TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql); RemoveEntryList(&AddrFile->ListEntry); TcpipReleaseSpinLock(&AddressFileListLock, OldIrql); /* FIXME: Kill TCP connections on this address file object */ /* Return pending requests with error */ TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting receive requests on AddrFile at (0x%X).\n", AddrFile)); /* Go through pending receive request list and cancel them all */ while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->ReceiveQueue, &AddrFile->Lock))) { ReceiveRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry); (*ReceiveRequest->Complete)(ReceiveRequest->Context, STATUS_CANCELLED, 0); /* ExFreePoolWithTag(ReceiveRequest, DATAGRAM_RECV_TAG); FIXME: WTF? */ } TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting send requests on address file at (0x%X).\n", AddrFile)); /* Go through pending send request list and cancel them all */ while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->ReceiveQueue, &AddrFile->Lock))) { SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry); (*SendRequest->Complete)(SendRequest->Context, STATUS_CANCELLED, 0); ExFreePoolWithTag(SendRequest, DATAGRAM_SEND_TAG); } /* Protocol specific handling */ switch (AddrFile->Protocol) { case IPPROTO_TCP: if (AddrFile->Port) { TCPFreePort(AddrFile->Port); } break; case IPPROTO_UDP: UDPFreePort( AddrFile->Port ); break; } RemoveEntityByContext(AddrFile); ExFreePoolWithTag(Object, ADDR_FILE_TAG); }
VOID RemoveTDIInterfaceEntity( PIP_INTERFACE Interface ) { /* This removes all of them */ RemoveEntityByContext(Interface); }