-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/cc/copy.c
* PURPOSE: Implements cache managers copy interface
*
- * PROGRAMMERS: Hartmut Birr
+ * PROGRAMMERS:
*/
/* INCLUDES ******************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
-#include <internal/debug.h>
+#include <debug.h>
/* GLOBALS *******************************************************************/
/* void * alloca(size_t size); */
#elif defined(_MSC_VER)
void* _alloca(size_t size);
+#define alloca _alloca
#else
#error Unknown compiler for alloca intrinsic stack allocation "function"
#endif
-ULONG EXPORTED CcFastMdlReadWait;
-ULONG EXPORTED CcFastReadNotPossible;
-ULONG EXPORTED CcFastReadWait;
+ULONG CcFastMdlReadWait;
+ULONG CcFastMdlReadNotPossible;
+ULONG CcFastReadNotPossible;
+ULONG CcFastReadWait;
ULONG CcFastReadNoWait;
ULONG CcFastReadResourceMiss;
-
/* FUNCTIONS *****************************************************************/
VOID
+NTAPI
CcInitCacheZeroPage(VOID)
{
NTSTATUS Status;
if (!NT_SUCCESS(Status))
{
DbgPrint("Can't allocate CcZeroPage.\n");
- KEBUGCHECKCC;
+ KeBugCheck(CACHE_MANAGER);
}
Status = MiZeroPage(CcZeroPage);
if (!NT_SUCCESS(Status))
{
DbgPrint("Can't zero out CcZeroPage.\n");
- KEBUGCHECKCC;
+ KeBugCheck(CACHE_MANAGER);
}
}
NTSTATUS
+NTAPI
ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
PVOID Buffer)
{
{
TempLength = min(Bcb->CacheSegmentSize, Length);
memcpy(Buffer, current->BaseAddress, TempLength);
-#if defined(__GNUC__)
- Buffer += TempLength;
-#else
- {
- char* pTemp = Buffer;
- pTemp += TempLength;
- Buffer = pTemp;
- }
-#endif
+
+ Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
+
Length = Length - TempLength;
previous = current;
current = current->NextInChain;
current = current->NextInChain;
TempLength = min(Bcb->CacheSegmentSize, Length);
memcpy(Buffer, previous->BaseAddress, TempLength);
-#if defined(__GNUC__)
- Buffer += TempLength;
-#else
- {
- char* pTemp = Buffer;
- pTemp += TempLength;
- Buffer = pTemp;
- }
-#endif
+
+ Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
+
Length = Length - TempLength;
CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
current_size += Bcb->CacheSegmentSize;
}
NTSTATUS
+NTAPI
ReadCacheSegment(PCACHE_SEGMENT CacheSeg)
{
ULONG Size;
}
NTSTATUS
+NTAPI
WriteCacheSegment(PCACHE_SEGMENT CacheSeg)
{
ULONG Size;
{
Size = CacheSeg->Bcb->CacheSegmentSize;
}
+ //
+ // Nonpaged pool PDEs in ReactOS must actually be synchronized between the
+ // MmGlobalPageDirectory and the real system PDE directory. What a mess...
+ //
+ {
+ int i = 0;
+ do
+ {
+ MmGetPfnForProcess(NULL, (PVOID)((ULONG_PTR)CacheSeg->BaseAddress + (i << PAGE_SHIFT)));
+ } while (++i < (Size >> PAGE_SHIFT));
+ }
Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size));
MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size);
MmBuildMdlForNonPagedPool(Mdl);
/*
* @unimplemented
*/
-BOOLEAN STDCALL
+BOOLEAN NTAPI
CcCanIWrite (
IN PFILE_OBJECT FileObject,
IN ULONG BytesToWrite,
/*
* @implemented
*/
-BOOLEAN STDCALL
+BOOLEAN NTAPI
CcCopyRead (IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
PLIST_ENTRY current_entry;
PCACHE_SEGMENT current;
- DPRINT("CcCopyRead(FileObject %x, FileOffset %x, "
- "Length %d, Wait %d, Buffer %x, IoStatus %x)\n",
- FileObject, (ULONG)FileOffset->QuadPart, Length, Wait,
+ DPRINT("CcCopyRead(FileObject 0x%p, FileOffset %I64x, "
+ "Length %d, Wait %d, Buffer 0x%p, IoStatus 0x%p)\n",
+ FileObject, FileOffset->QuadPart, Length, Wait,
Buffer, IoStatus);
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
while (Length > 0)
{
TempLength = min(max(Bcb->CacheSegmentSize, MAX_RW_LENGTH), Length);
- ReadCacheSegmentChain(Bcb, ReadOffset, TempLength, Buffer);
+ Status = ReadCacheSegmentChain(Bcb, ReadOffset, TempLength, Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ IoStatus->Information = 0;
+ IoStatus->Status = Status;
+ DPRINT1("ReadCacheSegmentChain failed, Status %x\n", Status);
+ return FALSE;
+ }
+
ReadLength += TempLength;
Length -= TempLength;
ReadOffset += TempLength;
-#if defined(__GNUC__)
- Buffer += TempLength;
-#else
- {
- char* pTemp = Buffer;
- pTemp += TempLength;
- Buffer = pTemp;
- }
-#endif
+
+ Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
}
IoStatus->Status = STATUS_SUCCESS;
IoStatus->Information = ReadLength;
/*
* @implemented
*/
-BOOLEAN STDCALL
+BOOLEAN NTAPI
CcCopyWrite (IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
PVOID BaseAddress;
BOOLEAN Valid;
- DPRINT("CcCopyWrite(FileObject %x, FileOffset %x, "
- "Length %d, Wait %d, Buffer %x)\n",
- FileObject, (ULONG)FileOffset->QuadPart, Length, Wait, Buffer);
+ DPRINT("CcCopyWrite(FileObject 0x%p, FileOffset %I64x, "
+ "Length %d, Wait %d, Buffer 0x%p)\n",
+ FileObject, FileOffset->QuadPart, Length, Wait, Buffer);
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
WriteOffset = (ULONG)FileOffset->QuadPart;
Length -= TempLength;
WriteOffset += TempLength;
-#if defined(__GNUC__)
- Buffer += TempLength;
-#else
- {
- char* pTemp = Buffer;
- pTemp += TempLength;
- Buffer = pTemp;
- }
-#endif
+
+ Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
}
while (Length > 0)
CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, TRUE, FALSE);
Length -= TempLength;
WriteOffset += TempLength;
-#if defined(__GNUC__)
- Buffer += TempLength;
-#else
- {
- char* pTemp = Buffer;
- pTemp += TempLength;
- Buffer = pTemp;
- }
-#endif
+
+ Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
}
return(TRUE);
}
* @unimplemented
*/
VOID
-STDCALL
+NTAPI
CcDeferWrite (
IN PFILE_OBJECT FileObject,
IN PCC_POST_DEFERRED_WRITE PostRoutine,
* @unimplemented
*/
VOID
-STDCALL
+NTAPI
CcFastCopyRead (
IN PFILE_OBJECT FileObject,
IN ULONG FileOffset,
* @unimplemented
*/
VOID
-STDCALL
+NTAPI
CcFastCopyWrite(
IN PFILE_OBJECT FileObject,
IN ULONG FileOffset,
* @unimplemented
*/
NTSTATUS
-STDCALL
+NTAPI
CcWaitForCurrentLazyWriterActivity (
VOID
)
/*
* @implemented
*/
-BOOLEAN STDCALL
+BOOLEAN NTAPI
CcZeroData (IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER StartOffset,
IN PLARGE_INTEGER EndOffset,
IO_STATUS_BLOCK Iosb;
KEVENT Event;
- DPRINT("CcZeroData(FileObject %x, StartOffset %I64x, EndOffset %I64x, "
+ DPRINT("CcZeroData(FileObject 0x%p, StartOffset %I64x, EndOffset %I64x, "
"Wait %d)\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart,
Wait);