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