Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenrw.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
1.7.6.1
|