ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

event.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.