CcSetFileSizesEx
NTSTATUS __stdcall CcSetFileSizesEx(_FILE_OBJECT *FileObject, _CC_FILE_SIZES *FileSizes){
LARGE_INTEGER AllocationSize;
LARGE_INTEGER ValidDataLength;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
char v6;
_LARGE_INTEGER *SharedCacheMap;
UINT64 v8;
UINT8 v9;
unsigned __int64 *v10;
_LARGE_INTEGER v11;
NTSTATUS v12;
NTSTATUS result;
UINT64 v14;
VOID *QuadPart;
NTSTATUS v16;
NTSTATUS v17;
NTSTATUS v18;
UINT64 v19;
UINT8 v20;
_KEVENT *v21;
char v22;
UINT64 v23;
_IO_STATUS_BLOCK IoStatus;
_KLOCK_QUEUE_HANDLE v25;
_KLOCK_QUEUE_HANDLE LockHandle;
_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(&v25, 0, sizeof(v25));
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
SectionObjectPointer = FileObject->SectionObjectPointer;
v6 = 1;
SharedCacheMap = (_LARGE_INTEGER *)SectionObjectPointer->SharedCacheMap;
if( SharedCacheMap && SharedCacheMap[21].QuadPart )
{
SpinLock = (PKSPIN_LOCK)((char *)CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap) + 128);
KeAcquireInStackQueuedSpinLock(SpinLock, &v25);
if( AllocationSize.QuadPart <= SharedCacheMap[4].QuadPart )
goto LABEL_4;
++SharedCacheMap->anonymous_0.HighPart;
++SharedCacheMap[67].anonymous_0.LowPart;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
__writecr8(v25.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
NewSectionSize += 0xFFFFFi64;
QuadPart = (VOID *)SharedCacheMap[21].QuadPart;
LODWORD(NewSectionSize) = NewSectionSize & 0xFFF00000;
v6 = 0;
v16 = MmExtendSection(QuadPart, &NewSectionSize, 1ui64);
v17 = v16;
if( v16 < 0 )
{
FsRtlIsNtstatusExpected((unsigned int)v16);
if( !v22 )
v17 = -1073741588;
}
else
{
CcExtendVacbArray((_SHARED_CACHE_MAP *)SharedCacheMap, (_LARGE_INTEGER)NewSectionSize);
v17 = v18;
}
KeAcquireInStackQueuedSpinLock(SpinLock, &v25);
CcDecrementOpenCount((_SHARED_CACHE_MAP *)SharedCacheMap, v19, v20);
if( v17 < 0 )
{
KeReleaseInStackQueuedSpinLock(&v25);
RtlRaiseStatus(v17);
}
SharedCacheMap = (_LARGE_INTEGER *)FileObject->SectionObjectPointer->SharedCacheMap;
if( SharedCacheMap )
{
LABEL_4:
++SharedCacheMap->anonymous_0.HighPart;
++SharedCacheMap[67].anonymous_0.LowPart;
if( v6 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
__writecr8(v25.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v10 = SpinLock;
KeAcquireInStackQueuedSpinLock(SpinLock, &v25);
}
else
{
v10 = SpinLock;
}
v11 = SharedCacheMap[5];
if( v11.QuadPart != 0x7FFFFFFFFFFFFFFFi64 )
{
if( FileOffset.QuadPart < v11.QuadPart )
SharedCacheMap[5] = FileOffset;
SharedCacheMap[6] = ValidDataLength;
}
v12 = 0;
if( FileOffset.QuadPart < SharedCacheMap[1].QuadPart && (SharedCacheMap[19].anonymous_0.LowPart & 4) == 0 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
__writecr8(v25.OldIrql);
v12 = 0;
if( CcUnmapVacbArray((_SHARED_CACHE_MAP *)SharedCacheMap, &FileOffset, 0i64, 0, 0) )
{
if( !FileOffset.QuadPart )
{
if( SharedCacheMap[20].QuadPart )
CcDeleteMbcb((_SHARED_CACHE_MAP *)SharedCacheMap);
if( (_LARGE_INTEGER *)SharedCacheMap[2].QuadPart != &SharedCacheMap[2] )
CcDeleteBcbs((_SHARED_CACHE_MAP *)SharedCacheMap);
}
v12 = CcPurgeAndClearCacheSection((_SHARED_CACHE_MAP *)SharedCacheMap, &FileOffset, v14);
}
KeAcquireInStackQueuedSpinLock(v10, &v25);
}
SharedCacheMap[1] = FileOffset;
CcDecrementOpenCount((_SHARED_CACHE_MAP *)SharedCacheMap, v8, v9);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
__writecr8(v25.OldIrql);
return v12;
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
__writecr8(v25.OldIrql);
return 0;
}
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( (FileOffset.anonymous_0.LowPart & 0xFFF) == 0 )
return CcPurgeCacheSection((INT64 *)FileObject->SectionObjectPointer, (UINT64)&FileOffset, 0i64, 0) == 0 ? 0xC0000435 : 0;
LODWORD(v23) = 0;
MmFlushSection(FileObject->SectionObjectPointer, &FileOffset, 1ui64, v21, &IoStatus, v23);
result = IoStatus.Status;
if( IoStatus.Status >= 0 )
return CcPurgeCacheSection((INT64 *)FileObject->SectionObjectPointer, (UINT64)&FileOffset, 0i64, 0) == 0 ? 0xC0000435 : 0;
}
return result;
}Referenced by:
CcSetFileSizes