ReactOS  0.4.13-dev-563-g0561610
fileobjs.c File Reference
#include "precomp.h"
#include <ntifs.h>
#include <ndk/pstypes.h>
Include dependency graph for fileobjs.c:

Go to the source code of this file.

Functions

PADDRESS_FILE AddrSearchFirst (PIP_ADDRESS Address, USHORT Port, USHORT Protocol, PAF_SEARCH SearchContext)
 
BOOLEAN AddrIsBroadcastMatch (PIP_ADDRESS UnicastAddress, PIP_ADDRESS BroadcastAddress)
 
BOOLEAN AddrReceiveMatch (PIP_ADDRESS LocalAddress, PIP_ADDRESS RemoteAddress)
 
VOID LogActiveObjects (VOID)
 
PADDRESS_FILE AddrFindShared (PIP_ADDRESS BindAddress, USHORT Port, USHORT Protocol)
 
PADDRESS_FILE AddrSearchNext (PAF_SEARCH SearchContext)
 
VOID AddrFileFree (PVOID Object)
 
VOID ControlChannelFree (PVOID Object)
 
NTSTATUS FileOpenAddress (PTDI_REQUEST Request, PTA_IP_ADDRESS Address, USHORT Protocol, BOOLEAN Shared, PVOID Options)
 
NTSTATUS FileCloseAddress (PTDI_REQUEST Request)
 
NTSTATUS FileOpenConnection (PTDI_REQUEST Request, PVOID ClientContext)
 
NTSTATUS FileCloseConnection (PTDI_REQUEST Request)
 
NTSTATUS FileOpenControlChannel (PTDI_REQUEST Request)
 
NTSTATUS FileCloseControlChannel (PTDI_REQUEST Request)
 

Variables

LIST_ENTRY AddressFileListHead
 
KSPIN_LOCK AddressFileListLock
 
LIST_ENTRY ConnectionEndpointListHead
 
KSPIN_LOCK ConnectionEndpointListLock
 

Function Documentation

◆ AddrFileFree()

VOID AddrFileFree ( PVOID  Object)

Definition at line 302 of file fileobjs.c.

309 {
310  PADDRESS_FILE AddrFile = Object;
311  KIRQL OldIrql;
312  PDATAGRAM_RECEIVE_REQUEST ReceiveRequest;
314  PLIST_ENTRY CurrentEntry;
315 
316  TI_DbgPrint(MID_TRACE, ("Called.\n"));
317 
318  /* We should not be associated with a connection here */
319  ASSERT(!AddrFile->Connection);
320 
321  /* Remove address file from the global list */
323  RemoveEntryList(&AddrFile->ListEntry);
325 
326  /* FIXME: Kill TCP connections on this address file object */
327 
328  /* Return pending requests with error */
329 
330  TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting receive requests on AddrFile at (0x%X).\n", AddrFile));
331 
332  /* Go through pending receive request list and cancel them all */
333  while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->ReceiveQueue, &AddrFile->Lock))) {
334  ReceiveRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry);
335  (*ReceiveRequest->Complete)(ReceiveRequest->Context, STATUS_CANCELLED, 0);
336  /* ExFreePoolWithTag(ReceiveRequest, DATAGRAM_RECV_TAG); FIXME: WTF? */
337  }
338 
339  TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting send requests on address file at (0x%X).\n", AddrFile));
340 
341  /* Go through pending send request list and cancel them all */
342  while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->ReceiveQueue, &AddrFile->Lock))) {
343  SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry);
344  (*SendRequest->Complete)(SendRequest->Context, STATUS_CANCELLED, 0);
346  }
347 
348  /* Protocol specific handling */
349  switch (AddrFile->Protocol) {
350  case IPPROTO_TCP:
351  if (AddrFile->Port)
352  {
353  TCPFreePort(AddrFile->Port);
354  }
355  break;
356 
357  case IPPROTO_UDP:
358  UDPFreePort( AddrFile->Port );
359  break;
360  }
361 
362  RemoveEntityByContext(AddrFile);
363 
365 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define MID_TRACE
Definition: debug.h:15
USHORT Protocol
Definition: titypes.h:138
VOID TCPFreePort(const UINT Port)
Definition: tcp.c:596
DATAGRAM_COMPLETION_ROUTINE Complete
Definition: titypes.h:102
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
KSPIN_LOCK Lock
Definition: titypes.h:134
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
#define ADDR_FILE_TAG
Definition: tags.h:11
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
UCHAR KIRQL
Definition: env_spec_w32.h:591
PLIST_ENTRY NTAPI ExInterlockedRemoveHeadList(IN OUT PLIST_ENTRY ListHead, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:166
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
static IUnknown Object
Definition: main.c:512
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
VOID UDPFreePort(UINT Port)
Definition: udp.c:394
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
Definition: typedefs.h:117
#define DATAGRAM_SEND_TAG
Definition: tags.h:15
KSPIN_LOCK AddressFileListLock
Definition: fileobjs.c:22
LIST_ENTRY ListEntry
Definition: titypes.h:131
#define DEBUG_ADDRFILE
Definition: debug.h:23
LIST_ENTRY ReceiveQueue
Definition: titypes.h:149
struct _CONNECTION_ENDPOINT * Connection
Definition: titypes.h:151
USHORT Port
Definition: titypes.h:139
VOID RemoveEntityByContext(PVOID Context)
Definition: info.c:46
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
BOOL SendRequest(PCHAR pInBuffer, ULONG InBufferLength, PCHAR pOutBuffer, PULONG pOutBufferLength)
Definition: utility.c:11

Referenced by FileOpenAddress().

◆ AddrFindShared()

PADDRESS_FILE AddrFindShared ( PIP_ADDRESS  BindAddress,
USHORT  Port,
USHORT  Protocol 
)

Definition at line 190 of file fileobjs.c.

194 {
195  PLIST_ENTRY CurrentEntry;
196  KIRQL OldIrql;
197  PADDRESS_FILE Current = NULL;
198 
200 
201  CurrentEntry = AddressFileListHead.Flink;
202  while (CurrentEntry != &AddressFileListHead) {
203  Current = CONTAINING_RECORD(CurrentEntry, ADDRESS_FILE, ListEntry);
204 
205  /* See if this address matches the search criteria */
206  if ((Current->Port == Port) &&
207  (Current->Protocol == Protocol))
208  {
209  /* Increase the sharer count */
210  ASSERT(Current->Sharers != 0);
211  InterlockedIncrement(&Current->Sharers);
212  break;
213  }
214 
215  CurrentEntry = CurrentEntry->Flink;
216  Current = NULL;
217  }
218 
220 
221  return Current;
222 }
CPPORT Port[4]
Definition: headless.c:34
LONG Sharers
Definition: titypes.h:140
USHORT Protocol
Definition: titypes.h:138
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
UCHAR KIRQL
Definition: env_spec_w32.h:591
smooth NULL
Definition: ftsmooth.c:416
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
Definition: typedefs.h:117
LIST_ENTRY AddressFileListHead
Definition: fileobjs.c:21
KSPIN_LOCK AddressFileListLock
Definition: fileobjs.c:22
#define InterlockedIncrement
Definition: armddk.h:53
USHORT Port
Definition: titypes.h:139

Referenced by FileOpenAddress().

◆ AddrIsBroadcastMatch()

BOOLEAN AddrIsBroadcastMatch ( PIP_ADDRESS  UnicastAddress,
PIP_ADDRESS  BroadcastAddress 
)

Definition at line 62 of file fileobjs.c.

64  {
65  IF_LIST_ITER(IF);
66 
67  ForEachInterface(IF) {
68  if ((AddrIsUnspecified(UnicastAddress) ||
69  AddrIsEqual(&IF->Unicast, UnicastAddress)) &&
70  (AddrIsEqual(&IF->Broadcast, BroadcastAddress)))
71  return TRUE;
72  } EndFor(IF);
73 
74  return FALSE;
75 }
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
#define TRUE
Definition: types.h:120
#define IF_LIST_ITER(n)
Definition: tilists.h:5
#define ForEachInterface(n)
Definition: tilists.h:9
BOOLEAN AddrIsEqual(PIP_ADDRESS Address1, PIP_ADDRESS Address2)
Definition: address.c:221
#define EndFor(n)
Definition: tilists.h:20

Referenced by AddrReceiveMatch().

◆ AddrReceiveMatch()

BOOLEAN AddrReceiveMatch ( PIP_ADDRESS  LocalAddress,
PIP_ADDRESS  RemoteAddress 
)

Definition at line 77 of file fileobjs.c.

80 {
82  {
83  /* Unicast address match */
84  return TRUE;
85  }
86 
88  {
89  /* Broadcast address match */
90  return TRUE;
91  }
92 
94  {
95  /* Local address unspecified */
96  return TRUE;
97  }
98 
100  {
101  /* Remote address unspecified */
102  return TRUE;
103  }
104 
105  return FALSE;
106 }
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
#define TRUE
Definition: types.h:120
BOOLEAN AddrIsBroadcastMatch(PIP_ADDRESS UnicastAddress, PIP_ADDRESS BroadcastAddress)
Definition: fileobjs.c:62
BOOLEAN AddrIsEqual(PIP_ADDRESS Address1, PIP_ADDRESS Address2)
Definition: address.c:221
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:170
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:170

Referenced by AddrSearchNext().

◆ AddrSearchFirst()

PADDRESS_FILE AddrSearchFirst ( PIP_ADDRESS  Address,
USHORT  Port,
USHORT  Protocol,
PAF_SEARCH  SearchContext 
)

Definition at line 38 of file fileobjs.c.

43 {
44  KIRQL OldIrql;
45 
46  SearchContext->Address = Address;
47  SearchContext->Port = Port;
48  SearchContext->Protocol = Protocol;
49 
51 
52  SearchContext->Next = AddressFileListHead.Flink;
53 
55  ReferenceObject(CONTAINING_RECORD(SearchContext->Next, ADDRESS_FILE, ListEntry));
56 
58 
59  return AddrSearchNext(SearchContext);
60 }
CPPORT Port[4]
Definition: headless.c:34
PLIST_ENTRY Next
Definition: titypes.h:204
_In_ USHORT _In_ ULONG Protocol
Definition: wsk.h:182
PIP_ADDRESS Address
Definition: titypes.h:205
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
UCHAR KIRQL
Definition: env_spec_w32.h:591
static WCHAR Address[46]
Definition: ping.c:68
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
USHORT Protocol
Definition: titypes.h:207
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
#define ReferenceObject(Object)
Definition: titypes.h:14
LIST_ENTRY AddressFileListHead
Definition: fileobjs.c:21
KSPIN_LOCK AddressFileListLock
Definition: fileobjs.c:22
PADDRESS_FILE AddrSearchNext(PAF_SEARCH SearchContext)
Definition: fileobjs.c:231
USHORT Port
Definition: titypes.h:206

Referenced by RawIpReceive(), and UDPReceive().

◆ AddrSearchNext()

PADDRESS_FILE AddrSearchNext ( PAF_SEARCH  SearchContext)

Definition at line 231 of file fileobjs.c.

233 {
234  PLIST_ENTRY CurrentEntry;
235  PIP_ADDRESS IPAddress;
236  KIRQL OldIrql;
237  PADDRESS_FILE Current = NULL;
238  BOOLEAN Found = FALSE;
239  PADDRESS_FILE StartingAddrFile;
240 
242 
243  if (SearchContext->Next == &AddressFileListHead)
244  {
246  return NULL;
247  }
248 
249  /* Save this pointer so we can dereference it later */
250  StartingAddrFile = CONTAINING_RECORD(SearchContext->Next, ADDRESS_FILE, ListEntry);
251 
252  CurrentEntry = SearchContext->Next;
253 
254  while (CurrentEntry != &AddressFileListHead) {
255  Current = CONTAINING_RECORD(CurrentEntry, ADDRESS_FILE, ListEntry);
256 
257  IPAddress = &Current->Address;
258 
259  TI_DbgPrint(DEBUG_ADDRFILE, ("Comparing: ((%d, %d, %s), (%d, %d, %s)).\n",
260  WN2H(Current->Port),
261  Current->Protocol,
262  A2S(IPAddress),
263  WN2H(SearchContext->Port),
264  SearchContext->Protocol,
265  A2S(SearchContext->Address)));
266 
267  /* See if this address matches the search criteria */
268  if ((Current->Port == SearchContext->Port) &&
269  (Current->Protocol == SearchContext->Protocol) &&
270  (AddrReceiveMatch(IPAddress, SearchContext->Address))) {
271  /* We've found a match */
272  Found = TRUE;
273  break;
274  }
275  CurrentEntry = CurrentEntry->Flink;
276  }
277 
278  if (Found)
279  {
280  SearchContext->Next = CurrentEntry->Flink;
281 
282  if (SearchContext->Next != &AddressFileListHead)
283  {
284  /* Reference the next address file to prevent the link from disappearing behind our back */
285  ReferenceObject(CONTAINING_RECORD(SearchContext->Next, ADDRESS_FILE, ListEntry));
286  }
287 
288  /* Reference the returned address file before dereferencing the starting
289  * address file because it may be that Current == StartingAddrFile */
290  ReferenceObject(Current);
291  }
292  else
293  Current = NULL;
294 
295  DereferenceObject(StartingAddrFile);
296 
298 
299  return Current;
300 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define TRUE
Definition: types.h:120
PLIST_ENTRY Next
Definition: titypes.h:204
USHORT Protocol
Definition: titypes.h:138
PIP_ADDRESS Address
Definition: titypes.h:205
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
BOOLEAN AddrReceiveMatch(PIP_ADDRESS LocalAddress, PIP_ADDRESS RemoteAddress)
Definition: fileobjs.c:77
#define DereferenceObject(Object)
Definition: titypes.h:24
Definition: ip.h:23
UCHAR KIRQL
Definition: env_spec_w32.h:591
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
return Found
Definition: dirsup.c:1270
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define WN2H(w)
Definition: addrconv.c:35
USHORT Protocol
Definition: titypes.h:207
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
#define ReferenceObject(Object)
Definition: titypes.h:14
Definition: typedefs.h:117
LIST_ENTRY AddressFileListHead
Definition: fileobjs.c:21
KSPIN_LOCK AddressFileListLock
Definition: fileobjs.c:22
#define DEBUG_ADDRFILE
Definition: debug.h:23
USHORT Port
Definition: titypes.h:206
IP_ADDRESS Address
Definition: titypes.h:136
USHORT Port
Definition: titypes.h:139
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17

Referenced by AddrSearchFirst(), RawIpReceive(), and UDPReceive().

◆ ControlChannelFree()

VOID ControlChannelFree ( PVOID  Object)

Definition at line 368 of file fileobjs.c.

375 {
377 }
static IUnknown Object
Definition: main.c:512
#define CONTROL_CHANNEL_TAG
Definition: tags.h:12
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

Referenced by FileOpenControlChannel().

◆ FileCloseAddress()

NTSTATUS FileCloseAddress ( PTDI_REQUEST  Request)

Definition at line 580 of file fileobjs.c.

582 {
583  PADDRESS_FILE AddrFile = Request->Handle.AddressHandle;
584  KIRQL OldIrql;
585 
586  if (!Request->Handle.AddressHandle) return STATUS_INVALID_PARAMETER;
587 
588  LockObject(AddrFile, &OldIrql);
589 
590  if (InterlockedDecrement(&AddrFile->Sharers) != 0)
591  {
592  /* Still other guys have open handles to this, so keep it around */
593  UnlockObject(AddrFile, OldIrql);
594  return STATUS_SUCCESS;
595  }
596 
597  /* We have to close this listener because we started it */
598  if( AddrFile->Listener )
599  {
600  TCPClose( AddrFile->Listener );
601  }
602 
603  UnlockObject(AddrFile, OldIrql);
604 
605  DereferenceObject(AddrFile);
606 
607  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
608 
609  return STATUS_SUCCESS;
610 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG Sharers
Definition: titypes.h:140
#define DereferenceObject(Object)
Definition: titypes.h:24
#define LockObject(Object, Irql)
Definition: titypes.h:34
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
Definition: ndis.h:5173
UCHAR KIRQL
Definition: env_spec_w32.h:591
NTSTATUS TCPClose(PCONNECTION_ENDPOINT Connection)
Definition: tcp.c:150
#define UnlockObject(Object, OldIrql)
Definition: titypes.h:54
#define InterlockedDecrement
Definition: armddk.h:52
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
struct _CONNECTION_ENDPOINT * Listener
Definition: titypes.h:153
#define MAX_TRACE
Definition: debug.h:16
return STATUS_SUCCESS
Definition: btrfs.c:2777

Referenced by TiCloseFileObject().

◆ FileCloseConnection()

NTSTATUS FileCloseConnection ( PTDI_REQUEST  Request)

Definition at line 656 of file fileobjs.c.

658 {
659  PCONNECTION_ENDPOINT Connection;
660 
661  TI_DbgPrint(MID_TRACE, ("Called.\n"));
662 
663  Connection = Request->Handle.ConnectionContext;
664 
665  if (!Connection) return STATUS_INVALID_PARAMETER;
666 
667  TCPClose( Connection );
668 
669  Request->Handle.ConnectionContext = NULL;
670 
671  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
672 
673  return STATUS_SUCCESS;
674 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define MID_TRACE
Definition: debug.h:15
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
Definition: ndis.h:5173
NTSTATUS TCPClose(PCONNECTION_ENDPOINT Connection)
Definition: tcp.c:150
smooth NULL
Definition: ftsmooth.c:416
#define MAX_TRACE
Definition: debug.h:16
return STATUS_SUCCESS
Definition: btrfs.c:2777

Referenced by TiCloseFileObject().

◆ FileCloseControlChannel()

NTSTATUS FileCloseControlChannel ( PTDI_REQUEST  Request)

Definition at line 727 of file fileobjs.c.

729 {
730  if (!Request->Handle.ControlChannel) return STATUS_INVALID_PARAMETER;
731 
732  DereferenceObject((PCONTROL_CHANNEL)Request->Handle.ControlChannel);
733 
734  Request->Handle.ControlChannel = NULL;
735 
736  return STATUS_SUCCESS;
737 }
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define DereferenceObject(Object)
Definition: titypes.h:24
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
Definition: ndis.h:5173
smooth NULL
Definition: ftsmooth.c:416
return STATUS_SUCCESS
Definition: btrfs.c:2777

Referenced by TiCloseFileObject().

◆ FileOpenAddress()

NTSTATUS FileOpenAddress ( PTDI_REQUEST  Request,
PTA_IP_ADDRESS  Address,
USHORT  Protocol,
BOOLEAN  Shared,
PVOID  Options 
)

Definition at line 391 of file fileobjs.c.

397 {
398  PADDRESS_FILE AddrFile;
399 
400  TI_DbgPrint(MID_TRACE, ("Called (Proto %d).\n", Protocol));
401 
402  /* If it's shared and has a port specified, look for a match */
403  if ((Shared != FALSE) && (Address->Address[0].Address[0].sin_port != 0))
404  {
405  AddrFile = AddrFindShared(NULL, Address->Address[0].Address[0].sin_port, Protocol);
406  if (AddrFile != NULL)
407  {
408  Request->Handle.AddressHandle = AddrFile;
409  return STATUS_SUCCESS;
410  }
411  }
412 
413  AddrFile = ExAllocatePoolWithTag(NonPagedPool, sizeof(ADDRESS_FILE),
414  ADDR_FILE_TAG);
415  if (!AddrFile) {
416  TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
418  }
419 
420  RtlZeroMemory(AddrFile, sizeof(ADDRESS_FILE));
421 
422  AddrFile->RefCount = 1;
423  AddrFile->Free = AddrFileFree;
424  AddrFile->Sharers = 1;
425 
426  /* Set our default options */
427  AddrFile->TTL = 128;
428  AddrFile->DF = 0;
429  AddrFile->BCast = 1;
430  AddrFile->HeaderIncl = 1;
431  AddrFile->ProcessId = PsGetCurrentProcessId();
432 
433  _SEH2_TRY {
434  PTEB Teb;
435 
436  Teb = PsGetCurrentThreadTeb();
437  if (Teb != NULL)
438  AddrFile->SubProcessTag = Teb->SubProcessTag;
440  AddrFile->SubProcessTag = 0;
441  } _SEH2_END;
442 
443  KeQuerySystemTime(&AddrFile->CreationTime);
444 
445  /* Make sure address is a local unicast address or 0 */
446  /* FIXME: IPv4 only */
447  AddrFile->Family = Address->Address[0].AddressType;
448  AddrFile->Address.Address.IPv4Address = Address->Address[0].Address[0].in_addr;
449  AddrFile->Address.Type = IP_ADDRESS_V4;
450 
451  if (!AddrIsUnspecified(&AddrFile->Address) &&
452  !AddrLocateInterface(&AddrFile->Address)) {
453  TI_DbgPrint(MIN_TRACE, ("Non-local address given (0x%X).\n", A2S(&AddrFile->Address)));
454  ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
455  return STATUS_INVALID_ADDRESS;
456  }
457 
458  TI_DbgPrint(MID_TRACE, ("Opening address %s for communication (P=%d U=%d).\n",
459  A2S(&AddrFile->Address), Protocol, IPPROTO_UDP));
460 
461  /* Protocol specific handling */
462  switch (Protocol) {
463  case IPPROTO_TCP:
464  if (Address->Address[0].Address[0].sin_port)
465  {
466  /* The client specified an explicit port so we force a bind to this */
467  AddrFile->Port = TCPAllocatePort(Address->Address[0].Address[0].sin_port);
468 
469  /* Check for bind success */
470  if (AddrFile->Port == 0xffff)
471  {
472  ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
474  }
475 
476  /* Sanity check */
477  ASSERT(Address->Address[0].Address[0].sin_port == AddrFile->Port);
478  }
479  else if (!AddrIsUnspecified(&AddrFile->Address))
480  {
481  /* The client is trying to bind to a local address so allocate a port now too */
482  AddrFile->Port = TCPAllocatePort(0);
483 
484  /* Check for bind success */
485  if (AddrFile->Port == 0xffff)
486  {
487  ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
489  }
490  }
491  else
492  {
493  /* The client wants an unspecified port with an unspecified address so we wait to see what the TCP library gives us */
494  AddrFile->Port = 0;
495  }
496 
497  AddEntity(CO_TL_ENTITY, AddrFile, CO_TL_TCP);
498 
499  AddrFile->Send = NULL; /* TCPSendData */
500  break;
501 
502  case IPPROTO_UDP:
503  TI_DbgPrint(MID_TRACE,("Allocating udp port\n"));
504  AddrFile->Port =
505  UDPAllocatePort(Address->Address[0].Address[0].sin_port);
506 
507  if ((Address->Address[0].Address[0].sin_port &&
508  AddrFile->Port != Address->Address[0].Address[0].sin_port) ||
509  AddrFile->Port == 0xffff)
510  {
511  ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
513  }
514 
515  TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
516  AddrFile->Port,
517  Address->Address[0].Address[0].sin_port));
518 
519  AddEntity(CL_TL_ENTITY, AddrFile, CL_TL_UDP);
520 
521  AddrFile->Send = UDPSendDatagram;
522  break;
523 
524  case IPPROTO_ICMP:
525  AddrFile->Port = 0;
526  AddrFile->Send = ICMPSendDatagram;
527 
528  /* FIXME: Verify this */
529  AddEntity(ER_ENTITY, AddrFile, ER_ICMP);
530  break;
531 
532  default:
533  /* Use raw IP for all other protocols */
534  AddrFile->Port = 0;
535  AddrFile->Send = RawIPSendDatagram;
536 
537  /* FIXME: Verify this */
538  AddEntity(CL_TL_ENTITY, AddrFile, 0);
539  break;
540  }
541 
542  TI_DbgPrint(MID_TRACE, ("IP protocol number for address file object is %d.\n",
543  Protocol));
544 
545  TI_DbgPrint(MID_TRACE, ("Port number for address file object is %d.\n",
546  WN2H(AddrFile->Port)));
547 
548  /* Set protocol */
549  AddrFile->Protocol = Protocol;
550 
551  /* Initialize receive and transmit queues */
552  InitializeListHead(&AddrFile->ReceiveQueue);
553  InitializeListHead(&AddrFile->TransmitQueue);
554 
555  /* Initialize spin lock that protects the address file object */
556  KeInitializeSpinLock(&AddrFile->Lock);
557 
558  /* Return address file object */
559  Request->Handle.AddressHandle = AddrFile;
560 
561  /* Add address file to global list */
564  &AddrFile->ListEntry,
566 
567  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
568 
569  return STATUS_SUCCESS;
570 }
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
PADDRESS_FILE AddrFindShared(PIP_ADDRESS BindAddress, USHORT Port, USHORT Protocol)
Definition: fileobjs.c:190
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
IPv4_RAW_ADDRESS IPv4Address
Definition: ip.h:26
NTSTATUS ICMPSendDatagram(PADDRESS_FILE AddrFile, PTDI_CONNECTION_INFORMATION ConnInfo, PCHAR BufferData, ULONG DataSize, PULONG DataUsed)
Definition: icmp.c:118
UINT UDPAllocatePort(UINT HintPort)
Definition: udp.c:385
#define MID_TRACE
Definition: debug.h:15
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
UCHAR TTL
Definition: titypes.h:141
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
DATAGRAM_SEND_ROUTINE Send
Definition: titypes.h:148
LONG Sharers
Definition: titypes.h:140
LONG RefCount
Definition: titypes.h:132
USHORT Protocol
Definition: titypes.h:138
_In_ USHORT _In_ ULONG Protocol
Definition: wsk.h:182
HANDLE ProcessId
Definition: titypes.h:157
KSPIN_LOCK Lock
Definition: titypes.h:134
#define STATUS_ADDRESS_ALREADY_EXISTS
Definition: ntstatus.h:640
#define ADDR_FILE_TAG
Definition: tags.h:11
_SEH2_TRY
Definition: create.c:4250
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
Definition: ndis.h:5173
#define IP_ADDRESS_V4
Definition: ip.h:32
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:251
smooth NULL
Definition: ftsmooth.c:416
static WCHAR Address[46]
Definition: ping.c:68
#define CO_TL_ENTITY
Definition: tdiinfo.h:45
NTSTATUS UDPSendDatagram(PADDRESS_FILE AddrFile, PTDI_CONNECTION_INFORMATION ConnInfo, PCHAR BufferData, ULONG DataSize, PULONG DataUsed)
Definition: udp.c:150
UINT TCPAllocatePort(const UINT HintPort)
Definition: tcp.c:580
#define ER_ICMP
Definition: tdiinfo.h:59
NTSTATUS RawIPSendDatagram(PADDRESS_FILE AddrFile, PTDI_CONNECTION_INFORMATION ConnInfo, PCHAR Buffer, ULONG DataSize, PULONG DataUsed)
Definition: rawip.c:171
PVOID NTAPI PsGetCurrentThreadTeb(VOID)
Definition: thread.c:785
#define WN2H(w)
Definition: addrconv.c:35
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
VOID AddrFileFree(PVOID Object)
Definition: fileobjs.c:302
UINT HeaderIncl
Definition: titypes.h:144
LIST_ENTRY AddressFileListHead
Definition: fileobjs.c:21
KSPIN_LOCK AddressFileListLock
Definition: fileobjs.c:22
LIST_ENTRY ListEntry
Definition: titypes.h:131
PVOID SubProcessTag
Definition: titypes.h:158
#define CL_TL_ENTITY
Definition: tdiinfo.h:43
Definition: compat.h:484
UCHAR Type
Definition: ip.h:24
_SEH2_END
Definition: create.c:4424
PIP_INTERFACE AddrLocateInterface(PIP_ADDRESS MatchAddress)
Definition: interface.c:89
#define MAX_TRACE
Definition: debug.h:16
#define STATUS_INVALID_ADDRESS
Definition: ntstatus.h:543
IP_ADDRESS Address
Definition: titypes.h:136
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
UINT BCast
Definition: titypes.h:143
#define ER_ENTITY
Definition: tdiinfo.h:46
HANDLE NTAPI PsGetCurrentProcessId(VOID)
Definition: process.c:1123
OBJECT_FREE_ROUTINE Free
Definition: titypes.h:133
VOID AddEntity(ULONG EntityType, PVOID Context, ULONG Flags)
Definition: info.c:15
LIST_ENTRY TransmitQueue
Definition: titypes.h:150
USHORT Family
Definition: titypes.h:137
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define MIN_TRACE
Definition: debug.h:14
LIST_ENTRY ReceiveQueue
Definition: titypes.h:149
USHORT Port
Definition: titypes.h:139
#define CL_TL_UDP
Definition: tdiinfo.h:52
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
return STATUS_SUCCESS
Definition: btrfs.c:2777
#define CO_TL_TCP
Definition: tdiinfo.h:57
union IP_ADDRESS::@973 Address
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17
LARGE_INTEGER CreationTime
Definition: titypes.h:159

Referenced by TiCreateFileObject().

◆ FileOpenConnection()

NTSTATUS FileOpenConnection ( PTDI_REQUEST  Request,
PVOID  ClientContext 
)

Definition at line 621 of file fileobjs.c.

624 {
626  PCONNECTION_ENDPOINT Connection;
627 
628  TI_DbgPrint(MID_TRACE, ("Called.\n"));
629 
631 
632  if( !Connection ) return STATUS_NO_MEMORY;
633 
634  Status = TCPSocket( Connection, AF_INET, SOCK_STREAM, IPPROTO_TCP );
635 
636  if( !NT_SUCCESS(Status) ) {
637  DereferenceObject( Connection );
638  return Status;
639  }
640 
641  /* Return connection endpoint file object */
642  Request->Handle.ConnectionContext = Connection;
643 
644  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
645 
646  return STATUS_SUCCESS;
647 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define MID_TRACE
Definition: debug.h:15
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS TCPSocket(PCONNECTION_ENDPOINT Connection, UINT Family, UINT Type, UINT Proto)
Definition: tcp.c:125
#define DereferenceObject(Object)
Definition: titypes.h:24
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
Definition: ndis.h:5173
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ PVOID ClientContext
Definition: netioddk.h:55
Status
Definition: gdiplustypes.h:24
#define MAX_TRACE
Definition: debug.h:16
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
#define AF_INET
Definition: tcpip.h:117
#define SOCK_STREAM
Definition: tcpip.h:118
return STATUS_SUCCESS
Definition: btrfs.c:2777
PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint(PVOID ClientContext)
Definition: tcp.c:86

Referenced by TiCreateFileObject().

◆ FileOpenControlChannel()

NTSTATUS FileOpenControlChannel ( PTDI_REQUEST  Request)

Definition at line 683 of file fileobjs.c.

685 {
686  PCONTROL_CHANNEL ControlChannel;
687  TI_DbgPrint(MID_TRACE, ("Called.\n"));
688 
689  ControlChannel = ExAllocatePoolWithTag(NonPagedPool, sizeof(*ControlChannel),
691 
692  if (!ControlChannel) {
693  TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
695  }
696 
697  RtlZeroMemory(ControlChannel, sizeof(CONTROL_CHANNEL));
698 
699  /* Make sure address is a local unicast address or 0 */
700 
701  /* Locate address entry. If specified address is 0, a random address is chosen */
702 
703  /* Initialize receive and transmit queues */
704  InitializeListHead(&ControlChannel->ListEntry);
705 
706  /* Initialize spin lock that protects the address file object */
707  KeInitializeSpinLock(&ControlChannel->Lock);
708 
709  ControlChannel->RefCount = 1;
710  ControlChannel->Free = ControlChannelFree;
711 
712  /* Return address file object */
713  Request->Handle.ControlChannel = ControlChannel;
714 
715  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
716 
717  return STATUS_SUCCESS;
718 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define MID_TRACE
Definition: debug.h:15
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
VOID ControlChannelFree(PVOID Object)
Definition: fileobjs.c:368
OBJECT_FREE_ROUTINE Free
Definition: titypes.h:303
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
Definition: ndis.h:5173
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:251
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
LIST_ENTRY ListEntry
Definition: titypes.h:301
#define MAX_TRACE
Definition: debug.h:16
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define CONTROL_CHANNEL_TAG
Definition: tags.h:12
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define MIN_TRACE
Definition: debug.h:14
return STATUS_SUCCESS
Definition: btrfs.c:2777
KSPIN_LOCK Lock
Definition: titypes.h:304

Referenced by TiCreateFileObject().

◆ LogActiveObjects()

VOID LogActiveObjects ( VOID  )

Definition at line 109 of file fileobjs.c.

110 {
111 #ifdef LOG_OBJECTS
112  PLIST_ENTRY CurrentEntry;
113  KIRQL OldIrql;
114  PADDRESS_FILE AddrFile;
116 
117  DbgPrint("----------- TCP/IP Active Object Dump -------------\n");
118 
120 
121  CurrentEntry = AddressFileListHead.Flink;
122  while (CurrentEntry != &AddressFileListHead)
123  {
124  AddrFile = CONTAINING_RECORD(CurrentEntry, ADDRESS_FILE, ListEntry);
125 
126  DbgPrint("Address File (%s, %d, %d) @ 0x%p | Ref count: %d | Sharers: %d\n",
127  A2S(&AddrFile->Address), WN2H(AddrFile->Port), AddrFile->Protocol,
128  AddrFile, AddrFile->RefCount, AddrFile->Sharers);
129  DbgPrint("\tListener: ");
130  if (AddrFile->Listener == NULL)
131  DbgPrint("<None>\n");
132  else
133  DbgPrint("0x%p\n", AddrFile->Listener);
134  DbgPrint("\tAssociated endpoints: ");
135  if (AddrFile->Connection == NULL)
136  DbgPrint("<None>\n");
137  else
138  {
139  Conn = AddrFile->Connection;
140  while (Conn)
141  {
142  DbgPrint("0x%p ", Conn);
143  Conn = Conn->Next;
144  }
145  DbgPrint("\n");
146  }
147 
148  CurrentEntry = CurrentEntry->Flink;
149  }
150 
152 
154 
155  CurrentEntry = ConnectionEndpointListHead.Flink;
156  while (CurrentEntry != &ConnectionEndpointListHead)
157  {
158  Conn = CONTAINING_RECORD(CurrentEntry, CONNECTION_ENDPOINT, ListEntry);
159 
160  DbgPrint("Connection @ 0x%p | Ref count: %d\n", Conn, Conn->RefCount);
161  DbgPrint("\tPCB: ");
162  if (Conn->SocketContext == NULL)
163  DbgPrint("<None>\n");
164  else
165  {
166  DbgPrint("0x%p\n", Conn->SocketContext);
168  }
169  DbgPrint("\tPacket queue status: %s\n", IsListEmpty(&Conn->PacketQueue) ? "Empty" : "Not Empty");
170  DbgPrint("\tRequest lists: Connect: %s | Recv: %s | Send: %s | Shutdown: %s | Listen: %s\n",
171  IsListEmpty(&Conn->ConnectRequest) ? "Empty" : "Not Empty",
172  IsListEmpty(&Conn->ReceiveRequest) ? "Empty" : "Not Empty",
173  IsListEmpty(&Conn->SendRequest) ? "Empty" : "Not Empty",
174  IsListEmpty(&Conn->ShutdownRequest) ? "Empty" : "Not Empty",
175  IsListEmpty(&Conn->ListenRequest) ? "Empty" : "Not Empty");
176  DbgPrint("\tSend shutdown: %s\n", Conn->SendShutdown ? "Yes" : "No");
177  DbgPrint("\tReceive shutdown: %s\n", Conn->ReceiveShutdown ? "Yes" : "No");
178  if (Conn->ReceiveShutdown) DbgPrint("\tReceive shutdown status: 0x%x\n", Conn->ReceiveShutdownStatus);
179  DbgPrint("\tClosing: %s\n", Conn->Closing ? "Yes" : "No");
180 
181  CurrentEntry = CurrentEntry->Flink;
182  }
183 
185 
186  DbgPrint("---------------------------------------------------\n");
187 #endif
188 }
#define DbgPrint
Definition: loader.c:25
LONG Sharers
Definition: titypes.h:140
LONG RefCount
Definition: titypes.h:132
USHORT Protocol
Definition: titypes.h:138
NTSTATUS ReceiveShutdownStatus
Definition: titypes.h:286
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
LIST_ENTRY PacketQueue
Definition: titypes.h:277
struct _CONNECTION_ENDPOINT * Next
Definition: titypes.h:289
UCHAR KIRQL
Definition: env_spec_w32.h:591
smooth NULL
Definition: ftsmooth.c:416
BOOLEAN SendShutdown
Definition: titypes.h:284
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define WN2H(w)
Definition: addrconv.c:35
LIST_ENTRY ShutdownRequest
Definition: titypes.h:275
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
LIST_ENTRY ReceiveRequest
Definition: titypes.h:273
Definition: typedefs.h:117
struct _CONNECTION_ENDPOINT * Listener
Definition: titypes.h:153
LIST_ENTRY AddressFileListHead
Definition: fileobjs.c:21
KSPIN_LOCK AddressFileListLock
Definition: fileobjs.c:22
void LibTCPDumpPcb(PVOID SocketContext)
Definition: rostcp.c:39
BOOLEAN ReceiveShutdown
Definition: titypes.h:285
IP_ADDRESS Address
Definition: titypes.h:136
LIST_ENTRY ConnectRequest
Definition: titypes.h:271
LIST_ENTRY ListenRequest
Definition: titypes.h:272
LIST_ENTRY SendRequest
Definition: titypes.h:274
KSPIN_LOCK ConnectionEndpointListLock
Definition: fileobjs.c:26
struct _CONNECTION_ENDPOINT * Connection
Definition: titypes.h:151
USHORT Port
Definition: titypes.h:139
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17
LIST_ENTRY ConnectionEndpointListHead
Definition: fileobjs.c:25

Referenced by IPTimeoutDpcFn().

Variable Documentation

◆ AddressFileListHead

◆ AddressFileListLock

◆ ConnectionEndpointListHead

LIST_ENTRY ConnectionEndpointListHead

Definition at line 25 of file fileobjs.c.

Referenced by DriverEntry(), LogActiveObjects(), and TCPAllocateConnectionEndpoint().

◆ ConnectionEndpointListLock

KSPIN_LOCK ConnectionEndpointListLock