2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/cc/pin.c
5 * PURPOSE: Implements cache managers pinning interface
10 /* INCLUDES ******************************************************************/
16 /* GLOBALS *******************************************************************/
18 extern NPAGED_LOOKASIDE_LIST iBcbLookasideList
;
20 /* FUNCTIONS *****************************************************************/
28 IN PFILE_OBJECT FileObject
,
29 IN PLARGE_INTEGER FileOffset
,
37 PROS_SHARED_CACHE_MAP SharedCacheMap
;
43 DPRINT("CcMapData(FileObject 0x%p, FileOffset %I64x, Length %lu, Flags 0x%lx,"
44 " pBcb 0x%p, pBuffer 0x%p)\n", FileObject
, FileOffset
->QuadPart
,
45 Length
, Flags
, pBcb
, pBuffer
);
47 ReadOffset
= (ULONG
)FileOffset
->QuadPart
;
50 ASSERT(FileObject
->SectionObjectPointer
);
51 ASSERT(FileObject
->SectionObjectPointer
->SharedCacheMap
);
53 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
54 ASSERT(SharedCacheMap
);
56 DPRINT("SectionSize %I64x, FileSize %I64x\n",
57 SharedCacheMap
->SectionSize
.QuadPart
,
58 SharedCacheMap
->FileSize
.QuadPart
);
60 if (ReadOffset
% VACB_MAPPING_GRANULARITY
+ Length
> VACB_MAPPING_GRANULARITY
)
62 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
63 FileObject
, FileOffset
, Length
, Flags
);
67 ROffset
= ROUND_DOWN(ReadOffset
, VACB_MAPPING_GRANULARITY
);
68 Status
= CcRosRequestVacb(SharedCacheMap
,
73 if (!NT_SUCCESS(Status
))
75 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
76 FileObject
, FileOffset
, Length
, Flags
);
82 if (!(Flags
& MAP_WAIT
))
84 CcRosReleaseVacb(SharedCacheMap
, Vacb
, FALSE
, FALSE
, FALSE
);
85 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
86 FileObject
, FileOffset
, Length
, Flags
);
90 if (!NT_SUCCESS(CcReadVirtualAddress(Vacb
)))
92 CcRosReleaseVacb(SharedCacheMap
, Vacb
, FALSE
, FALSE
, FALSE
);
93 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
94 FileObject
, FileOffset
, Length
, Flags
);
99 *pBuffer
= (PVOID
)((ULONG_PTR
)(*pBuffer
) + ReadOffset
% VACB_MAPPING_GRANULARITY
);
100 iBcb
= ExAllocateFromNPagedLookasideList(&iBcbLookasideList
);
103 CcRosReleaseVacb(SharedCacheMap
, Vacb
, TRUE
, FALSE
, FALSE
);
104 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
105 FileObject
, FileOffset
, Length
, Flags
);
109 RtlZeroMemory(iBcb
, sizeof(*iBcb
));
110 iBcb
->PFCB
.NodeTypeCode
= 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
111 iBcb
->PFCB
.NodeByteSize
= sizeof(PUBLIC_BCB
);
112 iBcb
->PFCB
.MappedLength
= Length
;
113 iBcb
->PFCB
.MappedFileOffset
= *FileOffset
;
119 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> TRUE Bcb=%p\n",
120 FileObject
, FileOffset
, Length
, Flags
, iBcb
);
130 IN PFILE_OBJECT FileObject
,
131 IN PLARGE_INTEGER FileOffset
,
136 PROS_SHARED_CACHE_MAP SharedCacheMap
;
138 CCTRACE(CC_API_DEBUG
, "FileOffset=%p FileOffset=%p Length=%lu Flags=0x%lx\n",
139 FileObject
, FileOffset
, Length
, Flags
);
142 ASSERT(FileObject
->SectionObjectPointer
);
143 ASSERT(FileObject
->SectionObjectPointer
->SharedCacheMap
);
145 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
146 ASSERT(SharedCacheMap
);
147 ASSERT(SharedCacheMap
->PinAccess
);
149 /* no-op for current implementation. */
159 IN PFILE_OBJECT FileObject
,
160 IN PLARGE_INTEGER FileOffset
,
166 CCTRACE(CC_API_DEBUG
, "FileOffset=%p FileOffset=%p Length=%lu Flags=0x%lx\n",
167 FileObject
, FileOffset
, Length
, Flags
);
169 if (CcMapData(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
))
171 if (CcPinMappedData(FileObject
, FileOffset
, Length
, Flags
, Bcb
))
185 IN PFILE_OBJECT FileObject
,
186 IN PLARGE_INTEGER FileOffset
,
193 CCTRACE(CC_API_DEBUG
, "FileOffset=%p FileOffset=%p Length=%lu Zero=%d Flags=0x%lx\n",
194 FileObject
, FileOffset
, Length
, Zero
, Flags
);
197 * FIXME: This is function is similar to CcPinRead, but doesn't
198 * read the data if they're not present. Instead it should just
199 * prepare the VACBs and zero them out if Zero != FALSE.
201 * For now calling CcPinRead is better than returning error or
202 * just having UNIMPLEMENTED here.
204 return CcPinRead(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
);
211 CcSetDirtyPinnedData (
213 IN PLARGE_INTEGER Lsn
)
215 PINTERNAL_BCB iBcb
= Bcb
;
217 CCTRACE(CC_API_DEBUG
, "Bcb=%p Lsn=%p\n",
231 PINTERNAL_BCB iBcb
= Bcb
;
233 CCTRACE(CC_API_DEBUG
, "Bcb=%p\n", Bcb
);
235 CcRosReleaseVacb(iBcb
->Vacb
->SharedCacheMap
,
240 if (--iBcb
->RefCount
== 0)
242 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);
251 CcUnpinDataForThread (
253 IN ERESOURCE_THREAD ResourceThreadId
)
255 PINTERNAL_BCB iBcb
= Bcb
;
257 CCTRACE(CC_API_DEBUG
, "Bcb=%p ResourceThreadId=%lu\n", Bcb
, ResourceThreadId
);
259 if (iBcb
->OwnerPointer
!= (PVOID
)ResourceThreadId
)
261 DPRINT1("Invalid owner! Caller: %p, Owner: %p\n", (PVOID
)ResourceThreadId
, iBcb
->OwnerPointer
);
276 PINTERNAL_BCB iBcb
= Bcb
;
278 CCTRACE(CC_API_DEBUG
, "Bcb=%p\n", Bcb
);
290 IN BOOLEAN WriteThrough
,
291 IN PIO_STATUS_BLOCK IoStatus
)
293 PINTERNAL_BCB iBcb
= Bcb
;
295 CCTRACE(CC_API_DEBUG
, "Bcb=%p WriteThrough=%d\n", Bcb
, WriteThrough
);
297 IoStatus
->Status
= STATUS_SUCCESS
;
298 if (--iBcb
->RefCount
== 0)
300 IoStatus
->Information
= 0;
303 ExAcquireResourceExclusiveLite(&iBcb
->Vacb
->Lock
, TRUE
);
304 if (iBcb
->Vacb
->Dirty
)
306 IoStatus
->Status
= CcRosFlushVacb(iBcb
->Vacb
);
310 IoStatus
->Status
= STATUS_SUCCESS
;
312 ExReleaseResourceLite(&iBcb
->Vacb
->Lock
);
316 IoStatus
->Status
= STATUS_SUCCESS
;
319 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);