CcSetFileSizesEx
INT64 __fastcall CcSetFileSizesEx(FILE_OBJECT *FileObject, CC_FILE_SIZES *FileSizes){
LARGE_INTEGER AllocationSize;
LARGE_INTEGER ValidDataLength;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
char v6;
_SHARED_CACHE_MAP *SharedCacheMap;
UINT64 *v8;
union _LARGE_INTEGER v9;
unsigned int v10;
INT64 result;
SINGLE_LIST_ENTRY *v12;
SINGLE_LIST_ENTRY *v13;
char v14;
void *Section;
NTSTATUS v16;
NTSTATUS v17;
NTSTATUS v18;
_KEVENT *v19;
char v20;
UINT64 v21;
_IO_STATUS_BLOCK IoStatus;
KLOCK_QUEUE_HANDLE v23;
struct _KLOCK_QUEUE_HANDLE LockHandle;
union _LARGE_INTEGER FileOffset;
UINT64 NewSectionSize;
PKSPIN_LOCK SpinLock;
AllocationSize = FileSizes->AllocationSize;
ValidDataLength = FileSizes->ValidDataLength;
FileOffset = FileSizes->FileSize;
IoStatus = 0i64;
NewSectionSize = AllocationSize.QuadPart;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v23, 0, sizeof(v23));
KeAcquireInStackQueuedSpinLock(&CcMasterLock, &LockHandle);
SectionObjectPointer = FileObject->SectionObjectPointer;
v6 = 1;
SharedCacheMap = (_SHARED_CACHE_MAP *)SectionObjectPointer->SharedCacheMap;
if( SharedCacheMap && SharedCacheMap->Section )
{
SpinLock = (PKSPIN_LOCK)(CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap) + 128);
KeAcquireInStackQueuedSpinLock(SpinLock, &v23);
if( AllocationSize.QuadPart <= SharedCacheMap->SectionSize.QuadPart )
goto LABEL_4;
++SharedCacheMap->OpenCount;
++SharedCacheMap->InternalRefCount;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
NewSectionSize += 0xFFFFFi64;
Section = SharedCacheMap->Section;
LODWORD(NewSectionSize) = NewSectionSize & 0xFFF00000;
v6 = 0;
v16 = MmExtendSection(Section, &NewSectionSize, 1ui64);
v17 = v16;
if( v16 < 0 )
{
FsRtlIsNtstatusExpected((unsigned int)v16);
if( !v20 )
v17 = -1073741588;
}
else
{
CcExtendVacbArray(SharedCacheMap, (_LARGE_INTEGER)NewSectionSize);
v17 = v18;
}
KeAcquireInStackQueuedSpinLock(SpinLock, &v23);
CcDecrementOpenCount((INT64)SharedCacheMap);
if( v17 < 0 )
{
KeReleaseInStackQueuedSpinLock(&v23);
RtlRaiseStatus(v17);
}
SharedCacheMap = (_SHARED_CACHE_MAP *)FileObject->SectionObjectPointer->SharedCacheMap;
if( SharedCacheMap )
{
LABEL_4:
++SharedCacheMap->OpenCount;
++SharedCacheMap->InternalRefCount;
if( v6 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v8 = SpinLock;
KeAcquireInStackQueuedSpinLock(SpinLock, &v23);
}
else
{
v8 = SpinLock;
}
v9 = SharedCacheMap->ValidDataLength;
if( v9.QuadPart != 0x7FFFFFFFFFFFFFFFi64 )
{
if( FileOffset.QuadPart < v9.QuadPart )
SharedCacheMap->ValidDataLength = FileOffset;
SharedCacheMap->ValidDataGoal = ValidDataLength;
}
v10 = 0;
if( FileOffset.QuadPart < SharedCacheMap->FileSize.QuadPart && (SharedCacheMap->Flags & 4) == 0 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
v10 = 0;
CcUnmapVacbArray(SharedCacheMap, &FileOffset, 0i64, 0, 0);
if( v14 )
{
if( !FileOffset.QuadPart )
{
if( SharedCacheMap->Mbcb )
CcDeleteMbcb((SINGLE_LIST_ENTRY *)SharedCacheMap, v12, v13);
if( SharedCacheMap->BcbList.Flink != &SharedCacheMap->BcbList )
CcDeleteBcbs((INT64)SharedCacheMap);
}
v10 = CcPurgeAndClearCacheSection((INT64)SharedCacheMap, &FileOffset);
}
KeAcquireInStackQueuedSpinLock(v8, &v23);
}
SharedCacheMap->FileSize = FileOffset;
CcDecrementOpenCount((INT64)SharedCacheMap);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
return v10;
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
return 0i64;
}
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( (FileOffset.LowPart & 0xFFF) == 0 )
return CcPurgeCacheSection(FileObject->SectionObjectPointer, &FileOffset, 0i64, 0i64) == 0 ? 0xC0000435 : 0;
LODWORD(v21) = 0;
MmFlushSection(FileObject->SectionObjectPointer, &FileOffset, 1ui64, v19, &IoStatus, v21);
result = (unsigned int)IoStatus.Status;
if( IoStatus.Status >= 0 )
return CcPurgeCacheSection(FileObject->SectionObjectPointer, &FileOffset, 0i64, 0i64) == 0 ? 0xC0000435 : 0;
}
return result;
}Referenced by:
CcSetFileSizes