ReactOS 0.4.15-dev-7924-g5949c20
ports.c File Reference
#include "precomp.h"
Include dependency graph for ports.c:

Go to the source code of this file.

Functions

NTSTATUS PortsStartup (PPORT_SET PortSet, UINT StartingPort, UINT PortsToManage)
 
VOID PortsShutdown (PPORT_SET PortSet)
 
VOID DeallocatePort (PPORT_SET PortSet, ULONG Port)
 
BOOLEAN AllocatePort (PPORT_SET PortSet, ULONG Port)
 
ULONG AllocateAnyPort (PPORT_SET PortSet)
 
ULONG AllocatePortFromRange (PPORT_SET PortSet, ULONG Lowest, ULONG Highest)
 

Function Documentation

◆ AllocateAnyPort()

ULONG AllocateAnyPort ( PPORT_SET  PortSet)

Definition at line 69 of file ports.c.

69 {
70 ULONG AllocatedPort;
72
73 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
74 AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 );
75 if( AllocatedPort != (ULONG)-1 ) {
76 RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
77 AllocatedPort += PortSet->StartingPort;
78 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
79 return htons(AllocatedPort);
80 }
81 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
82
83 return -1;
84}
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
NTSYSAPI ULONG WINAPI RtlFindClearBits(PCRTL_BITMAP, ULONG, ULONG)
#define htons(x)
Definition: module.h:215
UINT StartingPort
Definition: ports.h:16
RTL_BITMAP ProtoBitmap
Definition: ports.h:14
KSPIN_LOCK Lock
Definition: ports.h:18
uint32_t ULONG
Definition: typedefs.h:59
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
NTSYSAPI VOID NTAPI RtlSetBit(_In_ PRTL_BITMAP BitMapHeader, _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber)
Definition: bitmap.c:304

◆ AllocatePort()

BOOLEAN AllocatePort ( PPORT_SET  PortSet,
ULONG  Port 
)

Definition at line 47 of file ports.c.

47 {
50
51 Port = htons(Port);
52
53 if ((Port < PortSet->StartingPort) ||
54 (Port >= PortSet->StartingPort + PortSet->PortsToOversee))
55 {
56 return FALSE;
57 }
58
59 Port -= PortSet->StartingPort;
60
61 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
62 Clear = RtlAreBitsClear( &PortSet->ProtoBitmap, Port, 1 );
63 if( Clear ) RtlSetBits( &PortSet->ProtoBitmap, Port, 1 );
64 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
65
66 return Clear;
67}
unsigned char BOOLEAN
#define FALSE
Definition: types.h:117
CPPORT Port[4]
Definition: headless.c:35
NTSYSAPI BOOLEAN WINAPI RtlAreBitsClear(PCRTL_BITMAP, ULONG, ULONG)
NTSYSAPI void WINAPI RtlSetBits(PRTL_BITMAP, ULONG, ULONG)
static void Clear(void)
Definition: treeview.c:386
UINT PortsToOversee
Definition: ports.h:17

Referenced by TCPAllocatePort(), and UDPAllocatePort().

◆ AllocatePortFromRange()

ULONG AllocatePortFromRange ( PPORT_SET  PortSet,
ULONG  Lowest,
ULONG  Highest 
)

Definition at line 86 of file ports.c.

86 {
87 ULONG AllocatedPort;
89
90 if ((Lowest < PortSet->StartingPort) ||
91 (Highest >= PortSet->StartingPort + PortSet->PortsToOversee))
92 {
93 return -1;
94 }
95
96 Lowest -= PortSet->StartingPort;
97 Highest -= PortSet->StartingPort;
98
99 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
100 AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest );
101 if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) {
102 RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
103 AllocatedPort += PortSet->StartingPort;
104 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
105 return htons(AllocatedPort);
106 }
107 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
108
109 return -1;
110}

Referenced by TCPAllocatePort(), and UDPAllocatePort().

◆ DeallocatePort()

VOID DeallocatePort ( PPORT_SET  PortSet,
ULONG  Port 
)

Definition at line 35 of file ports.c.

35 {
37
38 Port = htons(Port);
39 ASSERT(Port >= PortSet->StartingPort);
40 ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee);
41
42 KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
43 RtlClearBits( &PortSet->ProtoBitmap, Port - PortSet->StartingPort, 1 );
44 KeReleaseSpinLock( &PortSet->Lock, OldIrql );
45}
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
#define ASSERT(a)
Definition: mode.c:44

Referenced by TCPFreePort(), and UDPFreePort().

◆ PortsShutdown()

VOID PortsShutdown ( PPORT_SET  PortSet)

Definition at line 31 of file ports.c.

31 {
33}
#define PORT_SET_TAG
Definition: tags.h:26
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
PVOID ProtoBitBuffer
Definition: ports.h:15

Referenced by TCPShutdown(), and UDPShutdown().

◆ PortsStartup()

NTSTATUS PortsStartup ( PPORT_SET  PortSet,
UINT  StartingPort,
UINT  PortsToManage 
)

Definition at line 13 of file ports.c.

15 {
16 PortSet->StartingPort = StartingPort;
17 PortSet->PortsToOversee = PortsToManage;
18
19 PortSet->ProtoBitBuffer =
24 PortSet->ProtoBitBuffer,
25 PortSet->PortsToOversee );
26 RtlClearAllBits( &PortSet->ProtoBitmap );
27 KeInitializeSpinLock( &PortSet->Lock );
28 return STATUS_SUCCESS;
29}
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define NonPagedPool
Definition: env_spec_w32.h:307
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158

Referenced by TCPStartup(), and UDPStartup().