@@ -15,6 +15,8 @@ VOID PortsStartup( PPORT_SET PortSet,
15
15
UINT PortsToManage ) {
16
16
PortSet -> StartingPort = StartingPort ;
17
17
PortSet -> PortsToOversee = PortsToManage ;
18
+ PortSet -> LastAllocatedPort = PortSet -> StartingPort +
19
+ PortSet -> PortsToOversee - 1 ;
18
20
PortSet -> ProtoBitBuffer =
19
21
PoolAllocateBuffer ( (PortSet -> PortsToOversee + 7 ) / 8 );
20
22
RtlInitializeBitMap ( & PortSet -> ProtoBitmap ,
@@ -52,12 +54,23 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
52
54
53
55
ULONG AllocateAnyPort ( PPORT_SET PortSet ) {
54
56
ULONG AllocatedPort ;
57
+ ULONG Next ;
58
+
59
+ __asm__("int $3\n" );
60
+ if (PortSet -> StartingPort + PortSet -> PortsToOversee <=
61
+ PortSet -> LastAllocatedPort + 1 ) {
62
+ Next = PortSet -> StartingPort ;
63
+ } else {
64
+ Next = PortSet -> LastAllocatedPort + 1 ;
65
+ }
66
+ Next -= PortSet -> StartingPort ;
55
67
56
68
ExAcquireFastMutex ( & PortSet -> Mutex );
57
69
AllocatedPort = RtlFindClearBits ( & PortSet -> ProtoBitmap , 1 , 0 );
58
70
if ( AllocatedPort != (ULONG )- 1 ) {
59
71
RtlSetBit ( & PortSet -> ProtoBitmap , AllocatedPort );
60
72
AllocatedPort += PortSet -> StartingPort ;
73
+ PortSet -> LastAllocatedPort = AllocatedPort ;
61
74
}
62
75
ExReleaseFastMutex ( & PortSet -> Mutex );
63
76
@@ -68,16 +81,28 @@ ULONG AllocateAnyPort( PPORT_SET PortSet ) {
68
81
69
82
ULONG AllocatePortFromRange ( PPORT_SET PortSet , ULONG Lowest , ULONG Highest ) {
70
83
ULONG AllocatedPort ;
84
+ ULONG Next ;
71
85
86
+ if (PortSet -> StartingPort + PortSet -> PortsToOversee <=
87
+ PortSet -> LastAllocatedPort + 1 ) {
88
+ Next = PortSet -> StartingPort ;
89
+ } else {
90
+ Next = PortSet -> LastAllocatedPort + 1 ;
91
+ }
92
+ if (Next < Lowest || Highest <= Next ) {
93
+ Next = Lowest ;
94
+ }
95
+ Next -= PortSet -> StartingPort ;
72
96
Lowest -= PortSet -> StartingPort ;
73
97
Highest -= PortSet -> StartingPort ;
74
98
75
99
ExAcquireFastMutex ( & PortSet -> Mutex );
76
- AllocatedPort = RtlFindClearBits ( & PortSet -> ProtoBitmap , 1 , Lowest );
100
+ AllocatedPort = RtlFindClearBits ( & PortSet -> ProtoBitmap , 1 , Next );
77
101
if ( AllocatedPort != (ULONG )- 1 && AllocatedPort >= Lowest &&
78
102
AllocatedPort <= Highest ) {
79
103
RtlSetBit ( & PortSet -> ProtoBitmap , AllocatedPort );
80
104
AllocatedPort += PortSet -> StartingPort ;
105
+ PortSet -> LastAllocatedPort = AllocatedPort ;
81
106
}
82
107
ExReleaseFastMutex ( & PortSet -> Mutex );
83
108
0 commit comments