2004-08-15 Casper S. Hornstrup <chorns@users.sourceforge.net>
[reactos.git] / reactos / ntoskrnl / cc / pin.c
1 /* $Id: pin.c,v 1.16 2004/08/15 16:39:00 chorns Exp $
2 *
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
8 * UPDATE HISTORY:
9 * Created 05.10.2001
10 */
11
12 /* INCLUDES ******************************************************************/
13
14 #include <ntoskrnl.h>
15 #define NDEBUG
16 #include <internal/debug.h>
17
18 /* GLOBALS *******************************************************************/
19
20 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
21
22 extern NPAGED_LOOKASIDE_LIST iBcbLookasideList;
23
24 /* FUNCTIONS *****************************************************************/
25
26 /*
27 * @implemented
28 */
29 BOOLEAN STDCALL
30 CcMapData (IN PFILE_OBJECT FileObject,
31 IN PLARGE_INTEGER FileOffset,
32 IN ULONG Length,
33 IN BOOLEAN Wait,
34 OUT PVOID *pBcb,
35 OUT PVOID *pBuffer)
36 {
37 ULONG ReadOffset;
38 BOOLEAN Valid;
39 PBCB Bcb;
40 PCACHE_SEGMENT CacheSeg;
41 NTSTATUS Status;
42 PINTERNAL_BCB iBcb;
43 ULONG ROffset;
44
45 DPRINT("CcMapData(FileObject %x, FileOffset %d, Length %d, Wait %d,"
46 " pBcb %x, pBuffer %x)\n", FileObject, (ULONG)FileOffset->QuadPart,
47 Length, Wait, pBcb, pBuffer);
48
49 ReadOffset = (ULONG)FileOffset->QuadPart;
50 Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
51 assert(Bcb);
52
53 DPRINT("AllocationSize %d, FileSize %d\n",
54 (ULONG)Bcb->AllocationSize.QuadPart,
55 (ULONG)Bcb->FileSize.QuadPart);
56
57 if (ReadOffset % Bcb->CacheSegmentSize + Length > Bcb->CacheSegmentSize)
58 {
59 return(FALSE);
60 }
61 ROffset = ROUND_DOWN (ReadOffset, Bcb->CacheSegmentSize);
62 Status = CcRosRequestCacheSegment(Bcb,
63 ROffset,
64 pBuffer,
65 &Valid,
66 &CacheSeg);
67 if (!NT_SUCCESS(Status))
68 {
69 return(FALSE);
70 }
71 if (!Valid)
72 {
73 if (!Wait)
74 {
75 CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
76 return(FALSE);
77 }
78 if (!NT_SUCCESS(ReadCacheSegment(CacheSeg)))
79 {
80 CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
81 return(FALSE);
82 }
83 }
84 #if defined(__GNUC__)
85 *pBuffer += ReadOffset % Bcb->CacheSegmentSize;
86 #else
87 {
88 char* pTemp = *pBuffer;
89 pTemp += ReadOffset % Bcb->CacheSegmentSize;
90 *pBuffer = pTemp;
91 }
92 #endif
93 iBcb = ExAllocateFromNPagedLookasideList(&iBcbLookasideList);
94 if (iBcb == NULL)
95 {
96 CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
97 return FALSE;
98 }
99 memset(iBcb, 0, sizeof(INTERNAL_BCB));
100 iBcb->CacheSegment = CacheSeg;
101 iBcb->Dirty = FALSE;
102 iBcb->PFCB.MappedLength = Length;
103 iBcb->PFCB.MappedFileOffset.QuadPart = FileOffset->QuadPart;
104 *pBcb = (PVOID)iBcb;
105 return(TRUE);
106 }
107
108 /*
109 * @unimplemented
110 */
111 BOOLEAN
112 STDCALL
113 CcPinMappedData (
114 IN PFILE_OBJECT FileObject,
115 IN PLARGE_INTEGER FileOffset,
116 IN ULONG Length,
117 IN BOOLEAN Wait,
118 OUT PVOID * Bcb
119 )
120 {
121 UNIMPLEMENTED;
122 return FALSE;
123 }
124
125 /*
126 * @unimplemented
127 */
128 BOOLEAN
129 STDCALL
130 CcPinRead (
131 IN PFILE_OBJECT FileObject,
132 IN PLARGE_INTEGER FileOffset,
133 IN ULONG Length,
134 IN BOOLEAN Wait,
135 OUT PVOID * Bcb,
136 OUT PVOID * Buffer
137 )
138 {
139 UNIMPLEMENTED;
140 return FALSE;
141 }
142
143 /*
144 * @unimplemented
145 */
146 BOOLEAN
147 STDCALL
148 CcPreparePinWrite (
149 IN PFILE_OBJECT FileObject,
150 IN PLARGE_INTEGER FileOffset,
151 IN ULONG Length,
152 IN BOOLEAN Zero,
153 IN BOOLEAN Wait,
154 OUT PVOID * Bcb,
155 OUT PVOID * Buffer
156 )
157 {
158 UNIMPLEMENTED;
159 return FALSE;
160 }
161
162 /*
163 * @implemented
164 */
165 VOID STDCALL
166 CcSetDirtyPinnedData (IN PVOID Bcb,
167 IN PLARGE_INTEGER Lsn)
168 {
169 PINTERNAL_BCB iBcb = Bcb;
170 iBcb->Dirty = TRUE;
171 }
172
173
174 /*
175 * @implemented
176 */
177 VOID STDCALL
178 CcUnpinData (IN PVOID Bcb)
179 {
180 PINTERNAL_BCB iBcb = Bcb;
181 CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
182 iBcb->Dirty, FALSE);
183 ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
184 }
185
186 /*
187 * @unimplemented
188 */
189 VOID
190 STDCALL
191 CcUnpinDataForThread (
192 IN PVOID Bcb,
193 IN ERESOURCE_THREAD ResourceThreadId
194 )
195 {
196 UNIMPLEMENTED;
197 }