Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencopysup.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel 00004 * FILE: ntoskrnl/cache/copysup.c 00005 * PURPOSE: Logging and configuration routines 00006 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 00007 */ 00008 00009 /* INCLUDES *******************************************************************/ 00010 00011 #include <ntoskrnl.h> 00012 #include "newcc.h" 00013 #include "section/newmm.h" 00014 #define NDEBUG 00015 #include <debug.h> 00016 00017 /* GLOBALS ********************************************************************/ 00018 00019 ULONG CcFastMdlReadWait; 00020 ULONG CcFastMdlReadNotPossible; 00021 ULONG CcFastReadNotPossible; 00022 ULONG CcFastReadWait; 00023 ULONG CcFastReadNoWait; 00024 ULONG CcFastReadResourceMiss; 00025 00026 #define TAG_COPY_READ TAG('C', 'o', 'p', 'y') 00027 #define TAG_COPY_WRITE TAG('R', 'i', 't', 'e') 00028 00029 /* FUNCTIONS ******************************************************************/ 00030 00031 /* 00032 00033 CcCopyRead can be called for a region of any size and alignment, so we must 00034 crawl the cache space, focusing one cache stripe after another and using 00035 RtlCopyMemory to copy the input data into the cache. In constrained memory, 00036 pages faulted into new stripes are often taken from old stripes, causing the 00037 old stripes to be flushed right away. In the case of many short buffered in 00038 order writes, like the ones generated by stdio, this can be really efficient. 00039 00040 */ 00041 BOOLEAN 00042 NTAPI 00043 CcCopyRead(IN PFILE_OBJECT FileObject, 00044 IN PLARGE_INTEGER FileOffset, 00045 IN ULONG Length, 00046 IN BOOLEAN Wait, 00047 OUT PVOID Buffer, 00048 OUT PIO_STATUS_BLOCK IoStatus) 00049 { 00050 PCHAR ReadBuffer; 00051 ULONG ReadLen; 00052 PVOID Bcb; 00053 PCHAR BufferTarget = (PCHAR)Buffer; 00054 LARGE_INTEGER CacheOffset, EndOfExtent, NextOffset; 00055 00056 DPRINT("CcCopyRead(%x,%x,%d,%d,%x)\n", 00057 FileObject, 00058 FileOffset->LowPart, 00059 Length, 00060 Wait, 00061 Buffer); 00062 00063 CacheOffset.QuadPart = FileOffset->QuadPart; 00064 EndOfExtent.QuadPart = FileOffset->QuadPart + Length; 00065 00066 while (CacheOffset.QuadPart < EndOfExtent.QuadPart) 00067 { 00068 NextOffset.QuadPart = CacheOffset.QuadPart; 00069 NextOffset.LowPart = (NextOffset.LowPart + CACHE_STRIPE) & ~(CACHE_STRIPE-1); 00070 ReadLen = EndOfExtent.QuadPart - CacheOffset.QuadPart; 00071 if (CacheOffset.QuadPart + ReadLen > NextOffset.QuadPart) 00072 { 00073 ReadLen = NextOffset.QuadPart - CacheOffset.QuadPart; 00074 } 00075 00076 DPRINT("Reading %d bytes in this go (at %08x%08x)\n", 00077 ReadLen, 00078 CacheOffset.HighPart, 00079 CacheOffset.LowPart); 00080 00081 if (!CcPinRead(FileObject, 00082 &CacheOffset, 00083 ReadLen, 00084 Wait ? PIN_WAIT : PIN_IF_BCB, 00085 &Bcb, 00086 (PVOID*)&ReadBuffer)) 00087 { 00088 IoStatus->Status = STATUS_UNSUCCESSFUL; 00089 IoStatus->Information = 0; 00090 DPRINT("Failed CcCopyRead\n"); 00091 return FALSE; 00092 } 00093 00094 DPRINT("Copying %d bytes at %08x%08x\n", 00095 ReadLen, 00096 CacheOffset.HighPart, 00097 CacheOffset.LowPart); 00098 00099 RtlCopyMemory(BufferTarget, ReadBuffer, ReadLen); 00100 00101 BufferTarget += ReadLen; 00102 00103 CacheOffset = NextOffset; 00104 CcUnpinData(Bcb); 00105 } 00106 00107 IoStatus->Status = STATUS_SUCCESS; 00108 IoStatus->Information = Length; 00109 00110 DPRINT("Done with CcCopyRead\n"); 00111 00112 return TRUE; 00113 } 00114 00115 VOID 00116 NTAPI 00117 CcFastCopyRead(IN PFILE_OBJECT FileObject, 00118 IN ULONG FileOffset, 00119 IN ULONG Length, 00120 IN ULONG PageCount, 00121 OUT PVOID Buffer, 00122 OUT PIO_STATUS_BLOCK IoStatus) 00123 { 00124 UNIMPLEMENTED; 00125 while (TRUE); 00126 } 00127 00128 BOOLEAN 00129 NTAPI 00130 CcCopyWrite(IN PFILE_OBJECT FileObject, 00131 IN PLARGE_INTEGER FileOffset, 00132 IN ULONG Length, 00133 IN BOOLEAN Wait, 00134 IN PVOID Buffer) 00135 { 00136 INT Count = 0; 00137 BOOLEAN Result; 00138 PNOCC_BCB Bcb; 00139 PVOID WriteBuf; 00140 ULONG WriteLen; 00141 LARGE_INTEGER CurrentOffset = *FileOffset; 00142 LARGE_INTEGER EndOffset; 00143 LARGE_INTEGER NextOffset; 00144 00145 EndOffset.QuadPart = CurrentOffset.QuadPart + Length; 00146 00147 DPRINT("CcCopyWrite(%x,%x,%d,%d,%x)\n", 00148 FileObject, 00149 FileOffset->LowPart, 00150 Length, 00151 Wait, 00152 Buffer); 00153 00154 while (CurrentOffset.QuadPart < EndOffset.QuadPart) 00155 { 00156 NextOffset.HighPart = CurrentOffset.HighPart; 00157 NextOffset.LowPart = (CurrentOffset.LowPart + CACHE_STRIPE) & ~(CACHE_STRIPE - 1); 00158 DPRINT("NextOffset %08x%08x\n", NextOffset.u.HighPart, NextOffset.u.LowPart); 00159 WriteLen = MIN(NextOffset.QuadPart - CurrentOffset.QuadPart, Length); 00160 00161 DPRINT("Copying %x bytes from %08x%08x\n", 00162 WriteLen, 00163 CurrentOffset.u.HighPart, 00164 CurrentOffset.u.LowPart); 00165 00166 DPRINT("CcPreparePinWrite\n"); 00167 00168 Result = CcPreparePinWrite(FileObject, 00169 &CurrentOffset, 00170 WriteLen, 00171 FALSE, 00172 Wait ? PIN_WAIT : PIN_IF_BCB, 00173 (PVOID *)&Bcb, &WriteBuf); 00174 00175 DPRINT("Result %s %x %x\n", Result ? "TRUE" : "FALSE", Bcb, WriteBuf); 00176 if (!Result) 00177 { 00178 DPRINT1("CcPreparePinWrite Failed?\n"); 00179 if (Wait) 00180 RtlRaiseStatus(STATUS_NOT_MAPPED_DATA); 00181 else 00182 return FALSE; 00183 } 00184 00185 DPRINT("Copying actual memory to BCB#%x (@%x) (from buffer at %x)\n", 00186 Bcb - CcCacheSections, 00187 WriteBuf, 00188 Bcb->BaseAddress); 00189 00190 //MiZeroFillSection(WriteBuf, &CurrentOffset, WriteLen); 00191 RtlCopyMemory(WriteBuf, ((PCHAR)Buffer) + Count, WriteLen); 00192 Count += WriteLen; 00193 Length -= WriteLen; 00194 CurrentOffset = NextOffset; 00195 Bcb->Dirty = TRUE; 00196 CcUnpinData(Bcb); 00197 } 00198 00199 DPRINT("Done with CcCopyWrite\n"); 00200 00201 return TRUE; 00202 } 00203 00204 VOID 00205 NTAPI 00206 CcFastCopyWrite(IN PFILE_OBJECT FileObject, 00207 IN ULONG FileOffset, 00208 IN ULONG Length, 00209 IN PVOID Buffer) 00210 { 00211 UNIMPLEMENTED; 00212 while (TRUE); 00213 } 00214 00215 BOOLEAN 00216 NTAPI 00217 CcCanIWrite(IN PFILE_OBJECT FileObject, 00218 IN ULONG BytesToWrite, 00219 IN BOOLEAN Wait, 00220 IN UCHAR Retrying) 00221 { 00222 UNIMPLEMENTED; 00223 while (TRUE); 00224 return FALSE; 00225 } 00226 00227 VOID 00228 NTAPI 00229 CcDeferWrite(IN PFILE_OBJECT FileObject, 00230 IN PCC_POST_DEFERRED_WRITE PostRoutine, 00231 IN PVOID Context1, 00232 IN PVOID Context2, 00233 IN ULONG BytesToWrite, 00234 IN BOOLEAN Retrying) 00235 { 00236 UNIMPLEMENTED; 00237 while (TRUE); 00238 } 00239 00240 /* EOF */ Generated on Sun May 27 2012 04:37:04 for ReactOS by
1.7.6.1
|