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

rw.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:  See COPYING in the top level directory
00003  * PROJECT:    ReactOS kernel
00004  * FILE:       drivers/filesystems/msfs/rw.c
00005  * PURPOSE:    Mailslot filesystem
00006  * PROGRAMMER: Eric Kohl
00007  */
00008 
00009 /* INCLUDES ******************************************************************/
00010 
00011 #include "msfs.h"
00012 
00013 #define NDEBUG
00014 #include <debug.h>
00015 
00016 
00017 /* FUNCTIONS *****************************************************************/
00018 
00019 NTSTATUS DEFAULTAPI
00020 MsfsRead(PDEVICE_OBJECT DeviceObject,
00021          PIRP Irp)
00022 {
00023     PIO_STACK_LOCATION IoStack;
00024     PFILE_OBJECT FileObject;
00025     PMSFS_FCB Fcb;
00026     PMSFS_CCB Ccb;
00027     PMSFS_MESSAGE Message;
00028     KIRQL oldIrql;
00029     ULONG Length;
00030     ULONG LengthRead = 0;
00031     PVOID Buffer;
00032     NTSTATUS Status;
00033 
00034     DPRINT("MsfsRead(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
00035 
00036     IoStack = IoGetCurrentIrpStackLocation (Irp);
00037     FileObject = IoStack->FileObject;
00038     Fcb = (PMSFS_FCB)FileObject->FsContext;
00039     Ccb = (PMSFS_CCB)FileObject->FsContext2;
00040 
00041     DPRINT("MailslotName: %wZ\n", &Fcb->Name);
00042 
00043     /* reading is not permitted on client side */
00044     if (Fcb->ServerCcb != Ccb)
00045     {
00046         Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
00047         Irp->IoStatus.Information = 0;
00048 
00049         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00050 
00051         return STATUS_ACCESS_DENIED;
00052     }
00053 
00054     Length = IoStack->Parameters.Read.Length;
00055     if (Irp->MdlAddress)
00056         Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);
00057     else
00058         Buffer = Irp->UserBuffer;
00059 
00060     Status = KeWaitForSingleObject(&Fcb->MessageEvent,
00061                                    UserRequest,
00062                                    KernelMode,
00063                                    FALSE,
00064                                    &Fcb->TimeOut);
00065     if (NT_SUCCESS(Status))
00066     {
00067         if (Fcb->MessageCount > 0)
00068         {
00069             /* copy current message into buffer */
00070             Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,
00071                                         MSFS_MESSAGE,
00072                                         MessageListEntry);
00073 
00074             memcpy(Buffer, &Message->Buffer, min(Message->Size,Length));
00075             LengthRead = Message->Size;
00076 
00077             KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
00078             RemoveHeadList(&Fcb->MessageListHead);
00079             KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
00080 
00081             ExFreePool(Message);
00082             Fcb->MessageCount--;
00083             if (Fcb->MessageCount == 0)
00084             {
00085                 KeClearEvent(&Fcb->MessageEvent);
00086             }
00087         }
00088         else if (Fcb->TimeOut.QuadPart != 0LL)
00089         {
00090             /* No message found after waiting */
00091             Status = STATUS_IO_TIMEOUT;
00092         }
00093      }
00094 
00095     Irp->IoStatus.Status = Status;
00096     Irp->IoStatus.Information = LengthRead;
00097 
00098     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00099 
00100     return Status;
00101 }
00102 
00103 
00104 NTSTATUS DEFAULTAPI
00105 MsfsWrite(PDEVICE_OBJECT DeviceObject,
00106           PIRP Irp)
00107 {
00108     PIO_STACK_LOCATION IoStack;
00109     PFILE_OBJECT FileObject;
00110     PMSFS_FCB Fcb;
00111     PMSFS_CCB Ccb;
00112     PMSFS_MESSAGE Message;
00113     KIRQL oldIrql;
00114     ULONG Length;
00115     PVOID Buffer;
00116 
00117     DPRINT("MsfsWrite(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
00118 
00119     IoStack = IoGetCurrentIrpStackLocation (Irp);
00120     FileObject = IoStack->FileObject;
00121     Fcb = (PMSFS_FCB)FileObject->FsContext;
00122     Ccb = (PMSFS_CCB)FileObject->FsContext2;
00123 
00124     DPRINT("MailslotName: %wZ\n", &Fcb->Name);
00125 
00126     /* writing is not permitted on server side */
00127     if (Fcb->ServerCcb == Ccb)
00128     {
00129         Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
00130         Irp->IoStatus.Information = 0;
00131 
00132         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00133 
00134         return STATUS_ACCESS_DENIED;
00135     }
00136 
00137     Length = IoStack->Parameters.Write.Length;
00138     if (Irp->MdlAddress)
00139         Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);
00140     else
00141         Buffer = Irp->UserBuffer;
00142 
00143     DPRINT("Length: %lu Message: %s\n", Length, (PUCHAR)Buffer);
00144 
00145     /* Allocate new message */
00146     Message = ExAllocatePool(NonPagedPool,
00147                              sizeof(MSFS_MESSAGE) + Length);
00148     if (Message == NULL)
00149     {
00150         Irp->IoStatus.Status = STATUS_NO_MEMORY;
00151         Irp->IoStatus.Information = 0;
00152 
00153         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00154 
00155         return STATUS_NO_MEMORY;
00156     }
00157 
00158     Message->Size = Length;
00159     memcpy(&Message->Buffer, Buffer, Length);
00160 
00161     KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
00162     InsertTailList(&Fcb->MessageListHead, &Message->MessageListEntry);
00163     KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
00164 
00165     Fcb->MessageCount++;
00166     if (Fcb->MessageCount == 1)
00167     {
00168         KeSetEvent(&Fcb->MessageEvent,
00169                    0,
00170                    FALSE);
00171     }
00172 
00173     Irp->IoStatus.Status = STATUS_SUCCESS;
00174     Irp->IoStatus.Information = Length;
00175 
00176     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00177 
00178     return STATUS_SUCCESS;
00179 }
00180 
00181 /* EOF */

Generated on Sat May 26 2012 04:22:59 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.