Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenevent.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Ancillary Function Driver 00004 * FILE: afd/event.c 00005 * PURPOSE: TDI event handlers 00006 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) 00007 * REVISIONS: 00008 * CSH 01/09-2000 Created 00009 */ 00010 #include <afd.h> 00011 00012 NTSTATUS AfdEventError( 00013 IN PVOID TdiEventContext, 00014 IN NTSTATUS Status) 00015 { 00016 AFD_DbgPrint(MAX_TRACE, ("Called.\n")); 00017 00018 return STATUS_SUCCESS; 00019 } 00020 00021 00022 NTSTATUS AfdEventDisconnect( 00023 IN PVOID TdiEventContext, 00024 IN CONNECTION_CONTEXT ConnectionContext, 00025 IN LONG DisconnectDataLength, 00026 IN PVOID DisconnectData, 00027 IN LONG DisconnectInformationLength, 00028 IN PVOID DisconnectInformation, 00029 IN ULONG DisconnectFlags) 00030 { 00031 AFD_DbgPrint(MAX_TRACE, ("Called.\n")); 00032 00033 return STATUS_SUCCESS; 00034 } 00035 00036 00037 NTSTATUS AfdEventReceive( 00038 IN PVOID TdiEventContext, 00039 IN CONNECTION_CONTEXT ConnectionContext, 00040 IN ULONG ReceiveFlags, 00041 IN ULONG BytesIndicated, 00042 IN ULONG BytesAvailable, 00043 OUT ULONG *BytesTaken, 00044 IN PVOID Tsdu, 00045 OUT PIRP *IoRequestPacket) 00046 { 00047 PAFDFCB FCB = (PAFDFCB)TdiEventContext; 00048 PVOID ReceiveBuffer; 00049 PAFD_BUFFER Buffer; 00050 KIRQL OldIrql; 00051 00052 AFD_DbgPrint(MAX_TRACE, ("Called.\n")); 00053 00054 AFD_DbgPrint(MID_TRACE, ("Receiving (%d) bytes on socket\n", 00055 BytesAvailable)); 00056 00057 ReceiveBuffer = ExAllocatePool(NonPagedPool, BytesAvailable); 00058 if (!ReceiveBuffer) 00059 return STATUS_INSUFFICIENT_RESOURCES; 00060 00061 /*Buffer = (PAFD_BUFFER)ExAllocateFromNPagedLookasideList( 00062 &BufferLookasideList);*/ 00063 Buffer = (PAFD_BUFFER)ExAllocatePool(NonPagedPool, sizeof(AFD_BUFFER)); 00064 if (!Buffer) { 00065 ExFreePool(ReceiveBuffer); 00066 return STATUS_INSUFFICIENT_RESOURCES; 00067 } 00068 00069 /* Copy the data to a local buffer */ 00070 RtlCopyMemory(ReceiveBuffer, Tsdu, BytesAvailable); 00071 00072 Buffer->Buffer.len = BytesAvailable; 00073 Buffer->Buffer.buf = ReceiveBuffer; 00074 Buffer->Offset = 0; 00075 00076 KeAcquireSpinLock(&FCB->ReceiveQueueLock, &OldIrql); 00077 00078 InsertTailList( &FCB->ReceiveQueue, &Buffer->ListEntry ); 00079 00080 TryToSatisfyRecvRequest( FCB, TRUE ); 00081 00082 KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); 00083 00084 *BytesTaken = BytesAvailable; 00085 00086 AFD_DbgPrint(MAX_TRACE, ("Leaving.\n")); 00087 00088 return STATUS_SUCCESS; 00089 } 00090 00091 00092 TDI_STATUS ClientEventReceiveExpedited( 00093 IN PVOID TdiEventContext, 00094 IN CONNECTION_CONTEXT ConnectionContext, 00095 IN ULONG ReceiveFlags, 00096 IN ULONG BytesIndicated, 00097 IN ULONG BytesAvailable, 00098 OUT ULONG *BytesTaken, 00099 IN PVOID Tsdu, 00100 OUT PIRP *IoRequestPacket) 00101 { 00102 AFD_DbgPrint(MAX_TRACE, ("Called.\n")); 00103 00104 return STATUS_SUCCESS; 00105 } 00106 00107 00108 NTSTATUS ClientEventChainedReceive( 00109 IN PVOID TdiEventContext, 00110 IN CONNECTION_CONTEXT ConnectionContext, 00111 IN ULONG ReceiveFlags, 00112 IN ULONG ReceiveLength, 00113 IN ULONG StartingOffset, 00114 IN PMDL Tsdu, 00115 IN PVOID TsduDescriptor) 00116 { 00117 AFD_DbgPrint(MAX_TRACE, ("Called.\n")); 00118 00119 return STATUS_SUCCESS; 00120 } 00121 00122 00123 NTSTATUS AfdEventReceiveDatagramHandler( 00124 IN PVOID TdiEventContext, 00125 IN LONG SourceAddressLength, 00126 IN PVOID SourceAddress, 00127 IN LONG OptionsLength, 00128 IN PVOID Options, 00129 IN ULONG ReceiveDatagramFlags, 00130 IN ULONG BytesIndicated, 00131 IN ULONG BytesAvailable, 00132 OUT ULONG *BytesTaken, 00133 IN PVOID Tsdu, 00134 OUT PIRP *IoRequestPacket) 00135 { 00136 PAFDFCB FCB = (PAFDFCB)TdiEventContext; 00137 PAFD_READ_REQUEST ReadRequest; 00138 PVOID ReceiveBuffer; 00139 PAFD_BUFFER Buffer; 00140 PLIST_ENTRY Entry; 00141 NTSTATUS Status; 00142 KIRQL OldIrql; 00143 ULONG Count; 00144 BOOLEAN CompleteIrp; 00145 00146 AFD_DbgPrint(MAX_TRACE, ("Called.\n")); 00147 00148 AFD_DbgPrint(MID_TRACE, ("Receiving (%d) bytes from (0x%X).\n", 00149 BytesAvailable, *(PULONG)SourceAddress)); 00150 00151 ReceiveBuffer = ExAllocatePool(NonPagedPool, BytesAvailable); 00152 if (!ReceiveBuffer) 00153 return STATUS_INSUFFICIENT_RESOURCES; 00154 00155 /*Buffer = (PAFD_BUFFER)ExAllocateFromNPagedLookasideList( 00156 &BufferLookasideList);*/ 00157 Buffer = (PAFD_BUFFER)ExAllocatePool(NonPagedPool, sizeof(AFD_BUFFER)); 00158 if (!Buffer) { 00159 ExFreePool(ReceiveBuffer); 00160 return STATUS_INSUFFICIENT_RESOURCES; 00161 } 00162 00163 /* Copy the data to a local buffer */ 00164 RtlCopyMemory(ReceiveBuffer, Tsdu, BytesAvailable); 00165 00166 Buffer->Buffer.len = BytesAvailable; 00167 Buffer->Buffer.buf = ReceiveBuffer; 00168 Buffer->Offset = 0; 00169 00170 ExInterlockedInsertTailList(&FCB->ReceiveQueue, 00171 &Buffer->ListEntry, 00172 &FCB->ReceiveQueueLock); 00173 00174 KeAcquireSpinLock(&FCB->ReceiveQueueLock, &OldIrql); 00175 00176 if (CompleteIrp = !IsListEmpty(&FCB->ReadRequestQueue)) { 00177 AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n")); 00178 00179 Entry = RemoveHeadList(&FCB->ReceiveQueue); 00180 ReadRequest = CONTAINING_RECORD(Entry, AFD_READ_REQUEST, ListEntry); 00181 00182 Status = FillWSABuffers(FCB, 00183 ReadRequest->RecvFromRequest->Buffers, 00184 ReadRequest->RecvFromRequest->BufferCount, 00185 &Count, 00186 FALSE); /* Packet oriented */ 00187 ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count; 00188 ReadRequest->RecvFromReply->Status = NO_ERROR; 00189 00190 ReadRequest->Irp->IoStatus.Information = 0; 00191 ReadRequest->Irp->IoStatus.Status = Status; 00192 } 00193 00194 KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); 00195 00196 if (CompleteIrp) { 00197 AFD_DbgPrint(MAX_TRACE, ("Completing IRP at (0x%X).\n", ReadRequest->Irp)); 00198 IoCompleteRequest(ReadRequest->Irp, IO_NETWORK_INCREMENT); 00199 *BytesTaken = BytesAvailable; 00200 } 00201 00202 AFD_DbgPrint(MAX_TRACE, ("Leaving.\n")); 00203 00204 return STATUS_SUCCESS; 00205 } 00206 00207 00208 NTSTATUS AfdRegisterEventHandlers( 00209 PAFDFCB FCB) 00210 { 00211 NTSTATUS Status; 00212 00213 assert(FCB->TdiAddressObject); 00214 00215 /* Report errors for all types of sockets */ 00216 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00217 TDI_EVENT_ERROR, 00218 (PVOID)AfdEventError, 00219 (PVOID)FCB); 00220 if (!NT_SUCCESS(Status)) { return Status; } 00221 00222 switch (FCB->SocketType) { 00223 case SOCK_STREAM: 00224 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00225 TDI_EVENT_DISCONNECT, 00226 (PVOID)AfdEventDisconnect, 00227 (PVOID)FCB); 00228 if (!NT_SUCCESS(Status)) { return Status; } 00229 00230 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00231 TDI_EVENT_RECEIVE, 00232 (PVOID)AfdEventReceive, 00233 (PVOID)FCB); 00234 if (!NT_SUCCESS(Status)) { return Status; } 00235 00236 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00237 TDI_EVENT_RECEIVE_EXPEDITED, 00238 (PVOID)ClientEventReceiveExpedited, 00239 (PVOID)FCB); 00240 if (!NT_SUCCESS(Status)) { return Status; } 00241 00242 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00243 TDI_EVENT_CHAINED_RECEIVE, 00244 (PVOID)ClientEventChainedReceive, 00245 (PVOID)FCB); 00246 if (!NT_SUCCESS(Status)) { return Status; } 00247 break; 00248 00249 case SOCK_DGRAM: 00250 case SOCK_RAW: 00251 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00252 TDI_EVENT_RECEIVE_DATAGRAM, 00253 (PVOID)AfdEventReceiveDatagramHandler, 00254 (PVOID)FCB); 00255 if (!NT_SUCCESS(Status)) { return Status; } 00256 } 00257 return STATUS_SUCCESS; 00258 } 00259 00260 00261 NTSTATUS AfdDeregisterEventHandlers( 00262 PAFDFCB FCB) 00263 { 00264 NTSTATUS Status; 00265 00266 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00267 TDI_EVENT_ERROR, 00268 NULL, 00269 NULL); 00270 if (!NT_SUCCESS(Status)) { return Status; } 00271 00272 switch (FCB->SocketType) { 00273 case SOCK_STREAM: 00274 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00275 TDI_EVENT_DISCONNECT, 00276 NULL, 00277 NULL); 00278 if (!NT_SUCCESS(Status)) { return Status; } 00279 00280 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00281 TDI_EVENT_RECEIVE, 00282 NULL, 00283 NULL); 00284 if (!NT_SUCCESS(Status)) { return Status; } 00285 00286 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00287 TDI_EVENT_RECEIVE_EXPEDITED, 00288 NULL, 00289 NULL); 00290 if (!NT_SUCCESS(Status)) { return Status; } 00291 00292 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00293 TDI_EVENT_CHAINED_RECEIVE, 00294 NULL, 00295 NULL); 00296 if (!NT_SUCCESS(Status)) { return Status; } 00297 break; 00298 00299 case SOCK_DGRAM: 00300 case SOCK_RAW: 00301 Status = TdiSetEventHandler(FCB->TdiAddressObject, 00302 TDI_EVENT_RECEIVE_DATAGRAM, 00303 NULL, 00304 NULL); 00305 if (!NT_SUCCESS(Status)) { return Status; } 00306 } 00307 return STATUS_SUCCESS; 00308 } 00309 00310 00311 /* EOF */ Generated on Sun May 27 2012 04:24:46 for ReactOS by
1.7.6.1
|