mirror of
https://github.com/reactos/reactos.git
synced 2025-05-16 15:50:24 +00:00
- Implement CcRepinBcb and CcGetFileObjectFromBcb.
- Partially implement CcUnpinRepinnedBcb, CcPinMappedData, CcPinRead, CcPreparePinWrite, CcInitializeCacheMap (Art Yerkes) and CcUninitializeCacheMap. - Fix ReadCacheSegmentChain to handle correctly big request and check for MDL request memory overflow. - Allow passing NULL BCB to CcSetFileSizes. - Ensure that registry files are opened using lowercase file names. svn path=/trunk/; revision=10678
This commit is contained in:
parent
b8648c7bf4
commit
1e7841a2e8
7 changed files with 125 additions and 56 deletions
|
@ -57,18 +57,6 @@ CcGetFlushedValidData (
|
|||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
CcRepinBcb (
|
||||
IN PVOID Bcb
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
|
@ -147,17 +135,3 @@ CcSetReadAheadGranularity (
|
|||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
CcUnpinRepinnedBcb (
|
||||
IN PVOID Bcb,
|
||||
IN BOOLEAN WriteThrough,
|
||||
IN PIO_STATUS_BLOCK IoStatus
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: copy.c,v 1.30 2004/08/15 16:38:59 chorns Exp $
|
||||
/* $Id: copy.c,v 1.31 2004/08/25 15:08:28 navaraf Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -22,7 +22,7 @@
|
|||
static PFN_TYPE CcZeroPage = 0;
|
||||
|
||||
#define MAX_ZERO_LENGTH (256 * 1024)
|
||||
#define MAX_RW_LENGTH (64 * 1024)
|
||||
#define MAX_RW_LENGTH (256 * 1024)
|
||||
|
||||
#if defined(__GNUC__)
|
||||
void * alloca(size_t size);
|
||||
|
@ -119,7 +119,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
|||
*/
|
||||
current2 = current;
|
||||
current_size = 0;
|
||||
while (current2 != NULL && !current2->Valid)
|
||||
while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
|
||||
{
|
||||
current2 = current2->NextInChain;
|
||||
current_size += Bcb->CacheSegmentSize;
|
||||
|
@ -131,8 +131,9 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
|||
MmInitializeMdl(Mdl, NULL, current_size);
|
||||
Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ);
|
||||
current2 = current;
|
||||
current_size = 0;
|
||||
MdlPages = (PPFN_TYPE)(Mdl + 1);
|
||||
while (current2 != NULL && !current2->Valid)
|
||||
while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
|
||||
{
|
||||
PVOID address = current2->BaseAddress;
|
||||
for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++, address += PAGE_SIZE)
|
||||
|
@ -140,6 +141,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
|||
*MdlPages++ = MmGetPfnForProcess(NULL, address);
|
||||
}
|
||||
current2 = current2->NextInChain;
|
||||
current_size += Bcb->CacheSegmentSize;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -157,7 +159,10 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
|||
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
|
||||
Status = Iosb.Status;
|
||||
}
|
||||
MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
|
||||
if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA)
|
||||
{
|
||||
MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
|
||||
}
|
||||
if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE)
|
||||
{
|
||||
while (current != NULL)
|
||||
|
@ -168,7 +173,8 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
|||
}
|
||||
return(Status);
|
||||
}
|
||||
while (current != NULL && !current->Valid)
|
||||
current_size = 0;
|
||||
while (current != NULL && !current->Valid && current_size < MAX_RW_LENGTH)
|
||||
{
|
||||
previous = current;
|
||||
current = current->NextInChain;
|
||||
|
@ -185,6 +191,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
|||
#endif
|
||||
Length = Length - TempLength;
|
||||
CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
|
||||
current_size += Bcb->CacheSegmentSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,10 @@
|
|||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
#ifndef VACB_MAPPING_GRANULARITY
|
||||
#define VACB_MAPPING_GRANULARITY (256 * 1024)
|
||||
#endif
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
extern FAST_MUTEX ViewLock;
|
||||
|
@ -42,7 +46,7 @@ CcGetDirtyPages (
|
|||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
PFILE_OBJECT
|
||||
STDCALL
|
||||
|
@ -50,8 +54,8 @@ CcGetFileObjectFromBcb (
|
|||
IN PVOID Bcb
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb;
|
||||
return iBcb->CacheSegment->Bcb->FileObject;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -84,7 +88,7 @@ CcInitializeCacheMap (
|
|||
IN PVOID LazyWriterContext
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
CcRosInitializeFileCache(FileObject, VACB_MAPPING_GRANULARITY);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -139,7 +143,13 @@ CcSetFileSizes (IN PFILE_OBJECT FileObject,
|
|||
(ULONG)FileSizes->ValidDataLength.QuadPart);
|
||||
|
||||
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
|
||||
assert(Bcb);
|
||||
|
||||
/*
|
||||
* It is valid to call this function on file objects that weren't
|
||||
* initialized for caching. In this case it's simple no-op.
|
||||
*/
|
||||
if (Bcb == NULL)
|
||||
return;
|
||||
|
||||
if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart)
|
||||
{
|
||||
|
@ -226,6 +236,10 @@ CcUninitializeCacheMap (
|
|||
IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
|
||||
)
|
||||
{
|
||||
#if 0
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
#else
|
||||
return CcRosReleaseFileCache(FileObject);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: pin.c,v 1.16 2004/08/15 16:39:00 chorns Exp $
|
||||
/* $Id: pin.c,v 1.17 2004/08/25 15:08:29 navaraf Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -97,10 +97,13 @@ CcMapData (IN PFILE_OBJECT FileObject,
|
|||
return FALSE;
|
||||
}
|
||||
memset(iBcb, 0, sizeof(INTERNAL_BCB));
|
||||
iBcb->PFCB.NodeTypeCode = 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
|
||||
iBcb->PFCB.NodeByteSize = sizeof(PUBLIC_BCB);
|
||||
iBcb->PFCB.MappedLength = Length;
|
||||
iBcb->PFCB.MappedFileOffset = *FileOffset;
|
||||
iBcb->CacheSegment = CacheSeg;
|
||||
iBcb->Dirty = FALSE;
|
||||
iBcb->PFCB.MappedLength = Length;
|
||||
iBcb->PFCB.MappedFileOffset.QuadPart = FileOffset->QuadPart;
|
||||
iBcb->RefCount = 1;
|
||||
*pBcb = (PVOID)iBcb;
|
||||
return(TRUE);
|
||||
}
|
||||
|
@ -118,8 +121,8 @@ CcPinMappedData (
|
|||
OUT PVOID * Bcb
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
/* no-op for current implementation. */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -136,8 +139,14 @@ CcPinRead (
|
|||
OUT PVOID * Buffer
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
if (CcMapData(FileObject, FileOffset, Length, Wait, Bcb, Buffer))
|
||||
{
|
||||
if (CcPinMappedData(FileObject, FileOffset, Length, Wait, Bcb))
|
||||
return TRUE;
|
||||
else
|
||||
CcUnpinData(Bcb);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -155,8 +164,15 @@ CcPreparePinWrite (
|
|||
OUT PVOID * Buffer
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
/*
|
||||
* FIXME: This is function is similar to CcPinRead, but doesn't
|
||||
* read the data if they're not present. Instead it should just
|
||||
* prepare the cache segments and zero them out if Zero == TRUE.
|
||||
*
|
||||
* For now calling CcPinRead is better than returning error or
|
||||
* just having UNIMPLEMENTED here.
|
||||
*/
|
||||
return CcPinRead(FileObject, FileOffset, Length, Wait, Bcb, Buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -179,8 +195,11 @@ CcUnpinData (IN PVOID Bcb)
|
|||
{
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
|
||||
iBcb->Dirty, FALSE);
|
||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||
iBcb->Dirty, FALSE);
|
||||
if (--iBcb->RefCount == 0)
|
||||
{
|
||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -195,3 +214,54 @@ CcUnpinDataForThread (
|
|||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
CcRepinBcb (
|
||||
IN PVOID Bcb
|
||||
)
|
||||
{
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
iBcb->RefCount++;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
CcUnpinRepinnedBcb (
|
||||
IN PVOID Bcb,
|
||||
IN BOOLEAN WriteThrough,
|
||||
IN PIO_STATUS_BLOCK IoStatus
|
||||
)
|
||||
{
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
|
||||
if (--iBcb->RefCount == 0)
|
||||
{
|
||||
IoStatus->Information = 0;
|
||||
if (WriteThrough)
|
||||
{
|
||||
ExAcquireFastMutex(&iBcb->CacheSegment->Lock);
|
||||
if (iBcb->CacheSegment->Dirty)
|
||||
{
|
||||
IoStatus->Status = CcRosFlushCacheSegment(iBcb->CacheSegment);
|
||||
}
|
||||
else
|
||||
{
|
||||
IoStatus->Status = STATUS_SUCCESS;
|
||||
}
|
||||
ExReleaseFastMutex(&iBcb->CacheSegment->Lock);
|
||||
}
|
||||
else
|
||||
{
|
||||
IoStatus->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: view.c,v 1.76 2004/08/15 16:39:00 chorns Exp $
|
||||
/* $Id: view.c,v 1.77 2004/08/25 15:08:29 navaraf Exp $
|
||||
*
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: ntoskrnl/cc/view.c
|
||||
|
@ -113,7 +113,7 @@ CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg);
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS STATIC
|
||||
NTSTATUS
|
||||
CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
|
|
@ -29,11 +29,11 @@
|
|||
#define SAM_REG_FILE L"\\SystemRoot\\System32\\Config\\SAM"
|
||||
#define SEC_REG_FILE L"\\SystemRoot\\System32\\Config\\SECURITY"
|
||||
|
||||
#define REG_SYSTEM_FILE_NAME L"\\SYSTEM"
|
||||
#define REG_SOFTWARE_FILE_NAME L"\\SOFTWARE"
|
||||
#define REG_DEFAULT_USER_FILE_NAME L"\\DEFAULT"
|
||||
#define REG_SAM_FILE_NAME L"\\SAM"
|
||||
#define REG_SEC_FILE_NAME L"\\SECURITY"
|
||||
#define REG_SYSTEM_FILE_NAME L"\\system"
|
||||
#define REG_SOFTWARE_FILE_NAME L"\\software"
|
||||
#define REG_DEFAULT_USER_FILE_NAME L"\\default"
|
||||
#define REG_SAM_FILE_NAME L"\\sam"
|
||||
#define REG_SEC_FILE_NAME L"\\security"
|
||||
|
||||
#define REG_BLOCK_SIZE 4096
|
||||
#define REG_HBIN_DATA_OFFSET 32
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef __INCLUDE_INTERNAL_CC_H
|
||||
#define __INCLUDE_INTERNAL_CC_H
|
||||
|
||||
/* $Id: cc.h,v 1.20 2004/08/01 21:57:34 navaraf Exp $ */
|
||||
/* $Id: cc.h,v 1.21 2004/08/25 15:08:29 navaraf Exp $ */
|
||||
#include <ddk/ntifs.h>
|
||||
#include <reactos/bugcodes.h>
|
||||
|
||||
|
@ -59,12 +59,16 @@ typedef struct _INTERNAL_BCB
|
|||
PUBLIC_BCB PFCB;
|
||||
PCACHE_SEGMENT CacheSegment;
|
||||
BOOLEAN Dirty;
|
||||
CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
|
||||
} INTERNAL_BCB, *PINTERNAL_BCB;
|
||||
|
||||
VOID STDCALL
|
||||
CcMdlReadCompleteDev (IN PMDL MdlChain,
|
||||
IN PDEVICE_OBJECT DeviceObject);
|
||||
|
||||
NTSTATUS
|
||||
CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment);
|
||||
|
||||
NTSTATUS
|
||||
CcRosGetCacheSegment(PBCB Bcb,
|
||||
ULONG FileOffset,
|
||||
|
|
Loading…
Reference in a new issue