[NPFS]
[reactos.git] / reactos / drivers / filesystems / npfs / finfo.c
index 18c5341..03c9a60 100644 (file)
@@ -1,7 +1,7 @@
 /*
 * COPYRIGHT:  See COPYING in the top level directory
 * PROJECT:    ReactOS kernel
-* FILE:       drivers/fs/np/finfo.c
+* FILE:       drivers/filesystems/npfs/finfo.c
 * PURPOSE:    Named pipe filesystem
 * PROGRAMMER: Eric Kohl
 */
@@ -24,8 +24,18 @@ NpfsSetPipeInformation(PDEVICE_OBJECT DeviceObject,
 {
     PNPFS_FCB Fcb;
     PFILE_PIPE_INFORMATION Request;
+
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     DPRINT("NpfsSetPipeInformation()\n");
 
+    if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
+    {
+        /* Buffer too small */
+        return STATUS_INFO_LENGTH_MISMATCH;
+    }
+
+
     /* Get the Pipe and data */
     Fcb = Ccb->Fcb;
     Request = (PFILE_PIPE_INFORMATION)Info;
@@ -41,7 +51,7 @@ NpfsSetPipeInformation(PDEVICE_OBJECT DeviceObject,
     {
         Fcb->ClientReadMode = Request->ReadMode;
     }
-    else 
+    else
     {
         Fcb->ServerReadMode = Request->ReadMode;
     }
@@ -61,8 +71,17 @@ NpfsSetPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
 {
     PNPFS_FCB Fcb;
     PFILE_PIPE_REMOTE_INFORMATION Request;
+
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     DPRINT("NpfsSetPipeRemoteInformation()\n");
 
+    if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+    {
+        /* Buffer too small */
+        return STATUS_INFO_LENGTH_MISMATCH;
+    }
+
     /* Get the Pipe and data */
     Fcb = Ccb->Fcb;
     Request = (PFILE_PIPE_REMOTE_INFORMATION)Info;
@@ -84,8 +103,18 @@ NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
 {
     PNPFS_FCB Fcb;
     ULONG ConnectionSideReadMode;
+
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     DPRINT("NpfsQueryPipeInformation()\n");
 
+    if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
+    {
+        /* Buffer too small */
+        *BufferLength = sizeof(FILE_PIPE_INFORMATION);
+        return STATUS_BUFFER_OVERFLOW;
+    }
+
     /* Get the Pipe */
     Fcb = Ccb->Fcb;
 
@@ -100,7 +129,7 @@ NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
     Info->ReadMode = ConnectionSideReadMode;
 
     /* Return success */
-    *BufferLength -= sizeof(FILE_PIPE_INFORMATION);
+    *BufferLength = sizeof(FILE_PIPE_INFORMATION);
     return STATUS_SUCCESS;
 }
 
@@ -112,8 +141,18 @@ NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
                                PULONG BufferLength)
 {
     PNPFS_FCB Fcb;
+
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     DPRINT("NpfsQueryPipeRemoteInformation()\n");
 
+    if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+    {
+        /* Buffer too small */
+        *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
+        return STATUS_BUFFER_OVERFLOW;
+    }
+
     /* Get the Pipe */
     Fcb = Ccb->Fcb;
 
@@ -125,7 +164,7 @@ NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
     Info->CollectDataTime = Fcb->TimeOut;
 
     /* Return success */
-    *BufferLength -= sizeof(FILE_PIPE_REMOTE_INFORMATION);
+    *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
     return STATUS_SUCCESS;
 }
 
@@ -138,13 +177,25 @@ NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
 {
     PNPFS_FCB Fcb;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     DPRINT("NpfsQueryLocalPipeInformation()\n");
 
+    if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+    {
+        /* Buffer too small */
+        *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
+        return STATUS_BUFFER_OVERFLOW;
+    }
+
+    /* Get the Pipe */
     Fcb = Ccb->Fcb;
 
+    /* Clear Info */
     RtlZeroMemory(Info,
         sizeof(FILE_PIPE_LOCAL_INFORMATION));
 
+    /* Return Info */
     Info->NamedPipeType = Fcb->PipeType;
     Info->NamedPipeConfiguration = Fcb->PipeConfiguration;
     Info->MaximumInstances = Fcb->MaximumInstances;
@@ -165,7 +216,7 @@ NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
         Info->WriteQuotaAvailable = Ccb->OtherSide->WriteQuotaAvailable;
     }
 
-    *BufferLength -= sizeof(FILE_PIPE_LOCAL_INFORMATION);
+    *BufferLength = sizeof(FILE_PIPE_LOCAL_INFORMATION);
     return STATUS_SUCCESS;
 }
 
@@ -177,7 +228,7 @@ NpfsQueryInformation(PDEVICE_OBJECT DeviceObject,
     PIO_STACK_LOCATION IoStack;
     FILE_INFORMATION_CLASS FileInformationClass;
     PFILE_OBJECT FileObject;
-    PNPFS_DEVICE_EXTENSION DeviceExtension;
+    //PNPFS_VCB Vcb;
     PNPFS_FCB Fcb;
     PNPFS_CCB Ccb;
     PVOID SystemBuffer;
@@ -188,7 +239,7 @@ NpfsQueryInformation(PDEVICE_OBJECT DeviceObject,
 
     IoStack = IoGetCurrentIrpStackLocation (Irp);
     FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass;
-    DeviceExtension = DeviceObject->DeviceExtension;
+    //Vcb = (PNPFS_VCB)DeviceObject->DeviceExtension;
     FileObject = IoStack->FileObject;
     Ccb = (PNPFS_CCB)FileObject->FsContext2;
     Fcb = Ccb->Fcb;
@@ -226,14 +277,12 @@ NpfsQueryInformation(PDEVICE_OBJECT DeviceObject,
 
     default:
         Status = STATUS_NOT_SUPPORTED;
+        BufferLength = 0;
     }
 
     Irp->IoStatus.Status = Status;
-    if (NT_SUCCESS(Status))
-        Irp->IoStatus.Information =
-        IoStack->Parameters.QueryFile.Length - BufferLength;
-    else
-        Irp->IoStatus.Information = 0;
+    Irp->IoStatus.Information = BufferLength;
+
     IoCompleteRequest (Irp, IO_NO_INCREMENT);
 
     return Status;