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/fs/np/finfo.c
00005 * PURPOSE:    Named pipe filesystem
00006 * PROGRAMMER: Eric Kohl
00007 */
00008 
00009 /* INCLUDES ******************************************************************/
00010 
00011 #include "npfs.h"
00012 
00013 #define NDEBUG
00014 #include <debug.h>
00015 
00016 /* FUNCTIONS *****************************************************************/
00017 
00018 static
00019 NTSTATUS
00020 NpfsSetPipeInformation(PDEVICE_OBJECT DeviceObject,
00021                        PNPFS_CCB Ccb,
00022                        PFILE_PIPE_INFORMATION Info,
00023                        PULONG BufferLength)
00024 {
00025     PNPFS_FCB Fcb;
00026     PFILE_PIPE_INFORMATION Request;
00027     DPRINT("NpfsSetPipeInformation()\n");
00028 
00029     if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
00030     {
00031         /* Buffer too small */
00032         return STATUS_INFO_LENGTH_MISMATCH;
00033     }
00034 
00035 
00036     /* Get the Pipe and data */
00037     Fcb = Ccb->Fcb;
00038     Request = (PFILE_PIPE_INFORMATION)Info;
00039 
00040     if ((Fcb->PipeType == FILE_PIPE_BYTE_STREAM_TYPE) && (Request->ReadMode == FILE_PIPE_MESSAGE_MODE))
00041     {
00042         DPRINT("Cannot change readmode to message type on a byte type pipe!\n");
00043         return STATUS_ACCESS_DENIED;
00044     }
00045 
00046     /* Set Pipe Data */
00047     if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END)
00048     {
00049         Fcb->ClientReadMode = Request->ReadMode;
00050     }
00051     else 
00052     {
00053         Fcb->ServerReadMode = Request->ReadMode;
00054     }
00055 
00056     Fcb->CompletionMode =  Request->CompletionMode;
00057 
00058     /* Return Success */
00059     return STATUS_SUCCESS;
00060 }
00061 
00062 static
00063 NTSTATUS
00064 NpfsSetPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
00065                              PNPFS_CCB Ccb,
00066                              PFILE_PIPE_INFORMATION Info,
00067                              PULONG BufferLength)
00068 {
00069     PNPFS_FCB Fcb;
00070     PFILE_PIPE_REMOTE_INFORMATION Request;
00071     DPRINT("NpfsSetPipeRemoteInformation()\n");
00072 
00073     if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
00074     {
00075         /* Buffer too small */
00076         return STATUS_INFO_LENGTH_MISMATCH;
00077     }
00078 
00079     /* Get the Pipe and data */
00080     Fcb = Ccb->Fcb;
00081     Request = (PFILE_PIPE_REMOTE_INFORMATION)Info;
00082 
00083     /* Set the Settings */
00084     Fcb->TimeOut = Request->CollectDataTime;
00085     Fcb->InboundQuota = Request->MaximumCollectionCount;
00086 
00087     /* Return Success */
00088     return STATUS_SUCCESS;
00089 }
00090 
00091 static
00092 NTSTATUS
00093 NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
00094                          PNPFS_CCB Ccb,
00095                          PFILE_PIPE_INFORMATION Info,
00096                          PULONG BufferLength)
00097 {
00098     PNPFS_FCB Fcb;
00099     ULONG ConnectionSideReadMode;
00100     DPRINT("NpfsQueryPipeInformation()\n");
00101 
00102     if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
00103     {
00104         /* Buffer too small */
00105         *BufferLength = sizeof(FILE_PIPE_INFORMATION);
00106         return STATUS_BUFFER_OVERFLOW;
00107     }
00108 
00109     /* Get the Pipe */
00110     Fcb = Ccb->Fcb;
00111 
00112     /* Clear Info */
00113     RtlZeroMemory(Info, sizeof(FILE_PIPE_INFORMATION));
00114 
00115     if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END) ConnectionSideReadMode=Ccb->Fcb->ClientReadMode;
00116     else ConnectionSideReadMode = Ccb->Fcb->ServerReadMode;
00117 
00118     /* Return Info */
00119     Info->CompletionMode = Fcb->CompletionMode;
00120     Info->ReadMode = ConnectionSideReadMode;
00121 
00122     /* Return success */
00123     *BufferLength = sizeof(FILE_PIPE_INFORMATION);
00124     return STATUS_SUCCESS;
00125 }
00126 
00127 static
00128 NTSTATUS
00129 NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
00130                                PNPFS_CCB Ccb,
00131                                PFILE_PIPE_REMOTE_INFORMATION Info,
00132                                PULONG BufferLength)
00133 {
00134     PNPFS_FCB Fcb;
00135     DPRINT("NpfsQueryPipeRemoteInformation()\n");
00136 
00137     if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
00138     {
00139         /* Buffer too small */
00140         *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
00141         return STATUS_BUFFER_OVERFLOW;
00142     }
00143 
00144     /* Get the Pipe */
00145     Fcb = Ccb->Fcb;
00146 
00147     /* Clear Info */
00148     RtlZeroMemory(Info, sizeof(FILE_PIPE_REMOTE_INFORMATION));
00149 
00150     /* Return Info */
00151     Info->MaximumCollectionCount = Fcb->InboundQuota;
00152     Info->CollectDataTime = Fcb->TimeOut;
00153 
00154     /* Return success */
00155     *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
00156     return STATUS_SUCCESS;
00157 }
00158 
00159 
00160 static NTSTATUS
00161 NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
00162                               PNPFS_CCB Ccb,
00163                               PFILE_PIPE_LOCAL_INFORMATION Info,
00164                               PULONG BufferLength)
00165 {
00166     PNPFS_FCB Fcb;
00167 
00168     DPRINT("NpfsQueryLocalPipeInformation()\n");
00169 
00170     if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
00171     {
00172         /* Buffer too small */
00173         *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
00174         return STATUS_BUFFER_OVERFLOW;
00175     }
00176 
00177     /* Get the Pipe */
00178     Fcb = Ccb->Fcb;
00179 
00180     /* Clear Info */
00181     RtlZeroMemory(Info,
00182         sizeof(FILE_PIPE_LOCAL_INFORMATION));
00183 
00184     /* Return Info */
00185     Info->NamedPipeType = Fcb->PipeType;
00186     Info->NamedPipeConfiguration = Fcb->PipeConfiguration;
00187     Info->MaximumInstances = Fcb->MaximumInstances;
00188     Info->CurrentInstances = Fcb->CurrentInstances;
00189     Info->InboundQuota = Fcb->InboundQuota;
00190     Info->OutboundQuota = Fcb->OutboundQuota;
00191     Info->NamedPipeState = Ccb->PipeState;
00192     Info->NamedPipeEnd = Ccb->PipeEnd;
00193 
00194     if (Ccb->PipeEnd == FILE_PIPE_SERVER_END)
00195     {
00196         Info->ReadDataAvailable = Ccb->ReadDataAvailable;
00197         Info->WriteQuotaAvailable = Ccb->WriteQuotaAvailable;
00198     }
00199     else if (Ccb->OtherSide != NULL)
00200     {
00201         Info->ReadDataAvailable = Ccb->OtherSide->ReadDataAvailable;
00202         Info->WriteQuotaAvailable = Ccb->OtherSide->WriteQuotaAvailable;
00203     }
00204 
00205     *BufferLength = sizeof(FILE_PIPE_LOCAL_INFORMATION);
00206     return STATUS_SUCCESS;
00207 }
00208 
00209 
00210 NTSTATUS NTAPI
00211 NpfsQueryInformation(PDEVICE_OBJECT DeviceObject,
00212                      PIRP Irp)
00213 {
00214     PIO_STACK_LOCATION IoStack;
00215     FILE_INFORMATION_CLASS FileInformationClass;
00216     PFILE_OBJECT FileObject;
00217     //PNPFS_VCB Vcb;
00218     PNPFS_FCB Fcb;
00219     PNPFS_CCB Ccb;
00220     PVOID SystemBuffer;
00221     ULONG BufferLength;
00222     NTSTATUS Status;
00223 
00224     DPRINT("NpfsQueryInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
00225 
00226     IoStack = IoGetCurrentIrpStackLocation (Irp);
00227     FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
00228     //Vcb = (PNPFS_VCB)DeviceObject->DeviceExtension;
00229     FileObject = IoStack->FileObject;
00230     Ccb = (PNPFS_CCB)FileObject->FsContext2;
00231     Fcb = Ccb->Fcb;
00232 
00233     SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
00234     BufferLength = IoStack->Parameters.QueryFile.Length;
00235 
00236     DPRINT("Pipe name: %wZ\n", &Fcb->PipeName);
00237     DPRINT("FileInformationClass %d\n", FileInformationClass);
00238     DPRINT("SystemBuffer %p\n", SystemBuffer);
00239     DPRINT("BufferLength %lu\n", BufferLength);
00240 
00241     switch (FileInformationClass)
00242     {
00243     case FilePipeInformation:
00244         Status = NpfsQueryPipeInformation(DeviceObject,
00245             Ccb,
00246             SystemBuffer,
00247             &BufferLength);
00248         break;
00249 
00250     case FilePipeLocalInformation:
00251         Status = NpfsQueryLocalPipeInformation(DeviceObject,
00252             Ccb,
00253             SystemBuffer,
00254             &BufferLength);
00255         break;
00256 
00257     case FilePipeRemoteInformation:
00258         Status = NpfsQueryPipeRemoteInformation(DeviceObject,
00259             Ccb,
00260             SystemBuffer,
00261             &BufferLength);
00262         break;
00263 
00264     default:
00265         Status = STATUS_NOT_SUPPORTED;
00266         BufferLength = 0;
00267     }
00268 
00269     Irp->IoStatus.Status = Status;
00270     Irp->IoStatus.Information = BufferLength;
00271 
00272     IoCompleteRequest (Irp, IO_NO_INCREMENT);
00273 
00274     return Status;
00275 }
00276 
00277 
00278 NTSTATUS NTAPI
00279 NpfsSetInformation(PDEVICE_OBJECT DeviceObject,
00280                    PIRP Irp)
00281 {
00282     PIO_STACK_LOCATION IoStack;
00283     FILE_INFORMATION_CLASS FileInformationClass;
00284     PFILE_OBJECT FileObject;
00285     PNPFS_FCB Fcb;
00286     PNPFS_CCB Ccb;
00287     PVOID SystemBuffer;
00288     ULONG BufferLength;
00289     NTSTATUS Status;
00290 
00291     DPRINT("NpfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
00292 
00293     IoStack = IoGetCurrentIrpStackLocation (Irp);
00294     FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
00295     FileObject = IoStack->FileObject;
00296     Ccb = (PNPFS_CCB)FileObject->FsContext2;
00297     Fcb = Ccb->Fcb;
00298 
00299     SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
00300     BufferLength = IoStack->Parameters.QueryFile.Length;
00301 
00302     DPRINT("Pipe name: %wZ\n", &Fcb->PipeName);
00303     DPRINT("FileInformationClass %d\n", FileInformationClass);
00304     DPRINT("SystemBuffer %p\n", SystemBuffer);
00305     DPRINT("BufferLength %lu\n", BufferLength);
00306 
00307     switch (FileInformationClass)
00308     {
00309     case FilePipeInformation:
00310         /* Call the handler */
00311         Status = NpfsSetPipeInformation(DeviceObject,
00312             Ccb,
00313             SystemBuffer,
00314             &BufferLength);
00315         break;
00316 
00317     case FilePipeLocalInformation:
00318         Status = STATUS_NOT_IMPLEMENTED;
00319         break;
00320 
00321     case FilePipeRemoteInformation:
00322         /* Call the handler */
00323         Status = NpfsSetPipeRemoteInformation(DeviceObject,
00324             Ccb,
00325             SystemBuffer,
00326             &BufferLength);
00327         break;
00328     default:
00329         Status = STATUS_NOT_SUPPORTED;
00330     }
00331 
00332     Irp->IoStatus.Status = Status;
00333     Irp->IoStatus.Information = 0;
00334     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00335     return Status;
00336 }
00337 
00338 /* 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.