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

copysup.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.