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
)
65 ROffset
= ROUND_DOWN(ReadOffset
, VACB_MAPPING_GRANULARITY
);
66 Status
= CcRosRequestVacb(SharedCacheMap
,
71 if (!NT_SUCCESS(Status
))
78 if (!(Flags
& MAP_WAIT
))
80 CcRosReleaseVacb(SharedCacheMap
, Vacb
, FALSE
, FALSE
, FALSE
);
84 if (!NT_SUCCESS(CcReadVirtualAddress(Vacb
)))
86 CcRosReleaseVacb(SharedCacheMap
, Vacb
, FALSE
, FALSE
, FALSE
);
91 *pBuffer
= (PVOID
)((ULONG_PTR
)(*pBuffer
) + ReadOffset
% VACB_MAPPING_GRANULARITY
);
92 iBcb
= ExAllocateFromNPagedLookasideList(&iBcbLookasideList
);
95 CcRosReleaseVacb(SharedCacheMap
, Vacb
, TRUE
, FALSE
, FALSE
);
99 RtlZeroMemory(iBcb
, sizeof(*iBcb
));
100 iBcb
->PFCB
.NodeTypeCode
= 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
101 iBcb
->PFCB
.NodeByteSize
= sizeof(PUBLIC_BCB
);
102 iBcb
->PFCB
.MappedLength
= Length
;
103 iBcb
->PFCB
.MappedFileOffset
= *FileOffset
;
118 IN PFILE_OBJECT FileObject
,
119 IN PLARGE_INTEGER FileOffset
,
124 /* no-op for current implementation. */
134 IN PFILE_OBJECT FileObject
,
135 IN PLARGE_INTEGER FileOffset
,
141 if (CcMapData(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
))
143 if (CcPinMappedData(FileObject
, FileOffset
, Length
, Flags
, Bcb
))
157 IN PFILE_OBJECT FileObject
,
158 IN PLARGE_INTEGER FileOffset
,
166 * FIXME: This is function is similar to CcPinRead, but doesn't
167 * read the data if they're not present. Instead it should just
168 * prepare the VACBs and zero them out if Zero == TRUE.
170 * For now calling CcPinRead is better than returning error or
171 * just having UNIMPLEMENTED here.
173 return CcPinRead(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
);
180 CcSetDirtyPinnedData (
182 IN PLARGE_INTEGER Lsn
)
184 PINTERNAL_BCB iBcb
= Bcb
;
196 PINTERNAL_BCB iBcb
= Bcb
;
198 CcRosReleaseVacb(iBcb
->Vacb
->SharedCacheMap
,
203 if (--iBcb
->RefCount
== 0)
205 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);
214 CcUnpinDataForThread (
216 IN ERESOURCE_THREAD ResourceThreadId
)
229 PINTERNAL_BCB iBcb
= Bcb
;
240 IN BOOLEAN WriteThrough
,
241 IN PIO_STATUS_BLOCK IoStatus
)
243 PINTERNAL_BCB iBcb
= Bcb
;
245 IoStatus
->Status
= STATUS_SUCCESS
;
246 if (--iBcb
->RefCount
== 0)
248 IoStatus
->Information
= 0;
251 KeWaitForSingleObject(&iBcb
->Vacb
->Mutex
,
256 if (iBcb
->Vacb
->Dirty
)
258 IoStatus
->Status
= CcRosFlushVacb(iBcb
->Vacb
);
262 IoStatus
->Status
= STATUS_SUCCESS
;
264 KeReleaseMutex(&iBcb
->Vacb
->Mutex
, FALSE
);
268 IoStatus
->Status
= STATUS_SUCCESS
;
271 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);