CcMapAndCopyFromCache
UINT8 __stdcall CcMapAndCopyFromCache(
_FILE_OBJECT *FileObject,
_LARGE_INTEGER FileOffset,
UINT64 Length,
UINT8 Wait,
VOID *Buffer,
UINT64 *FaultedData,
UINT64 PagePriority,
VOID *DiskIoAttribution){
char v9;
unsigned int v10;
_LARGE_INTEGER v11;
int v12;
_SHARED_CACHE_MAP *SharedCacheMap;
char *v14;
VOID *VirtualAddress;
_VACB *v16;
VOID *v17;
unsigned int v18;
UINT64 RequestHighPriorityMapping;
UINT64 PerformingReadAhead;
UINT64 v22;
VOID *SystemCacheBuffer;
_VACB *Vacb;
_LARGE_INTEGER FileOffseta;
UINT64 ReceivedLength;
UINT8 v27;
v27 = Wait;
FileOffseta = FileOffset;
v9 = Wait;
v10 = Length;
Vacb = 0i64;
v11 = FileOffset;
v12 = 0;
SharedCacheMap = (_SHARED_CACHE_MAP *)FileObject->SectionObjectPointer->SharedCacheMap;
if( !(_DWORD)Length )
goto LABEL_14;
v14 = (char *)Buffer;
while( 1 )
{
LODWORD(ReceivedLength) = 0;
LODWORD(PerformingReadAhead) = v14 == 0i64;
LODWORD(RequestHighPriorityMapping) = 0;
VirtualAddress = CcGetVirtualAddress(
SharedCacheMap,
v11,
&Vacb,
&ReceivedLength,
RequestHighPriorityMapping,
PerformingReadAhead);
v16 = Vacb;
v17 = VirtualAddress;
SystemCacheBuffer = VirtualAddress;
if( (*((_DWORD *)SharedCacheMap + 38) & 8) != 0 )
break;
LODWORD(v22) = PagePriority;
if( !CcFetchDataForRead(FileObject, &FileOffseta, v10, v9, FaultedData, Vacb, v22, DiskIoAttribution) )
goto LABEL_18;
v17 = SystemCacheBuffer;
LABEL_6:
v18 = ReceivedLength;
v11.QuadPart += (unsigned int)ReceivedLength;
if( (unsigned int)ReceivedLength > v10 )
v18 = v10;
if( v14 )
{
v12 = CcCopyBytesToUserBuffer(v14, v17, v18);
if( v12 < 0 )
goto LABEL_19;
v14 += v18;
}
CcFreeVirtualAddress(v16);
FileOffseta = v11;
Vacb = 0i64;
v10 -= v18;
if( !v10 )
goto LABEL_12;
v9 = v27;
}
if( v9 )
goto LABEL_6;
v16 = Vacb;
LABEL_18:
v12 = -1073741608;
LABEL_19:
if( v16 )
CcFreeVirtualAddress(v16);
LABEL_12:
if( v12 == -1073741608 )
return 0;
if( v12 < 0 )
{
CcUpdateSharedCacheMapFlag(SharedCacheMap, 8ui64, 1u);
RtlRaiseStatus(v12);
}
LABEL_14:
if( (*((_DWORD *)SharedCacheMap + 38) & 8) != 0 )
CcUpdateSharedCacheMapFlag(SharedCacheMap, 8ui64, 0);
return 1;
}Referenced by:
CcCompleteAsyncRead
CcCopyReadEx
CcPerformReadAhead