mirror of
https://github.com/reactos/reactos.git
synced 2025-06-17 19:45: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;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
CcRepinBcb (
|
|
||||||
IN PVOID Bcb
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
|
@ -147,17 +135,3 @@ CcSetReadAheadGranularity (
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
static PFN_TYPE CcZeroPage = 0;
|
static PFN_TYPE CcZeroPage = 0;
|
||||||
|
|
||||||
#define MAX_ZERO_LENGTH (256 * 1024)
|
#define MAX_ZERO_LENGTH (256 * 1024)
|
||||||
#define MAX_RW_LENGTH (64 * 1024)
|
#define MAX_RW_LENGTH (256 * 1024)
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
void * alloca(size_t size);
|
void * alloca(size_t size);
|
||||||
|
@ -119,7 +119,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
||||||
*/
|
*/
|
||||||
current2 = current;
|
current2 = current;
|
||||||
current_size = 0;
|
current_size = 0;
|
||||||
while (current2 != NULL && !current2->Valid)
|
while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
|
||||||
{
|
{
|
||||||
current2 = current2->NextInChain;
|
current2 = current2->NextInChain;
|
||||||
current_size += Bcb->CacheSegmentSize;
|
current_size += Bcb->CacheSegmentSize;
|
||||||
|
@ -131,8 +131,9 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
||||||
MmInitializeMdl(Mdl, NULL, current_size);
|
MmInitializeMdl(Mdl, NULL, current_size);
|
||||||
Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ);
|
Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ);
|
||||||
current2 = current;
|
current2 = current;
|
||||||
|
current_size = 0;
|
||||||
MdlPages = (PPFN_TYPE)(Mdl + 1);
|
MdlPages = (PPFN_TYPE)(Mdl + 1);
|
||||||
while (current2 != NULL && !current2->Valid)
|
while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
|
||||||
{
|
{
|
||||||
PVOID address = current2->BaseAddress;
|
PVOID address = current2->BaseAddress;
|
||||||
for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++, address += PAGE_SIZE)
|
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);
|
*MdlPages++ = MmGetPfnForProcess(NULL, address);
|
||||||
}
|
}
|
||||||
current2 = current2->NextInChain;
|
current2 = current2->NextInChain;
|
||||||
|
current_size += Bcb->CacheSegmentSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -157,7 +159,10 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
||||||
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
|
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
|
||||||
Status = Iosb.Status;
|
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)
|
if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE)
|
||||||
{
|
{
|
||||||
while (current != NULL)
|
while (current != NULL)
|
||||||
|
@ -168,7 +173,8 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
||||||
}
|
}
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
while (current != NULL && !current->Valid)
|
current_size = 0;
|
||||||
|
while (current != NULL && !current->Valid && current_size < MAX_RW_LENGTH)
|
||||||
{
|
{
|
||||||
previous = current;
|
previous = current;
|
||||||
current = current->NextInChain;
|
current = current->NextInChain;
|
||||||
|
@ -185,6 +191,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length,
|
||||||
#endif
|
#endif
|
||||||
Length = Length - TempLength;
|
Length = Length - TempLength;
|
||||||
CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
|
CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
|
||||||
|
current_size += Bcb->CacheSegmentSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,10 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
|
#ifndef VACB_MAPPING_GRANULARITY
|
||||||
|
#define VACB_MAPPING_GRANULARITY (256 * 1024)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* GLOBALS *****************************************************************/
|
/* GLOBALS *****************************************************************/
|
||||||
|
|
||||||
extern FAST_MUTEX ViewLock;
|
extern FAST_MUTEX ViewLock;
|
||||||
|
@ -42,7 +46,7 @@ CcGetDirtyPages (
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
PFILE_OBJECT
|
PFILE_OBJECT
|
||||||
STDCALL
|
STDCALL
|
||||||
|
@ -50,8 +54,8 @@ CcGetFileObjectFromBcb (
|
||||||
IN PVOID Bcb
|
IN PVOID Bcb
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb;
|
||||||
return 0;
|
return iBcb->CacheSegment->Bcb->FileObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -84,7 +88,7 @@ CcInitializeCacheMap (
|
||||||
IN PVOID LazyWriterContext
|
IN PVOID LazyWriterContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
CcRosInitializeFileCache(FileObject, VACB_MAPPING_GRANULARITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -139,7 +143,13 @@ CcSetFileSizes (IN PFILE_OBJECT FileObject,
|
||||||
(ULONG)FileSizes->ValidDataLength.QuadPart);
|
(ULONG)FileSizes->ValidDataLength.QuadPart);
|
||||||
|
|
||||||
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
|
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)
|
if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart)
|
||||||
{
|
{
|
||||||
|
@ -226,6 +236,10 @@ CcUninitializeCacheMap (
|
||||||
IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
|
IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return FALSE;
|
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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -97,10 +97,13 @@ CcMapData (IN PFILE_OBJECT FileObject,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
memset(iBcb, 0, sizeof(INTERNAL_BCB));
|
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->CacheSegment = CacheSeg;
|
||||||
iBcb->Dirty = FALSE;
|
iBcb->Dirty = FALSE;
|
||||||
iBcb->PFCB.MappedLength = Length;
|
iBcb->RefCount = 1;
|
||||||
iBcb->PFCB.MappedFileOffset.QuadPart = FileOffset->QuadPart;
|
|
||||||
*pBcb = (PVOID)iBcb;
|
*pBcb = (PVOID)iBcb;
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -118,8 +121,8 @@ CcPinMappedData (
|
||||||
OUT PVOID * Bcb
|
OUT PVOID * Bcb
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
/* no-op for current implementation. */
|
||||||
return FALSE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -136,8 +139,14 @@ CcPinRead (
|
||||||
OUT PVOID * Buffer
|
OUT PVOID * Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
if (CcMapData(FileObject, FileOffset, Length, Wait, Bcb, Buffer))
|
||||||
return FALSE;
|
{
|
||||||
|
if (CcPinMappedData(FileObject, FileOffset, Length, Wait, Bcb))
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
CcUnpinData(Bcb);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -155,8 +164,15 @@ CcPreparePinWrite (
|
||||||
OUT PVOID * Buffer
|
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;
|
PINTERNAL_BCB iBcb = Bcb;
|
||||||
CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
|
CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
|
||||||
iBcb->Dirty, FALSE);
|
iBcb->Dirty, FALSE);
|
||||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
if (--iBcb->RefCount == 0)
|
||||||
|
{
|
||||||
|
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -195,3 +214,54 @@ CcUnpinDataForThread (
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
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
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* 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
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/cc/view.c
|
* FILE: ntoskrnl/cc/view.c
|
||||||
|
@ -113,7 +113,7 @@ CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg);
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
NTSTATUS STATIC
|
NTSTATUS
|
||||||
CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment)
|
CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
|
@ -29,11 +29,11 @@
|
||||||
#define SAM_REG_FILE L"\\SystemRoot\\System32\\Config\\SAM"
|
#define SAM_REG_FILE L"\\SystemRoot\\System32\\Config\\SAM"
|
||||||
#define SEC_REG_FILE L"\\SystemRoot\\System32\\Config\\SECURITY"
|
#define SEC_REG_FILE L"\\SystemRoot\\System32\\Config\\SECURITY"
|
||||||
|
|
||||||
#define REG_SYSTEM_FILE_NAME L"\\SYSTEM"
|
#define REG_SYSTEM_FILE_NAME L"\\system"
|
||||||
#define REG_SOFTWARE_FILE_NAME L"\\SOFTWARE"
|
#define REG_SOFTWARE_FILE_NAME L"\\software"
|
||||||
#define REG_DEFAULT_USER_FILE_NAME L"\\DEFAULT"
|
#define REG_DEFAULT_USER_FILE_NAME L"\\default"
|
||||||
#define REG_SAM_FILE_NAME L"\\SAM"
|
#define REG_SAM_FILE_NAME L"\\sam"
|
||||||
#define REG_SEC_FILE_NAME L"\\SECURITY"
|
#define REG_SEC_FILE_NAME L"\\security"
|
||||||
|
|
||||||
#define REG_BLOCK_SIZE 4096
|
#define REG_BLOCK_SIZE 4096
|
||||||
#define REG_HBIN_DATA_OFFSET 32
|
#define REG_HBIN_DATA_OFFSET 32
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __INCLUDE_INTERNAL_CC_H
|
#ifndef __INCLUDE_INTERNAL_CC_H
|
||||||
#define __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 <ddk/ntifs.h>
|
||||||
#include <reactos/bugcodes.h>
|
#include <reactos/bugcodes.h>
|
||||||
|
|
||||||
|
@ -59,12 +59,16 @@ typedef struct _INTERNAL_BCB
|
||||||
PUBLIC_BCB PFCB;
|
PUBLIC_BCB PFCB;
|
||||||
PCACHE_SEGMENT CacheSegment;
|
PCACHE_SEGMENT CacheSegment;
|
||||||
BOOLEAN Dirty;
|
BOOLEAN Dirty;
|
||||||
|
CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
|
||||||
} INTERNAL_BCB, *PINTERNAL_BCB;
|
} INTERNAL_BCB, *PINTERNAL_BCB;
|
||||||
|
|
||||||
VOID STDCALL
|
VOID STDCALL
|
||||||
CcMdlReadCompleteDev (IN PMDL MdlChain,
|
CcMdlReadCompleteDev (IN PMDL MdlChain,
|
||||||
IN PDEVICE_OBJECT DeviceObject);
|
IN PDEVICE_OBJECT DeviceObject);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CcRosGetCacheSegment(PBCB Bcb,
|
CcRosGetCacheSegment(PBCB Bcb,
|
||||||
ULONG FileOffset,
|
ULONG FileOffset,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue