2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel
4 * FILE: ntoskrnl/cache/copysup.c
5 * PURPOSE: Logging and configuration routines
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES *******************************************************************/
13 #include "section/newmm.h"
17 /* GLOBALS ********************************************************************/
19 ULONG CcFastMdlReadWait
;
20 ULONG CcFastMdlReadNotPossible
;
21 ULONG CcFastReadNotPossible
;
23 ULONG CcFastReadNoWait
;
24 ULONG CcFastReadResourceMiss
;
26 #define TAG_COPY_READ TAG('C', 'o', 'p', 'y')
27 #define TAG_COPY_WRITE TAG('R', 'i', 't', 'e')
29 /* FUNCTIONS ******************************************************************/
33 CcCopyRead(IN PFILE_OBJECT FileObject
,
34 IN PLARGE_INTEGER FileOffset
,
38 OUT PIO_STATUS_BLOCK IoStatus
)
43 PCHAR BufferTarget
= (PCHAR
)Buffer
;
44 LARGE_INTEGER CacheOffset
, EndOfExtent
, NextOffset
;
47 ("CcCopyRead(%x,%x,%d,%d,%x)\n",
54 CacheOffset
.QuadPart
= FileOffset
->QuadPart
;
55 EndOfExtent
.QuadPart
= FileOffset
->QuadPart
+ Length
;
57 while (CacheOffset
.QuadPart
< EndOfExtent
.QuadPart
)
59 NextOffset
.QuadPart
= CacheOffset
.QuadPart
;
60 NextOffset
.LowPart
= (NextOffset
.LowPart
+ CACHE_STRIPE
) & ~(CACHE_STRIPE
-1);
61 ReadLen
= EndOfExtent
.QuadPart
- CacheOffset
.QuadPart
;
62 if (CacheOffset
.QuadPart
+ ReadLen
> NextOffset
.QuadPart
)
64 ReadLen
= NextOffset
.QuadPart
- CacheOffset
.QuadPart
;
67 DPRINT("Reading %d bytes in this go (at %08x%08x)\n", ReadLen
, CacheOffset
.HighPart
, CacheOffset
.LowPart
);
73 Wait
? PIN_WAIT
: PIN_IF_BCB
,
77 IoStatus
->Status
= STATUS_UNSUCCESSFUL
;
78 IoStatus
->Information
= 0;
79 DPRINT("Failed CcCopyRead\n");
83 DPRINT1("Copying %d bytes at %08x%08x\n", ReadLen
, CacheOffset
.HighPart
, CacheOffset
.LowPart
);
89 BufferTarget
+= ReadLen
;
91 CacheOffset
= NextOffset
;
95 IoStatus
->Status
= STATUS_SUCCESS
;
96 IoStatus
->Information
= Length
;
98 DPRINT("Done with CcCopyRead\n");
105 CcFastCopyRead(IN PFILE_OBJECT FileObject
,
110 OUT PIO_STATUS_BLOCK IoStatus
)
118 CcCopyWrite(IN PFILE_OBJECT FileObject
,
119 IN PLARGE_INTEGER FileOffset
,
129 LARGE_INTEGER CurrentOffset
= *FileOffset
;
130 LARGE_INTEGER EndOffset
;
131 LARGE_INTEGER NextOffset
;
133 EndOffset
.QuadPart
= CurrentOffset
.QuadPart
+ Length
;
136 ("CcCopyWrite(%x,%x,%d,%d,%x)\n",
143 while (CurrentOffset
.QuadPart
< EndOffset
.QuadPart
)
145 NextOffset
.HighPart
= CurrentOffset
.HighPart
;
146 NextOffset
.LowPart
= (CurrentOffset
.LowPart
+ CACHE_STRIPE
) & ~(CACHE_STRIPE
- 1);
147 DPRINT("NextOffset %08x%08x\n", NextOffset
.u
.HighPart
, NextOffset
.u
.LowPart
);
148 WriteLen
= MIN(NextOffset
.QuadPart
- CurrentOffset
.QuadPart
, Length
);
149 DPRINT("Copying %x bytes from %08x%08x\n",
151 CurrentOffset
.u
.HighPart
, CurrentOffset
.u
.LowPart
);
152 DPRINT("CcPreparePinWrite\n");
153 Result
= CcPreparePinWrite
154 (FileObject
, &CurrentOffset
, WriteLen
, FALSE
, Wait
? PIN_WAIT
: PIN_IF_BCB
,
155 (PVOID
*)&Bcb
, &WriteBuf
);
156 DPRINT("Result %s %x %x\n", Result
? "TRUE" : "FALSE", Bcb
, WriteBuf
);
159 DPRINT1("CcPreparePinWrite Failed?\n");
160 if (Wait
) RtlRaiseStatus(STATUS_NOT_MAPPED_DATA
); else return FALSE
;
162 DPRINT1("Copying actual memory to BCB#%x (@%x) (from buffer at %x)\n", Bcb
- CcCacheSections
, WriteBuf
, Bcb
->BaseAddress
);
164 //MiZeroFillSection(WriteBuf, &CurrentOffset, WriteLen);
165 RtlCopyMemory(WriteBuf
, ((PCHAR
)Buffer
) + Count
, WriteLen
);
168 CurrentOffset
= NextOffset
;
173 DPRINT("Done with CcCopyWrite\n");
180 CcFastCopyWrite(IN PFILE_OBJECT FileObject
,
191 CcCanIWrite(IN PFILE_OBJECT FileObject
,
192 IN ULONG BytesToWrite
,
203 CcDeferWrite(IN PFILE_OBJECT FileObject
,
204 IN PCC_POST_DEFERRED_WRITE PostRoutine
,
207 IN ULONG BytesToWrite
,