CcMapDataForOverwrite
VOID __stdcall CcMapDataForOverwrite(
_FILE_OBJECT *FileObject,
_LARGE_INTEGER *FileOffset,
UINT64 Length,
VOID **Bcb,
VOID **Buffer){
unsigned int v5;
_ETHREAD *CurrentThread;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
_DWORD *SharedCacheMap;
unsigned int v10;
VOID **v11;
char *v12;
unsigned int v13;
int v14;
unsigned __int64 *Partition;
unsigned int v16;
VOID *v17;
char *v18;
_ETHREAD *v19;
_KLOCK_QUEUE_HANDLE LockHandle;
UINT8 ReturnResult;
VOID **v23;
v23 = Bcb;
v5 = Length;
v17 = 0i64;
v16 = ((unsigned int)Length + 4095i64 + (unsigned __int64)(FileOffset->anonymous_0.LowPart & 0xFFF)) >> 12;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v19 = CurrentThread;
ReturnResult = 1;
memset(&LockHandle, 0, sizeof(LockHandle));
SectionObjectPointer = FileObject->SectionObjectPointer;
SharedCacheMap = SectionObjectPointer->SharedCacheMap;
if( (SharedCacheMap[38] & 0x20000) == 0 )
{
Partition = (unsigned __int64 *)CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap);
KeAcquireInStackQueuedSpinLock(Partition + 16, &LockHandle);
SharedCacheMap[38] |= 0x20000u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
v10 = CurrentThread->CacheManagerActive + 4 * CurrentThread->ReadClusterSize;
v11 = Buffer;
CcMapDataCommon(FileObject, FileOffset, v5, 1ui64, &v17, Buffer);
v12 = (char *)*v11;
v18 = v12;
v13 = v16;
while( v13 )
{
ReturnResult = 1;
CurrentThread->CacheManagerActive = 1;
if( --v13 > CurrentThread->ReadClusterSize )
{
v14 = v13;
if( v13 > 0xF )
v14 = 15;
CurrentThread->ReadClusterSize = v14;
}
MmCheckCachedPageStates(v12, 1ui64, 5ui64, &ReturnResult);
if( !ReturnResult )
MmCheckCachedPageStates(v12, 1ui64, 4ui64, 0i64);
v12 += 4096;
v18 = v12;
}
CurrentThread->CacheManagerActive = v10 & 3;
CurrentThread->ReadClusterSize = v10 >> 2;
__addgsdword(0x8150u, KeGetCurrentThread()[1].Timer.DueTime.HighPart);
*v23 = v17;
}Referenced by:
CcPreparePinWrite