1 /* $Id: pin.c,v 1.11 2003/02/13 22:24:18 hbirr Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/cc/pin.c
6 * PURPOSE: Implements cache managers pinning interface
7 * PROGRAMMER: Hartmut Birr
12 /* INCLUDES ******************************************************************/
14 #include <ddk/ntddk.h>
15 #include <ddk/ntifs.h>
16 #include <internal/mm.h>
17 #include <internal/cc.h>
18 #include <internal/pool.h>
19 #include <internal/io.h>
20 #include <ntos/minmax.h>
23 #include <internal/debug.h>
25 /* GLOBALS *******************************************************************/
27 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
29 extern NPAGED_LOOKASIDE_LIST iBcbLookasideList
;
31 /* FUNCTIONS *****************************************************************/
34 CcMapData (IN PFILE_OBJECT FileObject
,
35 IN PLARGE_INTEGER FileOffset
,
44 PCACHE_SEGMENT CacheSeg
;
49 DPRINT("CcMapData(FileObject %x, FileOffset %d, Length %d, Wait %d,"
50 " pBcb %x, pBuffer %x)\n", FileObject
, (ULONG
)FileOffset
->QuadPart
,
51 Length
, Wait
, pBcb
, pBuffer
);
53 ReadOffset
= FileOffset
->QuadPart
;
54 Bcb
= FileObject
->SectionObjectPointers
->SharedCacheMap
;
57 DPRINT("AllocationSize %d, FileSize %d\n",
58 (ULONG
)Bcb
->AllocationSize
.QuadPart
,
59 (ULONG
)Bcb
->FileSize
.QuadPart
);
61 if (ReadOffset
% Bcb
->CacheSegmentSize
+ Length
> Bcb
->CacheSegmentSize
)
65 ROffset
= ROUND_DOWN (ReadOffset
, Bcb
->CacheSegmentSize
);
66 Status
= CcRosRequestCacheSegment(Bcb
,
71 if (!NT_SUCCESS(Status
))
79 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, FALSE
, FALSE
, FALSE
);
82 if (!NT_SUCCESS(ReadCacheSegment(CacheSeg
)))
84 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, FALSE
, FALSE
, FALSE
);
88 *pBuffer
+= ReadOffset
% Bcb
->CacheSegmentSize
;
89 iBcb
= ExAllocateFromNPagedLookasideList(&iBcbLookasideList
);
92 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, TRUE
, FALSE
, FALSE
);
95 memset(iBcb
, 0, sizeof(INTERNAL_BCB
));
96 iBcb
->CacheSegment
= CacheSeg
;
98 iBcb
->PFCB
.MappedLength
= Length
;
99 iBcb
->PFCB
.MappedFileOffset
.QuadPart
= FileOffset
->QuadPart
;
105 CcUnpinData (IN PVOID Bcb
)
107 PINTERNAL_BCB iBcb
= Bcb
;
108 CcRosReleaseCacheSegment(iBcb
->CacheSegment
->Bcb
, iBcb
->CacheSegment
, TRUE
,
110 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);
114 CcSetDirtyPinnedData (IN PVOID Bcb
,
115 IN PLARGE_INTEGER Lsn
)
117 PINTERNAL_BCB iBcb
= Bcb
;