mirror of
https://github.com/reactos/reactos.git
synced 2025-04-15 01:47:30 +00:00
[NTOSKRNL]
Formatting, no functional change svn path=/trunk/; revision=57951
This commit is contained in:
parent
a9f6a51c2a
commit
49a76c78e0
5 changed files with 1502 additions and 1440 deletions
File diff suppressed because it is too large
Load diff
|
@ -32,16 +32,15 @@ NTSTATUS CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg);
|
|||
LARGE_INTEGER
|
||||
NTAPI
|
||||
CcGetDirtyPages (
|
||||
IN PVOID LogHandle,
|
||||
IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine,
|
||||
IN PVOID Context1,
|
||||
IN PVOID Context2
|
||||
)
|
||||
IN PVOID LogHandle,
|
||||
IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine,
|
||||
IN PVOID Context1,
|
||||
IN PVOID Context2)
|
||||
{
|
||||
LARGE_INTEGER i;
|
||||
UNIMPLEMENTED;
|
||||
i.QuadPart = 0;
|
||||
return i;
|
||||
LARGE_INTEGER i;
|
||||
UNIMPLEMENTED;
|
||||
i.QuadPart = 0;
|
||||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -50,11 +49,10 @@ CcGetDirtyPages (
|
|||
PFILE_OBJECT
|
||||
NTAPI
|
||||
CcGetFileObjectFromBcb (
|
||||
IN PVOID Bcb
|
||||
)
|
||||
IN PVOID Bcb)
|
||||
{
|
||||
PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb;
|
||||
return iBcb->CacheSegment->Bcb->FileObject;
|
||||
PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb;
|
||||
return iBcb->CacheSegment->Bcb->FileObject;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -63,14 +61,13 @@ CcGetFileObjectFromBcb (
|
|||
LARGE_INTEGER
|
||||
NTAPI
|
||||
CcGetLsnForFileObject (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
OUT PLARGE_INTEGER OldestLsn OPTIONAL
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
OUT PLARGE_INTEGER OldestLsn OPTIONAL)
|
||||
{
|
||||
LARGE_INTEGER i;
|
||||
UNIMPLEMENTED;
|
||||
i.QuadPart = 0;
|
||||
return i;
|
||||
LARGE_INTEGER i;
|
||||
UNIMPLEMENTED;
|
||||
i.QuadPart = 0;
|
||||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -79,20 +76,19 @@ CcGetLsnForFileObject (
|
|||
VOID
|
||||
NTAPI
|
||||
CcInitializeCacheMap (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PCC_FILE_SIZES FileSizes,
|
||||
IN BOOLEAN PinAccess,
|
||||
IN PCACHE_MANAGER_CALLBACKS CallBacks,
|
||||
IN PVOID LazyWriterContext
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PCC_FILE_SIZES FileSizes,
|
||||
IN BOOLEAN PinAccess,
|
||||
IN PCACHE_MANAGER_CALLBACKS CallBacks,
|
||||
IN PVOID LazyWriterContext)
|
||||
{
|
||||
ASSERT(FileObject);
|
||||
ASSERT(FileSizes);
|
||||
|
||||
/* Call old ROS cache init function */
|
||||
CcRosInitializeFileCache(FileObject,
|
||||
/*PAGE_SIZE*/ VACB_MAPPING_GRANULARITY, CallBacks,
|
||||
LazyWriterContext);
|
||||
/*PAGE_SIZE*/ VACB_MAPPING_GRANULARITY, CallBacks,
|
||||
LazyWriterContext);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -101,11 +97,10 @@ CcInitializeCacheMap (
|
|||
BOOLEAN
|
||||
NTAPI
|
||||
CcIsThereDirtyData (
|
||||
IN PVPB Vpb
|
||||
)
|
||||
IN PVPB Vpb)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -114,14 +109,13 @@ CcIsThereDirtyData (
|
|||
BOOLEAN
|
||||
NTAPI
|
||||
CcPurgeCacheSection (
|
||||
IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
||||
IN PLARGE_INTEGER FileOffset OPTIONAL,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN UninitializeCacheMaps
|
||||
)
|
||||
IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
||||
IN PLARGE_INTEGER FileOffset OPTIONAL,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN UninitializeCacheMaps)
|
||||
{
|
||||
//UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
//UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -129,91 +123,92 @@ CcPurgeCacheSection (
|
|||
* @implemented
|
||||
*/
|
||||
VOID NTAPI
|
||||
CcSetFileSizes (IN PFILE_OBJECT FileObject,
|
||||
IN PCC_FILE_SIZES FileSizes)
|
||||
CcSetFileSizes (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PCC_FILE_SIZES FileSizes)
|
||||
{
|
||||
KIRQL oldirql;
|
||||
PBCB Bcb;
|
||||
PLIST_ENTRY current_entry;
|
||||
PCACHE_SEGMENT current;
|
||||
LIST_ENTRY FreeListHead;
|
||||
NTSTATUS Status;
|
||||
KIRQL oldirql;
|
||||
PBCB Bcb;
|
||||
PLIST_ENTRY current_entry;
|
||||
PCACHE_SEGMENT current;
|
||||
LIST_ENTRY FreeListHead;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("CcSetFileSizes(FileObject 0x%p, FileSizes 0x%p)\n",
|
||||
FileObject, FileSizes);
|
||||
DPRINT("AllocationSize %d, FileSize %d, ValidDataLength %d\n",
|
||||
(ULONG)FileSizes->AllocationSize.QuadPart,
|
||||
(ULONG)FileSizes->FileSize.QuadPart,
|
||||
(ULONG)FileSizes->ValidDataLength.QuadPart);
|
||||
DPRINT("CcSetFileSizes(FileObject 0x%p, FileSizes 0x%p)\n",
|
||||
FileObject, FileSizes);
|
||||
DPRINT("AllocationSize %d, FileSize %d, ValidDataLength %d\n",
|
||||
(ULONG)FileSizes->AllocationSize.QuadPart,
|
||||
(ULONG)FileSizes->FileSize.QuadPart,
|
||||
(ULONG)FileSizes->ValidDataLength.QuadPart);
|
||||
|
||||
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
|
||||
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
|
||||
|
||||
/*
|
||||
* 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;
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
InitializeListHead(&FreeListHead);
|
||||
KeAcquireGuardedMutex(&ViewLock);
|
||||
KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
|
||||
if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart)
|
||||
{
|
||||
InitializeListHead(&FreeListHead);
|
||||
KeAcquireGuardedMutex(&ViewLock);
|
||||
KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
|
||||
|
||||
current_entry = Bcb->BcbSegmentListHead.Flink;
|
||||
while (current_entry != &Bcb->BcbSegmentListHead)
|
||||
{
|
||||
current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry);
|
||||
current_entry = current_entry->Flink;
|
||||
if (current->FileOffset > FileSizes->AllocationSize.QuadPart ||
|
||||
(current->FileOffset == 0 && FileSizes->AllocationSize.QuadPart == 0))
|
||||
{
|
||||
if (current->ReferenceCount == 0 || (current->ReferenceCount == 1 && current->Dirty))
|
||||
{
|
||||
RemoveEntryList(¤t->BcbSegmentListEntry);
|
||||
RemoveEntryList(¤t->CacheSegmentListEntry);
|
||||
RemoveEntryList(¤t->CacheSegmentLRUListEntry);
|
||||
if (current->Dirty)
|
||||
{
|
||||
RemoveEntryList(¤t->DirtySegmentListEntry);
|
||||
DirtyPageCount -= Bcb->CacheSegmentSize / PAGE_SIZE;
|
||||
}
|
||||
InsertHeadList(&FreeListHead, ¤t->BcbSegmentListEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("Anyone has referenced a cache segment behind the new size.\n");
|
||||
KeBugCheck(CACHE_MANAGER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Bcb->AllocationSize = FileSizes->AllocationSize;
|
||||
Bcb->FileSize = FileSizes->FileSize;
|
||||
KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
|
||||
KeReleaseGuardedMutex(&ViewLock);
|
||||
|
||||
current_entry = FreeListHead.Flink;
|
||||
while(current_entry != &FreeListHead)
|
||||
{
|
||||
current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry);
|
||||
current_entry = current_entry->Flink;
|
||||
Status = CcRosInternalFreeCacheSegment(current);
|
||||
if (!NT_SUCCESS(Status))
|
||||
current_entry = Bcb->BcbSegmentListHead.Flink;
|
||||
while (current_entry != &Bcb->BcbSegmentListHead)
|
||||
{
|
||||
DPRINT1("CcRosInternalFreeCacheSegment failed, status = %x\n", Status);
|
||||
KeBugCheck(CACHE_MANAGER);
|
||||
current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry);
|
||||
current_entry = current_entry->Flink;
|
||||
if (current->FileOffset > FileSizes->AllocationSize.QuadPart ||
|
||||
(current->FileOffset == 0 && FileSizes->AllocationSize.QuadPart == 0))
|
||||
{
|
||||
if ((current->ReferenceCount == 0) || ((current->ReferenceCount == 1) && current->Dirty))
|
||||
{
|
||||
RemoveEntryList(¤t->BcbSegmentListEntry);
|
||||
RemoveEntryList(¤t->CacheSegmentListEntry);
|
||||
RemoveEntryList(¤t->CacheSegmentLRUListEntry);
|
||||
if (current->Dirty)
|
||||
{
|
||||
RemoveEntryList(¤t->DirtySegmentListEntry);
|
||||
DirtyPageCount -= Bcb->CacheSegmentSize / PAGE_SIZE;
|
||||
}
|
||||
InsertHeadList(&FreeListHead, ¤t->BcbSegmentListEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("Anyone has referenced a cache segment behind the new size.\n");
|
||||
KeBugCheck(CACHE_MANAGER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
|
||||
Bcb->AllocationSize = FileSizes->AllocationSize;
|
||||
Bcb->FileSize = FileSizes->FileSize;
|
||||
KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
|
||||
}
|
||||
|
||||
Bcb->AllocationSize = FileSizes->AllocationSize;
|
||||
Bcb->FileSize = FileSizes->FileSize;
|
||||
KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
|
||||
KeReleaseGuardedMutex(&ViewLock);
|
||||
|
||||
current_entry = FreeListHead.Flink;
|
||||
while(current_entry != &FreeListHead)
|
||||
{
|
||||
current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry);
|
||||
current_entry = current_entry->Flink;
|
||||
Status = CcRosInternalFreeCacheSegment(current);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CcRosInternalFreeCacheSegment failed, status = %x\n", Status);
|
||||
KeBugCheck(CACHE_MANAGER);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
KeAcquireSpinLock(&Bcb->BcbLock, &oldirql);
|
||||
Bcb->AllocationSize = FileSizes->AllocationSize;
|
||||
Bcb->FileSize = FileSizes->FileSize;
|
||||
KeReleaseSpinLock(&Bcb->BcbLock, oldirql);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -222,12 +217,11 @@ CcSetFileSizes (IN PFILE_OBJECT FileObject,
|
|||
VOID
|
||||
NTAPI
|
||||
CcSetLogHandleForFile (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PVOID LogHandle,
|
||||
IN PFLUSH_TO_LSN FlushToLsnRoutine
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PVOID LogHandle,
|
||||
IN PFLUSH_TO_LSN FlushToLsnRoutine)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -236,14 +230,13 @@ CcSetLogHandleForFile (
|
|||
BOOLEAN
|
||||
NTAPI
|
||||
CcUninitializeCacheMap (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER TruncateSize OPTIONAL,
|
||||
IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER TruncateSize OPTIONAL,
|
||||
IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL)
|
||||
{
|
||||
#if 0
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
#else
|
||||
return NT_SUCCESS(CcRosReleaseFileCache(FileObject));
|
||||
#endif
|
||||
|
@ -251,18 +244,18 @@ CcUninitializeCacheMap (
|
|||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CcGetFileSizes
|
||||
(IN PFILE_OBJECT FileObject,
|
||||
IN PCC_FILE_SIZES FileSizes)
|
||||
CcGetFileSizes (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PCC_FILE_SIZES FileSizes)
|
||||
{
|
||||
PBCB Bcb;
|
||||
|
||||
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
|
||||
PBCB Bcb;
|
||||
|
||||
if (!Bcb)
|
||||
return FALSE;
|
||||
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
|
||||
|
||||
FileSizes->AllocationSize = Bcb->AllocationSize;
|
||||
FileSizes->FileSize = FileSizes->ValidDataLength = Bcb->FileSize;
|
||||
return TRUE;
|
||||
if (!Bcb)
|
||||
return FALSE;
|
||||
|
||||
FileSizes->AllocationSize = Bcb->AllocationSize;
|
||||
FileSizes->FileSize = FileSizes->ValidDataLength = Bcb->FileSize;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -20,19 +20,19 @@
|
|||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
CcMdlRead(
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
OUT PMDL * MdlChain,
|
||||
OUT PIO_STATUS_BLOCK IoStatus
|
||||
)
|
||||
CcMdlRead (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
OUT PMDL * MdlChain,
|
||||
OUT PIO_STATUS_BLOCK IoStatus
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* NAME INTERNAL
|
||||
* NAME INTERNAL
|
||||
* CcMdlReadComplete2@8
|
||||
*
|
||||
* DESCRIPTION
|
||||
|
@ -45,13 +45,14 @@ CcMdlRead(
|
|||
* None.
|
||||
*
|
||||
* NOTE
|
||||
* Used by CcMdlReadComplete@8 and FsRtl
|
||||
* Used by CcMdlReadComplete@8 and FsRtl
|
||||
*
|
||||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
CcMdlReadComplete2(IN PMDL MemoryDescriptorList,
|
||||
IN PFILE_OBJECT FileObject)
|
||||
CcMdlReadComplete2 (
|
||||
IN PMDL MemoryDescriptorList,
|
||||
IN PFILE_OBJECT FileObject)
|
||||
{
|
||||
PMDL Mdl;
|
||||
|
||||
|
@ -82,8 +83,9 @@ CcMdlReadComplete2(IN PMDL MemoryDescriptorList,
|
|||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
CcMdlReadComplete(IN PFILE_OBJECT FileObject,
|
||||
IN PMDL MdlChain)
|
||||
CcMdlReadComplete (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PMDL MdlChain)
|
||||
{
|
||||
PDEVICE_OBJECT DeviceObject = NULL;
|
||||
PFAST_IO_DISPATCH FastDispatch;
|
||||
|
@ -110,9 +112,10 @@ CcMdlReadComplete(IN PFILE_OBJECT FileObject,
|
|||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
CcMdlWriteComplete(IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN PMDL MdlChain)
|
||||
CcMdlWriteComplete (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN PMDL MdlChain)
|
||||
{
|
||||
PDEVICE_OBJECT DeviceObject = NULL;
|
||||
PFAST_IO_DISPATCH FastDispatch;
|
||||
|
@ -137,11 +140,10 @@ CcMdlWriteComplete(IN PFILE_OBJECT FileObject,
|
|||
|
||||
VOID
|
||||
NTAPI
|
||||
CcMdlWriteComplete2(
|
||||
CcMdlWriteComplete2 (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN PMDL MdlChain
|
||||
)
|
||||
IN PMDL MdlChain)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
@ -153,10 +155,9 @@ VOID
|
|||
NTAPI
|
||||
CcMdlWriteAbort (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PMDL MdlChain
|
||||
)
|
||||
IN PMDL MdlChain)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -165,12 +166,11 @@ CcMdlWriteAbort (
|
|||
VOID
|
||||
NTAPI
|
||||
CcPrepareMdlWrite (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
OUT PMDL * MdlChain,
|
||||
OUT PIO_STATUS_BLOCK IoStatus
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
OUT PMDL * MdlChain,
|
||||
OUT PIO_STATUS_BLOCK IoStatus)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -24,13 +24,13 @@ extern NPAGED_LOOKASIDE_LIST iBcbLookasideList;
|
|||
*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CcMapData(
|
||||
CcMapData (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID *pBcb,
|
||||
OUT PVOID *pBuffer)
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID *pBcb,
|
||||
OUT PVOID *pBuffer)
|
||||
{
|
||||
ULONG ReadOffset;
|
||||
BOOLEAN Valid;
|
||||
|
@ -61,14 +61,18 @@ CcMapData(
|
|||
{
|
||||
return FALSE;
|
||||
}
|
||||
ROffset = ROUND_DOWN (ReadOffset, Bcb->CacheSegmentSize);
|
||||
Status = CcRosRequestCacheSegment(Bcb, ROffset,
|
||||
pBuffer, &Valid,
|
||||
|
||||
ROffset = ROUND_DOWN(ReadOffset, Bcb->CacheSegmentSize);
|
||||
Status = CcRosRequestCacheSegment(Bcb,
|
||||
ROffset,
|
||||
pBuffer,
|
||||
&Valid,
|
||||
&CacheSeg);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!Valid)
|
||||
{
|
||||
if (!(Flags & MAP_WAIT))
|
||||
|
@ -76,10 +80,11 @@ CcMapData(
|
|||
CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(ReadCacheSegment(CacheSeg)))
|
||||
{
|
||||
CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,6 +95,7 @@ CcMapData(
|
|||
CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memset(iBcb, 0, sizeof(INTERNAL_BCB));
|
||||
iBcb->PFCB.NodeTypeCode = 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
|
||||
iBcb->PFCB.NodeByteSize = sizeof(PUBLIC_BCB);
|
||||
|
@ -99,6 +105,7 @@ CcMapData(
|
|||
iBcb->Dirty = FALSE;
|
||||
iBcb->RefCount = 1;
|
||||
*pBcb = (PVOID)iBcb;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -108,15 +115,14 @@ CcMapData(
|
|||
BOOLEAN
|
||||
NTAPI
|
||||
CcPinMappedData (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID * Bcb
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID * Bcb)
|
||||
{
|
||||
/* no-op for current implementation. */
|
||||
return TRUE;
|
||||
/* no-op for current implementation. */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -125,22 +131,21 @@ CcPinMappedData (
|
|||
BOOLEAN
|
||||
NTAPI
|
||||
CcPinRead (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID * Bcb,
|
||||
OUT PVOID * Buffer
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID * Bcb,
|
||||
OUT PVOID * Buffer)
|
||||
{
|
||||
if (CcMapData(FileObject, FileOffset, Length, Flags, Bcb, Buffer))
|
||||
{
|
||||
if (CcPinMappedData(FileObject, FileOffset, Length, Flags, Bcb))
|
||||
return TRUE;
|
||||
else
|
||||
CcUnpinData(Bcb);
|
||||
}
|
||||
return FALSE;
|
||||
if (CcMapData(FileObject, FileOffset, Length, Flags, Bcb, Buffer))
|
||||
{
|
||||
if (CcPinMappedData(FileObject, FileOffset, Length, Flags, Bcb))
|
||||
return TRUE;
|
||||
else
|
||||
CcUnpinData(Bcb);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -149,35 +154,35 @@ CcPinRead (
|
|||
BOOLEAN
|
||||
NTAPI
|
||||
CcPreparePinWrite (
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Zero,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID * Bcb,
|
||||
OUT PVOID * Buffer
|
||||
)
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PLARGE_INTEGER FileOffset,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Zero,
|
||||
IN ULONG Flags,
|
||||
OUT PVOID * Bcb,
|
||||
OUT PVOID * Buffer)
|
||||
{
|
||||
/*
|
||||
* 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, Flags, Bcb, Buffer);
|
||||
/*
|
||||
* 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, Flags, Bcb, Buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID NTAPI
|
||||
CcSetDirtyPinnedData (IN PVOID Bcb,
|
||||
IN PLARGE_INTEGER Lsn)
|
||||
CcSetDirtyPinnedData (
|
||||
IN PVOID Bcb,
|
||||
IN PLARGE_INTEGER Lsn)
|
||||
{
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
iBcb->Dirty = TRUE;
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
iBcb->Dirty = TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -185,15 +190,20 @@ CcSetDirtyPinnedData (IN PVOID Bcb,
|
|||
* @implemented
|
||||
*/
|
||||
VOID NTAPI
|
||||
CcUnpinData (IN PVOID Bcb)
|
||||
CcUnpinData (
|
||||
IN PVOID Bcb)
|
||||
{
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
|
||||
iBcb->Dirty, FALSE);
|
||||
if (--iBcb->RefCount == 0)
|
||||
{
|
||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||
}
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
|
||||
CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb,
|
||||
iBcb->CacheSegment,
|
||||
TRUE,
|
||||
iBcb->Dirty,
|
||||
FALSE);
|
||||
if (--iBcb->RefCount == 0)
|
||||
{
|
||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -202,11 +212,10 @@ CcUnpinData (IN PVOID Bcb)
|
|||
VOID
|
||||
NTAPI
|
||||
CcUnpinDataForThread (
|
||||
IN PVOID Bcb,
|
||||
IN ERESOURCE_THREAD ResourceThreadId
|
||||
)
|
||||
IN PVOID Bcb,
|
||||
IN ERESOURCE_THREAD ResourceThreadId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -215,11 +224,10 @@ CcUnpinDataForThread (
|
|||
VOID
|
||||
NTAPI
|
||||
CcRepinBcb (
|
||||
IN PVOID Bcb
|
||||
)
|
||||
IN PVOID Bcb)
|
||||
{
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
iBcb->RefCount++;
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
iBcb->RefCount++;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -228,38 +236,37 @@ CcRepinBcb (
|
|||
VOID
|
||||
NTAPI
|
||||
CcUnpinRepinnedBcb (
|
||||
IN PVOID Bcb,
|
||||
IN BOOLEAN WriteThrough,
|
||||
IN PIO_STATUS_BLOCK IoStatus
|
||||
)
|
||||
IN PVOID Bcb,
|
||||
IN BOOLEAN WriteThrough,
|
||||
IN PIO_STATUS_BLOCK IoStatus)
|
||||
{
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
PINTERNAL_BCB iBcb = Bcb;
|
||||
|
||||
if (--iBcb->RefCount == 0)
|
||||
if (--iBcb->RefCount == 0)
|
||||
{
|
||||
IoStatus->Information = 0;
|
||||
if (WriteThrough)
|
||||
IoStatus->Information = 0;
|
||||
if (WriteThrough)
|
||||
{
|
||||
KeWaitForSingleObject(&iBcb->CacheSegment->Mutex,
|
||||
Executive,
|
||||
KernelMode,
|
||||
FALSE,
|
||||
NULL);
|
||||
if (iBcb->CacheSegment->Dirty)
|
||||
if (iBcb->CacheSegment->Dirty)
|
||||
{
|
||||
IoStatus->Status = CcRosFlushCacheSegment(iBcb->CacheSegment);
|
||||
IoStatus->Status = CcRosFlushCacheSegment(iBcb->CacheSegment);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
IoStatus->Status = STATUS_SUCCESS;
|
||||
IoStatus->Status = STATUS_SUCCESS;
|
||||
}
|
||||
KeReleaseMutex(&iBcb->CacheSegment->Mutex, 0);
|
||||
KeReleaseMutex(&iBcb->CacheSegment->Mutex, 0);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
IoStatus->Status = STATUS_SUCCESS;
|
||||
IoStatus->Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue