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

pin.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/cc/pin.c
00005  * PURPOSE:         Implements cache managers pinning interface
00006  *
00007  * PROGRAMMERS:
00008  */
00009 
00010 /* INCLUDES ******************************************************************/
00011 
00012 #include <ntoskrnl.h>
00013 #define NDEBUG
00014 #include <debug.h>
00015 
00016 /* GLOBALS *******************************************************************/
00017 
00018 extern NPAGED_LOOKASIDE_LIST iBcbLookasideList;
00019 
00020 /* FUNCTIONS *****************************************************************/
00021 
00022 /*
00023  * @implemented
00024  */
00025 BOOLEAN
00026 NTAPI
00027 CcMapData(
00028     IN PFILE_OBJECT FileObject,
00029     IN PLARGE_INTEGER FileOffset,
00030     IN ULONG Length,
00031     IN ULONG Flags,
00032     OUT PVOID *pBcb,
00033     OUT PVOID *pBuffer)
00034 {
00035     ULONG ReadOffset;
00036     BOOLEAN Valid;
00037     PBCB Bcb;
00038     PCACHE_SEGMENT CacheSeg;
00039     NTSTATUS Status;
00040     PINTERNAL_BCB iBcb;
00041     ULONG ROffset;
00042 
00043     DPRINT("CcMapData(FileObject 0x%p, FileOffset %I64x, Length %d, Flags %d,"
00044            " pBcb 0x%p, pBuffer 0x%p)\n", FileObject, FileOffset->QuadPart,
00045            Length, Flags, pBcb, pBuffer);
00046 
00047     ReadOffset = (ULONG)FileOffset->QuadPart;
00048 
00049     ASSERT(FileObject);
00050     ASSERT(FileObject->SectionObjectPointer);
00051     ASSERT(FileObject->SectionObjectPointer->SharedCacheMap);
00052 
00053     Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
00054     ASSERT(Bcb);
00055 
00056     DPRINT("AllocationSize %I64x, FileSize %I64x\n",
00057            Bcb->AllocationSize.QuadPart,
00058            Bcb->FileSize.QuadPart);
00059 
00060     if (ReadOffset % Bcb->CacheSegmentSize + Length > Bcb->CacheSegmentSize)
00061     {
00062         return FALSE;
00063     }
00064     ROffset = ROUND_DOWN (ReadOffset, Bcb->CacheSegmentSize);
00065     Status = CcRosRequestCacheSegment(Bcb, ROffset,
00066                                       pBuffer, &Valid,
00067                                       &CacheSeg);
00068     if (!NT_SUCCESS(Status))
00069     {
00070         return FALSE;
00071     }
00072     if (!Valid)
00073     {
00074         if (!(Flags & MAP_WAIT))
00075         {
00076             CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
00077             return FALSE;
00078         }
00079         if (!NT_SUCCESS(ReadCacheSegment(CacheSeg)))
00080         {
00081             CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
00082             return FALSE;
00083         }
00084     }
00085 
00086     *pBuffer = (PVOID)((ULONG_PTR)(*pBuffer) + (ReadOffset % Bcb->CacheSegmentSize));
00087     iBcb = ExAllocateFromNPagedLookasideList(&iBcbLookasideList);
00088     if (iBcb == NULL)
00089     {
00090         CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
00091         return FALSE;
00092     }
00093     memset(iBcb, 0, sizeof(INTERNAL_BCB));
00094     iBcb->PFCB.NodeTypeCode = 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
00095     iBcb->PFCB.NodeByteSize = sizeof(PUBLIC_BCB);
00096     iBcb->PFCB.MappedLength = Length;
00097     iBcb->PFCB.MappedFileOffset = *FileOffset;
00098     iBcb->CacheSegment = CacheSeg;
00099     iBcb->Dirty = FALSE;
00100     iBcb->RefCount = 1;
00101     *pBcb = (PVOID)iBcb;
00102     return TRUE;
00103 }
00104 
00105 /*
00106  * @unimplemented
00107  */
00108 BOOLEAN
00109 NTAPI
00110 CcPinMappedData (
00111     IN  PFILE_OBJECT        FileObject,
00112     IN  PLARGE_INTEGER      FileOffset,
00113     IN  ULONG           Length,
00114     IN  ULONG           Flags,
00115     OUT PVOID           * Bcb
00116     )
00117 {
00118   /* no-op for current implementation. */
00119   return TRUE;
00120 }
00121 
00122 /*
00123  * @unimplemented
00124  */
00125 BOOLEAN
00126 NTAPI
00127 CcPinRead (
00128     IN  PFILE_OBJECT        FileObject,
00129     IN  PLARGE_INTEGER      FileOffset,
00130     IN  ULONG           Length,
00131     IN  ULONG           Flags,
00132     OUT PVOID           * Bcb,
00133     OUT PVOID           * Buffer
00134     )
00135 {
00136   if (CcMapData(FileObject, FileOffset, Length, Flags, Bcb, Buffer))
00137   {
00138     if (CcPinMappedData(FileObject, FileOffset, Length, Flags, Bcb))
00139       return TRUE;
00140     else
00141       CcUnpinData(Bcb);
00142   }
00143   return FALSE;
00144 }
00145 
00146 /*
00147  * @unimplemented
00148  */
00149 BOOLEAN
00150 NTAPI
00151 CcPreparePinWrite (
00152     IN  PFILE_OBJECT        FileObject,
00153     IN  PLARGE_INTEGER      FileOffset,
00154     IN  ULONG           Length,
00155     IN  BOOLEAN         Zero,
00156     IN  ULONG           Flags,
00157     OUT PVOID           * Bcb,
00158     OUT PVOID           * Buffer
00159     )
00160 {
00161         /*
00162          * FIXME: This is function is similar to CcPinRead, but doesn't
00163          * read the data if they're not present. Instead it should just
00164          * prepare the cache segments and zero them out if Zero == TRUE.
00165          *
00166          * For now calling CcPinRead is better than returning error or
00167          * just having UNIMPLEMENTED here.
00168          */
00169         return CcPinRead(FileObject, FileOffset, Length, Flags, Bcb, Buffer);
00170 }
00171 
00172 /*
00173  * @implemented
00174  */
00175 VOID NTAPI
00176 CcSetDirtyPinnedData (IN PVOID Bcb,
00177               IN PLARGE_INTEGER Lsn)
00178 {
00179    PINTERNAL_BCB iBcb = Bcb;
00180    iBcb->Dirty = TRUE;
00181 }
00182 
00183 
00184 /*
00185  * @implemented
00186  */
00187 VOID NTAPI
00188 CcUnpinData (IN PVOID Bcb)
00189 {
00190   PINTERNAL_BCB iBcb = Bcb;
00191   CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
00192                            iBcb->Dirty, FALSE);
00193   if (--iBcb->RefCount == 0)
00194   {
00195     ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
00196   }
00197 }
00198 
00199 /*
00200  * @unimplemented
00201  */
00202 VOID
00203 NTAPI
00204 CcUnpinDataForThread (
00205     IN  PVOID           Bcb,
00206     IN  ERESOURCE_THREAD    ResourceThreadId
00207     )
00208 {
00209     UNIMPLEMENTED;
00210 }
00211 
00212 /*
00213  * @implemented
00214  */
00215 VOID
00216 NTAPI
00217 CcRepinBcb (
00218     IN  PVOID   Bcb
00219     )
00220 {
00221   PINTERNAL_BCB iBcb = Bcb;
00222   iBcb->RefCount++;
00223 }
00224 
00225 /*
00226  * @unimplemented
00227  */
00228 VOID
00229 NTAPI
00230 CcUnpinRepinnedBcb (
00231     IN  PVOID           Bcb,
00232     IN  BOOLEAN         WriteThrough,
00233     IN  PIO_STATUS_BLOCK    IoStatus
00234     )
00235 {
00236   PINTERNAL_BCB iBcb = Bcb;
00237 
00238   if (--iBcb->RefCount == 0)
00239     {
00240       IoStatus->Information = 0;
00241       if (WriteThrough)
00242         {
00243             KeWaitForSingleObject(&iBcb->CacheSegment->Mutex,
00244                                   Executive,
00245                                   KernelMode,
00246                                   FALSE,
00247                                   NULL);
00248           if (iBcb->CacheSegment->Dirty)
00249             {
00250               IoStatus->Status = CcRosFlushCacheSegment(iBcb->CacheSegment);
00251             }
00252           else
00253             {
00254               IoStatus->Status = STATUS_SUCCESS;
00255             }
00256           KeReleaseMutex(&iBcb->CacheSegment->Mutex, 0);
00257         }
00258       else
00259         {
00260           IoStatus->Status = STATUS_SUCCESS;
00261         }
00262 
00263       ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
00264     }
00265 }

Generated on Fri May 25 2012 04:19:51 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.