CcPurgeAndClearCacheSection
NTSTATUS __stdcall CcPurgeAndClearCacheSection(
_SHARED_CACHE_MAP *SharedCacheMap,
_LARGE_INTEGER *FileOffset,
UINT64 a3){
_LARGE_INTEGER *p_FileOffseta;
_KEVENT *v5;
_FILE_OBJECT *v6;
INT8 v7;
NTSTATUS result;
_LARGE_INTEGER v9;
size_t v10;
_SHARED_CACHE_MAP *v11;
_KEVENT *v12;
UINT64 RequestHighPriorityMapping;
UINT64 PerformingReadAhead;
UINT64 ReceivedLength;
_LARGE_INTEGER FileOffseta;
_VACB *Vacb[2];
UINT64 VirtualAddress;
_IO_STATUS_BLOCK IoStatus;
p_FileOffseta = FileOffset;
FileOffseta.QuadPart = 0i64;
IoStatus = 0i64;
Vacb[0] = 0i64;
if( (*((_DWORD *)SharedCacheMap + 38) & 0x2000) != 0 )
{
if( ((unsigned __int8)FileOffset & 1) == 0 )
return -1073740747;
p_FileOffseta = (_LARGE_INTEGER *)((unsigned __int64)FileOffset ^ 1);
}
v6 = CcReferenceSharedCacheMapFileObject(SharedCacheMap);
Vacb[1] = (_VACB *)v6;
if( (p_FileOffseta->anonymous_0.LowPart & 0xFFF) == 0 )
goto LABEL_3;
v9 = *p_FileOffseta;
FileOffseta = *p_FileOffseta;
p_FileOffseta = &FileOffseta;
if( *((_QWORD *)SharedCacheMap + 21) && *((_QWORD *)SharedCacheMap + 11) )
{
v10 = 4096 - (v9.anonymous_0.LowPart & 0xFFF);
LODWORD(PerformingReadAhead) = 0;
LODWORD(RequestHighPriorityMapping) = 1;
VirtualAddress = (UINT64)CcGetVirtualAddress(
SharedCacheMap,
v9,
Vacb,
&ReceivedLength,
RequestHighPriorityMapping,
PerformingReadAhead);
memset((VOID *)VirtualAddress, 0i64, v10);
if( v9.QuadPart > *((_QWORD *)SharedCacheMap + 6) )
{
MmSetAddressRangeModifiedEx(VirtualAddress, 1i64);
CcUpdateSharedCacheMapFlag(SharedCacheMap, 0x20000ui64, 1u);
}
else
{
CcSetDirtyInMask(SharedCacheMap, &FileOffseta, v10, 0i64);
}
FileOffseta.QuadPart = v10 + v9.QuadPart;
v11 = Vacb[0]->SharedCacheMap;
if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)&Vacb[0]->Overlay) )
{
v12 = (_KEVENT *)*((_QWORD *)v11 + 23);
if( v12 )
KeSetEvent(v12, 0, 0);
_InterlockedDecrement((volatile signed __int32 *)v11 + 136);
}
goto LABEL_3;
}
LODWORD(PerformingReadAhead) = 0;
MmFlushSection(v6->SectionObjectPointer, &FileOffseta, 1ui64, v5, &IoStatus, PerformingReadAhead);
result = IoStatus.Status;
if( IoStatus.Status >= 0 )
{
LABEL_3:
v7 = CcPurgeCacheSection((INT64 *)v6->SectionObjectPointer, (UINT64)p_FileOffseta, 0i64, 0);
CcDereferenceSharedCacheMapFileObject(SharedCacheMap, v6);
return v7 == 0 ? 0xC0000435 : 0;
}
return result;
}Referenced by:
CcSetFileSizesEx