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 CCTRACE(CC_API_DEBUG
, "FileOffset=%p FileOffset=%p Length=%lu Flags=0x%lx\n",
137 FileObject
, FileOffset
, Length
, Flags
);
139 /* no-op for current implementation. */
149 IN PFILE_OBJECT FileObject
,
150 IN PLARGE_INTEGER FileOffset
,
156 CCTRACE(CC_API_DEBUG
, "FileOffset=%p FileOffset=%p Length=%lu Flags=0x%lx\n",
157 FileObject
, FileOffset
, Length
, Flags
);
159 if (CcMapData(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
))
161 if (CcPinMappedData(FileObject
, FileOffset
, Length
, Flags
, Bcb
))
175 IN PFILE_OBJECT FileObject
,
176 IN PLARGE_INTEGER FileOffset
,
183 CCTRACE(CC_API_DEBUG
, "FileOffset=%p FileOffset=%p Length=%lu Zero=%d Flags=0x%lx\n",
184 FileObject
, FileOffset
, Length
, Zero
, Flags
);
187 * FIXME: This is function is similar to CcPinRead, but doesn't
188 * read the data if they're not present. Instead it should just
189 * prepare the VACBs and zero them out if Zero != FALSE.
191 * For now calling CcPinRead is better than returning error or
192 * just having UNIMPLEMENTED here.
194 return CcPinRead(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
);
201 CcSetDirtyPinnedData (
203 IN PLARGE_INTEGER Lsn
)
205 PINTERNAL_BCB iBcb
= Bcb
;
207 CCTRACE(CC_API_DEBUG
, "Bcb=%p Lsn=%p\n",
221 PINTERNAL_BCB iBcb
= Bcb
;
223 CCTRACE(CC_API_DEBUG
, "Bcb=%p\n", Bcb
);
225 CcRosReleaseVacb(iBcb
->Vacb
->SharedCacheMap
,
230 if (--iBcb
->RefCount
== 0)
232 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);
241 CcUnpinDataForThread (
243 IN ERESOURCE_THREAD ResourceThreadId
)
245 CCTRACE(CC_API_DEBUG
, "Bcb=%p ResourceThreadId=%lu\n", Bcb
, ResourceThreadId
);
258 PINTERNAL_BCB iBcb
= Bcb
;
260 CCTRACE(CC_API_DEBUG
, "Bcb=%p\n", Bcb
);
272 IN BOOLEAN WriteThrough
,
273 IN PIO_STATUS_BLOCK IoStatus
)
275 PINTERNAL_BCB iBcb
= Bcb
;
277 CCTRACE(CC_API_DEBUG
, "Bcb=%p WriteThrough=%d\n", Bcb
, WriteThrough
);
279 IoStatus
->Status
= STATUS_SUCCESS
;
280 if (--iBcb
->RefCount
== 0)
282 IoStatus
->Information
= 0;
285 KeWaitForSingleObject(&iBcb
->Vacb
->Mutex
,
290 if (iBcb
->Vacb
->Dirty
)
292 IoStatus
->Status
= CcRosFlushVacb(iBcb
->Vacb
);
296 IoStatus
->Status
= STATUS_SUCCESS
;
298 KeReleaseMutex(&iBcb
->Vacb
->Mutex
, FALSE
);
302 IoStatus
->Status
= STATUS_SUCCESS
;
305 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);