2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver
5 * PURPOSE: TDI event handlers
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/09-2000 Created
12 NTSTATUS
AfdEventError(
13 IN PVOID TdiEventContext
,
16 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
18 return STATUS_SUCCESS
;
22 NTSTATUS
AfdEventDisconnect(
23 IN PVOID TdiEventContext
,
24 IN CONNECTION_CONTEXT ConnectionContext
,
25 IN LONG DisconnectDataLength
,
26 IN PVOID DisconnectData
,
27 IN LONG DisconnectInformationLength
,
28 IN PVOID DisconnectInformation
,
29 IN ULONG DisconnectFlags
)
31 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
33 return STATUS_SUCCESS
;
37 NTSTATUS
AfdEventReceive(
38 IN PVOID TdiEventContext
,
39 IN CONNECTION_CONTEXT ConnectionContext
,
40 IN ULONG ReceiveFlags
,
41 IN ULONG BytesIndicated
,
42 IN ULONG BytesAvailable
,
43 OUT ULONG
*BytesTaken
,
45 OUT PIRP
*IoRequestPacket
)
47 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
49 return STATUS_SUCCESS
;
53 TDI_STATUS
ClientEventReceiveExpedited(
54 IN PVOID TdiEventContext
,
55 IN CONNECTION_CONTEXT ConnectionContext
,
56 IN ULONG ReceiveFlags
,
57 IN ULONG BytesIndicated
,
58 IN ULONG BytesAvailable
,
59 OUT ULONG
*BytesTaken
,
61 OUT PIRP
*IoRequestPacket
)
63 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
65 return STATUS_SUCCESS
;
69 NTSTATUS
ClientEventChainedReceive(
70 IN PVOID TdiEventContext
,
71 IN CONNECTION_CONTEXT ConnectionContext
,
72 IN ULONG ReceiveFlags
,
73 IN ULONG ReceiveLength
,
74 IN ULONG StartingOffset
,
76 IN PVOID TsduDescriptor
)
78 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
80 return STATUS_SUCCESS
;
84 NTSTATUS
AfdEventReceiveDatagramHandler(
85 IN PVOID TdiEventContext
,
86 IN LONG SourceAddressLength
,
87 IN PVOID SourceAddress
,
88 IN LONG OptionsLength
,
90 IN ULONG ReceiveDatagramFlags
,
91 IN ULONG BytesIndicated
,
92 IN ULONG BytesAvailable
,
93 OUT ULONG
*BytesTaken
,
95 OUT PIRP
*IoRequestPacket
)
97 PAFDFCB FCB
= (PAFDFCB
)TdiEventContext
;
98 PAFD_READ_REQUEST ReadRequest
;
105 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
107 AFD_DbgPrint(MID_TRACE
, ("Receiving (%d) bytes from (0x%X).\n",
108 BytesAvailable
, *(PULONG
)SourceAddress
));
110 ReceiveBuffer
= ExAllocatePool(NonPagedPool
, BytesAvailable
);
111 if (!ReceiveBuffer
) {
112 return STATUS_INSUFFICIENT_RESOURCES
;
115 /*Buffer = (PAFD_BUFFER)ExAllocateFromNPagedLookasideList(
116 &BufferLookasideList);*/
117 Buffer
= (PAFD_BUFFER
)ExAllocatePool(NonPagedPool
, sizeof(AFD_BUFFER
));
119 ExFreePool(ReceiveBuffer
);
120 return STATUS_INSUFFICIENT_RESOURCES
;
123 Buffer
->Buffer
.len
= BytesAvailable
;
124 Buffer
->Buffer
.buf
= ReceiveBuffer
;
126 ExInterlockedInsertTailList(
129 &FCB
->ReceiveQueueLock
);
131 KeAcquireSpinLock(&FCB
->ReadRequestQueueLock
, &OldIrql
);
133 if (!IsListEmpty(&FCB
->ReadRequestQueue
)) {
134 Entry
= RemoveHeadList(&FCB
->ReceiveQueue
);
135 ReadRequest
= CONTAINING_RECORD(Entry
, AFD_READ_REQUEST
, ListEntry
);
137 Status
= FillWSABuffers(
139 ReadRequest
->RecvFromRequest
->Buffers
,
140 ReadRequest
->RecvFromRequest
->BufferCount
,
141 &ReadRequest
->RecvFromReply
->NumberOfBytesRecvd
);
142 ReadRequest
->RecvFromReply
->Status
= NO_ERROR
;
144 ReadRequest
->Irp
->IoStatus
.Information
= 0;
145 ReadRequest
->Irp
->IoStatus
.Status
= Status
;
146 IoCompleteRequest(ReadRequest
->Irp
, IO_NETWORK_INCREMENT
);
149 KeReleaseSpinLock(&FCB
->ReadRequestQueueLock
, OldIrql
);
151 *BytesTaken
= BytesAvailable
;
153 AFD_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
155 return STATUS_SUCCESS
;
159 NTSTATUS
AfdRegisterEventHandlers(
164 assert(FCB
->TdiAddressObject
);
166 /* Report errors for all types of sockets */
167 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
169 (PVOID
)AfdEventError
,
171 if (!NT_SUCCESS(Status
)) { return Status
; }
173 switch (FCB
->SocketType
) {
175 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
176 TDI_EVENT_DISCONNECT
,
177 (PVOID
)AfdEventDisconnect
,
179 if (!NT_SUCCESS(Status
)) { return Status
; }
181 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
183 (PVOID
)AfdEventReceive
,
185 if (!NT_SUCCESS(Status
)) { return Status
; }
187 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
188 TDI_EVENT_RECEIVE_EXPEDITED
,
189 (PVOID
)ClientEventReceiveExpedited
,
191 if (!NT_SUCCESS(Status
)) { return Status
; }
193 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
194 TDI_EVENT_CHAINED_RECEIVE
,
195 (PVOID
)ClientEventChainedReceive
,
197 if (!NT_SUCCESS(Status
)) { return Status
; }
202 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
203 TDI_EVENT_RECEIVE_DATAGRAM
,
204 (PVOID
)AfdEventReceiveDatagramHandler
,
206 if (!NT_SUCCESS(Status
)) { return Status
; }
208 return STATUS_SUCCESS
;
212 NTSTATUS
AfdDeregisterEventHandlers(
217 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
221 if (!NT_SUCCESS(Status
)) { return Status
; }
223 switch (FCB
->SocketType
) {
225 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
226 TDI_EVENT_DISCONNECT
,
229 if (!NT_SUCCESS(Status
)) { return Status
; }
231 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
235 if (!NT_SUCCESS(Status
)) { return Status
; }
237 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
238 TDI_EVENT_RECEIVE_EXPEDITED
,
241 if (!NT_SUCCESS(Status
)) { return Status
; }
243 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
244 TDI_EVENT_CHAINED_RECEIVE
,
247 if (!NT_SUCCESS(Status
)) { return Status
; }
252 Status
= TdiSetEventHandler(FCB
->TdiAddressObject
,
253 TDI_EVENT_RECEIVE_DATAGRAM
,
256 if (!NT_SUCCESS(Status
)) { return Status
; }
258 return STATUS_SUCCESS
;