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