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