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

finfo.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/finfo.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 #undef MAILSLOT_NO_MESSAGE
00017 #undef MAILSLOT_WAIT_FOREVER
00018 #define MAILSLOT_NO_MESSAGE   MAXULONG
00019 #define MAILSLOT_WAIT_FOREVER MAXULONG
00020 
00021 
00022 /* FUNCTIONS *****************************************************************/
00023 
00024 static NTSTATUS
00025 MsfsQueryMailslotInformation(PMSFS_FCB Fcb,
00026                              PFILE_MAILSLOT_QUERY_INFORMATION Buffer,
00027                              PULONG BufferLength)
00028 {
00029     KIRQL oldIrql;
00030 
00031     if (*BufferLength < sizeof(FILE_MAILSLOT_QUERY_INFORMATION))
00032         return STATUS_BUFFER_OVERFLOW;
00033 
00034     Buffer->MaximumMessageSize = Fcb->MaxMessageSize;
00035     Buffer->ReadTimeout = Fcb->TimeOut;
00036 
00037     KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
00038     Buffer->MessagesAvailable = Fcb->MessageCount;
00039     if (Fcb->MessageCount == 0)
00040     {
00041         Buffer->NextMessageSize = MAILSLOT_NO_MESSAGE;
00042     }
00043     else
00044     {
00045         PMSFS_MESSAGE Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink,
00046                                                   MSFS_MESSAGE,
00047                                                   MessageListEntry);
00048         Buffer->NextMessageSize = Message->Size;
00049     }
00050     KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
00051 
00052     *BufferLength -= sizeof(FILE_MAILSLOT_QUERY_INFORMATION);
00053 
00054     return STATUS_SUCCESS;
00055 }
00056 
00057 
00058 static NTSTATUS
00059 MsfsSetMailslotInformation(PMSFS_FCB Fcb,
00060                            PFILE_MAILSLOT_SET_INFORMATION Buffer,
00061                            PULONG BufferLength)
00062 {
00063     if (*BufferLength < sizeof(FILE_MAILSLOT_SET_INFORMATION))
00064         return STATUS_BUFFER_OVERFLOW;
00065 
00066     Fcb->TimeOut = *Buffer->ReadTimeout;
00067 
00068     return STATUS_SUCCESS;
00069 }
00070 
00071 
00072 NTSTATUS DEFAULTAPI
00073 MsfsQueryInformation(PDEVICE_OBJECT DeviceObject,
00074                      PIRP Irp)
00075 {
00076     PIO_STACK_LOCATION IoStack;
00077     FILE_INFORMATION_CLASS FileInformationClass;
00078     PFILE_OBJECT FileObject;
00079     PMSFS_FCB Fcb;
00080     PMSFS_CCB Ccb;
00081     PVOID SystemBuffer;
00082     ULONG BufferLength;
00083     NTSTATUS Status;
00084 
00085     DPRINT("MsfsQueryInformation(DeviceObject %p Irp %p)\n",
00086            DeviceObject, Irp);
00087 
00088     IoStack = IoGetCurrentIrpStackLocation (Irp);
00089     FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
00090     FileObject = IoStack->FileObject;
00091     Fcb = (PMSFS_FCB)FileObject->FsContext;
00092     Ccb = (PMSFS_CCB)FileObject->FsContext2;
00093 
00094     DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
00095 
00096     /* querying information is not permitted on client side */
00097     if (Fcb->ServerCcb != Ccb)
00098     {
00099         Status = STATUS_ACCESS_DENIED;
00100 
00101         Irp->IoStatus.Status = Status;
00102         Irp->IoStatus.Information = 0;
00103 
00104         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00105 
00106         return Status;
00107     }
00108 
00109     SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
00110     BufferLength = IoStack->Parameters.QueryFile.Length;
00111 
00112     switch (FileInformationClass)
00113     {
00114     case FileMailslotQueryInformation:
00115         Status = MsfsQueryMailslotInformation(Fcb,
00116                                               SystemBuffer,
00117                                               &BufferLength);
00118         break;
00119 
00120     default:
00121         Status = STATUS_NOT_IMPLEMENTED;
00122     }
00123 
00124     Irp->IoStatus.Status = Status;
00125     if (NT_SUCCESS(Status))
00126         Irp->IoStatus.Information =
00127              IoStack->Parameters.QueryFile.Length - BufferLength;
00128     else
00129         Irp->IoStatus.Information = 0;
00130     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00131 
00132     return Status;
00133 }
00134 
00135 
00136 NTSTATUS DEFAULTAPI
00137 MsfsSetInformation(PDEVICE_OBJECT DeviceObject,
00138                    PIRP Irp)
00139 {
00140     PIO_STACK_LOCATION IoStack;
00141     FILE_INFORMATION_CLASS FileInformationClass;
00142     PFILE_OBJECT FileObject;
00143     PMSFS_FCB Fcb;
00144     PMSFS_CCB Ccb;
00145     PVOID SystemBuffer;
00146     ULONG BufferLength;
00147     NTSTATUS Status;
00148 
00149     DPRINT("MsfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
00150 
00151     IoStack = IoGetCurrentIrpStackLocation (Irp);
00152     FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
00153     FileObject = IoStack->FileObject;
00154     Fcb = (PMSFS_FCB)FileObject->FsContext;
00155     Ccb = (PMSFS_CCB)FileObject->FsContext2;
00156 
00157     DPRINT("Mailslot name: %wZ\n", &Fcb->Name);
00158 
00159     /* setting information is not permitted on client side */
00160     if (Fcb->ServerCcb != Ccb)
00161     {
00162         Status = STATUS_ACCESS_DENIED;
00163 
00164         Irp->IoStatus.Status = Status;
00165         Irp->IoStatus.Information = 0;
00166 
00167         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00168 
00169         return Status;
00170     }
00171 
00172     SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
00173     BufferLength = IoStack->Parameters.QueryFile.Length;
00174 
00175     DPRINT("FileInformationClass %d\n", FileInformationClass);
00176     DPRINT("SystemBuffer %p\n", SystemBuffer);
00177 
00178     switch (FileInformationClass)
00179     {
00180     case FileMailslotSetInformation:
00181         Status = MsfsSetMailslotInformation(Fcb,
00182                                             SystemBuffer,
00183                                             &BufferLength);
00184         break;
00185 
00186      default:
00187         Status = STATUS_NOT_IMPLEMENTED;
00188     }
00189 
00190     Irp->IoStatus.Status = Status;
00191     Irp->IoStatus.Information = 0;
00192     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00193 
00194     return Status;
00195 }
00196 
00197 /* EOF */

Generated on Fri May 25 2012 04:25:49 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.