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 *  ReactOS kernel
00003 *  Copyright (C) 2002, 2003 ReactOS Team
00004 *
00005 *  This program is free software; you can redistribute it and/or modify
00006 *  it under the terms of the GNU General Public License as published by
00007 *  the Free Software Foundation; either version 2 of the License, or
00008 *  (at your option) any later version.
00009 *
00010 *  This program is distributed in the hope that it will be useful,
00011 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 *  GNU General Public License for more details.
00014 *
00015 *  You should have received a copy of the GNU General Public License along
00016 *  with this program; if not, write to the Free Software Foundation, Inc.,
00017 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
00018 */
00019 /* $Id: rw.c 54273 2011-10-30 00:58:21Z jgardou $
00020 *
00021 * COPYRIGHT:        See COPYING in the top level directory
00022 * PROJECT:          ReactOS kernel
00023 * FILE:             drivers/fs/cdfs/rw.c
00024 * PURPOSE:          CDROM (ISO 9660) filesystem driver
00025 * PROGRAMMER:       Art Yerkes
00026 *                   Eric Kohl
00027 */
00028 
00029 /* INCLUDES *****************************************************************/
00030 
00031 #include "cdfs.h"
00032 
00033 #define NDEBUG
00034 #include <debug.h>
00035 
00036 /* FUNCTIONS ****************************************************************/
00037 
00038 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
00039 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
00040 
00041 
00042 /* FUNCTIONS ****************************************************************/
00043 
00044 static NTSTATUS
00045 CdfsReadFile(PDEVICE_EXTENSION DeviceExt,
00046              PFILE_OBJECT FileObject,
00047              PUCHAR Buffer,
00048              ULONG Length,
00049              ULONG ReadOffset,
00050              ULONG IrpFlags,
00051              PULONG LengthRead)
00052              /*
00053              * FUNCTION: Reads data from a file
00054              */
00055 {
00056     NTSTATUS Status = STATUS_SUCCESS;
00057     PFCB Fcb;
00058     ULONG ToRead = Length;
00059 
00060     DPRINT("CdfsReadFile(ReadOffset %lu  Length %lu)\n", ReadOffset, Length);
00061 
00062     *LengthRead = 0;
00063 
00064     if (Length == 0)
00065         return(STATUS_SUCCESS);
00066 
00067     Fcb = (PFCB)FileObject->FsContext;
00068 
00069     if (ReadOffset >= Fcb->Entry.DataLengthL)
00070         return(STATUS_END_OF_FILE);
00071         
00072     if (ReadOffset + Length > Fcb->Entry.DataLengthL)
00073         ToRead = Fcb->Entry.DataLengthL - ReadOffset;
00074 
00075     DPRINT("Reading %d bytes at %d\n", Length, ReadOffset);
00076 
00077     if (!(IrpFlags & (IRP_NOCACHE|IRP_PAGING_IO)))
00078     {
00079         LARGE_INTEGER FileOffset;
00080         IO_STATUS_BLOCK IoStatus;
00081         CC_FILE_SIZES FileSizes;
00082         
00083         DPRINT("Using cache\n");
00084 
00085         if (FileObject->PrivateCacheMap == NULL)
00086         {
00087             FileSizes.AllocationSize = Fcb->RFCB.AllocationSize;
00088             FileSizes.FileSize = Fcb->RFCB.FileSize;
00089             FileSizes.ValidDataLength = Fcb->RFCB.ValidDataLength;
00090 
00091             DPRINT("Attach FCB to File: Size %08x%08x\n", 
00092                 Fcb->RFCB.ValidDataLength.HighPart,
00093                 Fcb->RFCB.ValidDataLength.LowPart);
00094 
00095             CcInitializeCacheMap(FileObject,
00096                 &FileSizes,
00097                 FALSE,
00098                 &(CdfsGlobalData->CacheMgrCallbacks),
00099                 Fcb);
00100         }
00101 
00102         FileOffset.QuadPart = (LONGLONG)ReadOffset;
00103         CcCopyRead(FileObject,
00104             &FileOffset,
00105             ToRead,
00106             TRUE,
00107             Buffer,
00108             &IoStatus);
00109         *LengthRead = IoStatus.Information;
00110 
00111         Status = IoStatus.Status;
00112     }
00113     else
00114     {
00115         ULONG ActualReadOffset = ROUND_DOWN(ReadOffset, BLOCKSIZE);
00116         ULONG nBlocks = (ROUND_UP(ReadOffset + ToRead, BLOCKSIZE) - ActualReadOffset) / BLOCKSIZE;
00117         PUCHAR PageBuf;
00118         BOOLEAN bFreeBuffer = FALSE;
00119         if ((ReadOffset % BLOCKSIZE) != 0 || (ToRead % BLOCKSIZE) != 0)
00120         {
00121             PageBuf = ExAllocatePool(NonPagedPool, nBlocks * BLOCKSIZE);
00122             if (!PageBuf)
00123             {
00124                 return STATUS_NO_MEMORY;
00125             }
00126             bFreeBuffer = TRUE;
00127         }
00128         else
00129         {
00130             PageBuf = Buffer;
00131         }
00132         Status = CdfsReadSectors(DeviceExt->StorageDevice,
00133             Fcb->Entry.ExtentLocationL + (ActualReadOffset / BLOCKSIZE),
00134             nBlocks,
00135             (PVOID)PageBuf,
00136             FALSE);
00137         
00138         if(NT_SUCCESS(Status))
00139         {
00140             *LengthRead = ToRead;
00141             if(bFreeBuffer)
00142             {
00143                 /* Copy what we've got */
00144                 RtlCopyMemory(Buffer, PageBuf + (ReadOffset - ActualReadOffset), ToRead);
00145             }
00146             /* Zero out the rest */
00147             if(ToRead != Length)
00148                 RtlZeroMemory(Buffer + ToRead, Length - ToRead);
00149         }
00150         
00151         if(bFreeBuffer)
00152             ExFreePool(PageBuf);
00153     }
00154     
00155     return Status;
00156 }
00157 
00158 
00159 NTSTATUS NTAPI
00160 CdfsRead(PDEVICE_OBJECT DeviceObject,
00161          PIRP Irp)
00162 {
00163     PDEVICE_EXTENSION DeviceExt;
00164     PIO_STACK_LOCATION Stack;
00165     PFILE_OBJECT FileObject;
00166     PVOID Buffer = NULL;
00167     ULONG ReadLength;
00168     LARGE_INTEGER ReadOffset;
00169     ULONG ReturnedReadLength = 0;
00170     NTSTATUS Status = STATUS_SUCCESS;
00171 
00172     DPRINT("CdfsRead(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
00173 
00174     DeviceExt = DeviceObject->DeviceExtension;
00175     Stack = IoGetCurrentIrpStackLocation(Irp);
00176     FileObject = Stack->FileObject;
00177 
00178     ReadLength = Stack->Parameters.Read.Length;
00179     ReadOffset = Stack->Parameters.Read.ByteOffset;
00180     if (ReadLength) Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
00181 
00182     Status = CdfsReadFile(DeviceExt,
00183         FileObject,
00184         Buffer,
00185         ReadLength,
00186         ReadOffset.u.LowPart,
00187         Irp->Flags,
00188         &ReturnedReadLength);
00189     if (NT_SUCCESS(Status))
00190     {
00191         if (FileObject->Flags & FO_SYNCHRONOUS_IO)
00192         {
00193             FileObject->CurrentByteOffset.QuadPart =
00194                 ReadOffset.QuadPart + ReturnedReadLength;
00195         }
00196         Irp->IoStatus.Information = ReturnedReadLength;
00197     }
00198     else
00199     {
00200         Irp->IoStatus.Information = 0;
00201     }
00202 
00203     Irp->IoStatus.Status = Status;
00204     IoCompleteRequest(Irp,IO_NO_INCREMENT);
00205 
00206     return(Status);
00207 }
00208 
00209 
00210 NTSTATUS NTAPI
00211 CdfsWrite(PDEVICE_OBJECT DeviceObject,
00212           PIRP Irp)
00213 {
00214     DPRINT("CdfsWrite(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
00215 
00216     Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
00217     Irp->IoStatus.Information = 0;
00218     return(STATUS_NOT_SUPPORTED);
00219 }
00220 
00221 /* EOF */

Generated on Sun May 27 2012 04:24:27 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.