26
26
#include "tdiconn.h"
27
27
#include "debug.h"
28
28
29
- static BOOLEAN CantReadMore ( PAFD_FCB FCB ) {
30
- UINT BytesAvailable = FCB -> Recv .Content - FCB -> Recv .BytesUsed ;
29
+ static NTSTATUS RefillSocketBuffer ( PAFD_FCB FCB ) {
30
+ NTSTATUS Status = STATUS_PENDING ;
31
+
32
+ if ( !FCB -> ReceiveIrp .InFlightRequest ) {
33
+ AFD_DbgPrint (MID_TRACE ,("Replenishing buffer\n" ));
34
+
35
+ Status = TdiReceive ( & FCB -> ReceiveIrp .InFlightRequest ,
36
+ FCB -> Connection .Object ,
37
+ TDI_RECEIVE_NORMAL ,
38
+ FCB -> Recv .Window ,
39
+ FCB -> Recv .Size ,
40
+ & FCB -> ReceiveIrp .Iosb ,
41
+ ReceiveComplete ,
42
+ FCB );
43
+
44
+ if ( ( Status == STATUS_SUCCESS && !FCB -> ReceiveIrp .Iosb .Information ) ||
45
+ ( !NT_SUCCESS ( Status ) ) )
46
+ {
47
+ /* The socket has been closed */
48
+ FCB -> PollState |= AFD_EVENT_DISCONNECT ;
49
+ FCB -> Overread = TRUE;
50
+ Status = STATUS_FILE_CLOSED ;
51
+ }
52
+ else if ( Status == STATUS_SUCCESS )
53
+ {
54
+ FCB -> Recv .Content = FCB -> ReceiveIrp .Iosb .Information ;
55
+ FCB -> PollState |= AFD_EVENT_RECEIVE ;
56
+ }
57
+ PollReeval ( FCB -> DeviceExt , FCB -> FileObject );
58
+ }
31
59
32
- return ! BytesAvailable ;
60
+ return Status ;
33
61
}
34
62
35
63
static NTSTATUS TryToSatisfyRecvRequestFromBuffer ( PAFD_FCB FCB ,
@@ -46,7 +74,22 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
46
74
AFD_DbgPrint (MID_TRACE ,("Called, BytesAvailable = %d\n" ,
47
75
BytesAvailable ));
48
76
49
- if ( CantReadMore (FCB ) ) return STATUS_PENDING ;
77
+ if ( FCB -> Overread ) return STATUS_FILE_CLOSED ;
78
+ if ( !BytesAvailable ) {
79
+ FCB -> Recv .Content = FCB -> Recv .BytesUsed = 0 ;
80
+ Status = RefillSocketBuffer ( FCB );
81
+ if ( Status != STATUS_SUCCESS )
82
+ return Status ;
83
+
84
+ /* If RefillSocketBuffer returns STATUS_SUCCESS, we're good to go
85
+ * If RefillSocketBuffer returns STATUS_PENDING, then it's waiting on the transport for data
86
+ * If RefillSocketBuffer returns STATUS_FILE_CLOSED, then the connection was terminated
87
+ */
88
+
89
+ /* Recalculate BytesAvailable based on new data */
90
+ BytesAvailable = FCB -> Recv .Content - FCB -> Recv .BytesUsed ;
91
+ ASSERT (BytesAvailable );
92
+ }
50
93
51
94
Map = (PAFD_MAPBUF )(RecvReq -> BufferArray + RecvReq -> BufferCount );
52
95
@@ -88,23 +131,8 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
88
131
if ( FCB -> Recv .BytesUsed == FCB -> Recv .Content ) {
89
132
FCB -> Recv .BytesUsed = FCB -> Recv .Content = 0 ;
90
133
FCB -> PollState &= ~AFD_EVENT_RECEIVE ;
91
- PollReeval ( FCB -> DeviceExt , FCB -> FileObject );
92
134
93
- if ( !FCB -> ReceiveIrp .InFlightRequest ) {
94
- AFD_DbgPrint (MID_TRACE ,("Replenishing buffer\n" ));
95
-
96
- Status = TdiReceive ( & FCB -> ReceiveIrp .InFlightRequest ,
97
- FCB -> Connection .Object ,
98
- TDI_RECEIVE_NORMAL ,
99
- FCB -> Recv .Window ,
100
- FCB -> Recv .Size ,
101
- & FCB -> ReceiveIrp .Iosb ,
102
- ReceiveComplete ,
103
- FCB );
104
-
105
- if ( Status == STATUS_SUCCESS )
106
- FCB -> Recv .Content = FCB -> ReceiveIrp .Iosb .Information ;
107
- }
135
+ RefillSocketBuffer ( FCB );
108
136
}
109
137
110
138
return STATUS_SUCCESS ;
@@ -159,7 +187,7 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
159
187
}
160
188
}
161
189
162
- if ( !CantReadMore ( FCB ) ) {
190
+ if ( !FCB -> Recv . Content ) {
163
191
FCB -> PollState |= AFD_EVENT_RECEIVE ;
164
192
} else
165
193
FCB -> PollState &= ~AFD_EVENT_RECEIVE ;
0 commit comments