PfpVolumePrefetchMetadata

NTSTATUS __stdcall PfpVolumePrefetchMetadata(PFP_PREFETCH_CONTEXT *PrefetchContext, UINT64 VolumeIndex){
  __int64 v3; 
  __int64 v4; 
  UINT64 InputBufferLength; 
  __int64 v6; 
  __int64 v7; 
  unsigned int v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  _DWORD *v16; 
  int v17; 
  NTSTATUS result; 
  INT64 v19; 
  NTSTATUS v20; 
  unsigned __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  UINT64 v30; 
  __int64 v31; 
  UINT64 IoControlCode; 
  INT64 IoControlCodea; 
  __int64 v34; 
  __int64 v35; 
  int v36; 
  UINT64 v37[2]; 
  __int128 v38; 
  INT64 a5[2]; 
  __int128 v40; 
  __int128 v41; 
  unsigned int SublistMax; 
  unsigned int v43; 
  INT64 a6; 
  int v45; 

  v43 = VolumeIndex;
  LODWORD(a6) = 0;
  v45 = 0;
  *(_OWORD *)v37 = 0i64;
  v35 = (unsigned int)VolumeIndex;
  v38 = 0i64;
  v3 = 0i64;
  v4 = 5i64 * (unsigned int)VolumeIndex;
  InputBufferLength = *((_QWORD *)PrefetchContext + 3);
  v6 = *(_QWORD *)PrefetchContext;
  *(_OWORD *)a5 = 0i64;
  v40 = 0i64;
  v7 = *(_QWORD *)(v6 + 32);
  v34 = 0i64;
  v36 = ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
      + ((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
  v8 = *(unsigned __int16 *)(v6 + 30);
  *(_DWORD *)InputBufferLength = 3;
  v9 = *(_QWORD *)PrefetchContext;
  v41 = 0i64;
  SublistMax = v8;
  *(_QWORD *)(InputBufferLength + 8) = (8 * (v8 & 7)) | (unsigned __int64)(*(_DWORD *)(v9 + 28) & 7);
  if( (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0 )
    MmQueryMemoryListInformation((VOID *)0xFFFFFFFFFFFFFFFFi64, (UINT64)(PrefetchContext + 12), (UINT64 *)0xB0);
  v10 = 0i64;
  if( (*(_DWORD *)(v7 + 8 * v4 + 12) & 0xFFFFFFFE) != 0 )
  {
    do
    {
      *(_DWORD *)(InputBufferLength + 4) = 0;
      if( (unsigned int)v10 >= *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 )
        break;
      do
      {
        v11 = *(unsigned int *)(InputBufferLength + 4);
        v12 = 48 * v10;
        v10 = (unsigned int)(v10 + 1);
        v13 = *(_QWORD *)(v7 + 8 * v4 + 16) + v12;
        v14 = *(_QWORD *)(v13 + 8);
        if( (*(_BYTE *)v13 & 0x10) != 0 )
          v3 = v13;
        if( v14 )
        {
          *(_QWORD *)(InputBufferLength + 8 * v11 + 16) = v14;
          LODWORD(v11) = *(_DWORD *)(InputBufferLength + 4) + 1;
          *(_DWORD *)(InputBufferLength + 4) = v11;
          if( (unsigned int)v11 >= PrefetchContext[8] )
            break;
        }
      }
      while( (unsigned int)v10 < *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 );
      v34 = v3;
      if( !(_DWORD)v11 )
        break;
      if( (unsigned int)PfpCheckPrefetchAbort(PrefetchContext)
        || (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0
        && *((_QWORD *)PrefetchContext + 6)
         + *((_QWORD *)PrefetchContext + 7)
         + PfpGetPageListCount((UINT64 *)PrefetchContext + 11, 0i64, v30) < 0x80 )
      {
LABEL_52:
        v17 = -1073741248;
        goto LABEL_15;
      }
      LODWORD(IoControlCode) = 590112;
      v17 = IopXxxControlFile(
              *(VOID **)((v31 << 6) + *((_QWORD *)PrefetchContext + 2)),
              0i64,
              0i64,
              0i64,
              v37,
              IoControlCode,
              InputBufferLength);
      if( (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0 )
        PfpUpdateRepurposedByPrefetch((__int64)(PrefetchContext + 12), *(unsigned int *)(InputBufferLength + 4));
      if( v17 < 0 )
        goto LABEL_15;
      if( v17 == 259 )
        KeBugCheckEx(0x191u, (PVOID)0x15FB, 0i64, 0i64, 0i64);
      v3 = v34;
    }
    while( (unsigned int)v10 < *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 );
    if( v3 )
    {
      v21 = 0i64;
      v22 = 0;
      ++*(_DWORD *)(*(_QWORD *)PrefetchContext + 88i64);
      if( *(_DWORD *)(v3 + 16) )
      {
        do
        {
          *(_DWORD *)(InputBufferLength + 4) = 0;
          if( v22 >= *(_DWORD *)(v3 + 16) )
            break;
          v23 = PrefetchContext[8];
          v24 = 0;
          do
          {
            v25 = *(_QWORD *)(v3 + 24);
            v26 = v21;
            v27 = *(_QWORD *)(v25 + 16i64 * v22);
            v28 = v27 + *(unsigned int *)(v25 + 16i64 * v22 + 8);
            if( v27 >= v21 )
              v26 = *(_QWORD *)(v25 + 16i64 * v22);
            while( v26 < v28 )
            {
              v29 = v26 >> 10;
              v26 += 4096i64;
              *(_QWORD *)(InputBufferLength + 8i64 * *(unsigned int *)(InputBufferLength + 4) + 16) = v29;
              v24 = *(_DWORD *)(InputBufferLength + 4) + 1;
              *(_DWORD *)(InputBufferLength + 4) = v24;
              v23 = PrefetchContext[8];
              if( v24 >= v23 )
              {
                v21 = v26;
                break;
              }
            }
            if( v24 >= v23 )
              break;
            ++v22;
          }
          while( v22 < *(_DWORD *)(v3 + 16) );
          if( !v24 )
            break;
          if( (unsigned int)PfpCheckPrefetchAbort(PrefetchContext)
            || (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0
            && *((_QWORD *)PrefetchContext + 6)
             + *((_QWORD *)PrefetchContext + 7)
             + PfpGetPageListCount((UINT64 *)PrefetchContext + 11, 0i64, SublistMax) < 0x80 )
          {
            goto LABEL_52;
          }
          LODWORD(IoControlCode) = 590112;
          v17 = IopXxxControlFile(
                  *(VOID **)((v35 << 6) + *((_QWORD *)PrefetchContext + 2)),
                  0i64,
                  0i64,
                  0i64,
                  v37,
                  IoControlCode,
                  InputBufferLength);
          if( (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0 )
            PfpUpdateRepurposedByPrefetch((__int64)(PrefetchContext + 12), *(unsigned int *)(InputBufferLength + 4));
          if( v17 < 0 )
            goto LABEL_15;
          if( v17 == 259 )
            KeBugCheckEx(0x191u, (PVOID)0x1660, 0i64, 0i64, 0i64);
          v3 = v34;
        }
        while( v22 < *(_DWORD *)(v34 + 16) );
      }
    }
  }
  v15 = 0i64;
  if( (*(_DWORD *)(v7 + 8 * v4 + 12) & 0xFFFFFFFE) != 0 )
  {
    do
    {
      v16 = (_DWORD *)(*(_QWORD *)(v7 + 8 * v4 + 16) + 48 * v15);
      if( (*v16 & 2) != 0 )
      {
        PfpFileSetupObjectAttributes((__int64)PrefetchContext, (__int64)v16, v43, (__int64)&v38, (__int64)a5, &a6);
        LODWORD(IoControlCodea) = a6;
        v20 = PfpPrefetchDirectoryStream(
                PrefetchContext,
                *((_QWORD *)PrefetchContext + 2) + (v35 << 6),
                (INT64)v16,
                v19,
                (INT64)a5,
                IoControlCodea);
        v17 = v20;
        if( v20 < 0 )
        {
          if( v20 == -1073741248 )
            goto LABEL_15;
        }
        else
        {
          ++*(_DWORD *)(*(_QWORD *)PrefetchContext + 88i64);
        }
      }
      v15 = (unsigned int)(v15 + 1);
    }
    while( (unsigned int)v15 < *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 );
  }
  v17 = 0;
LABEL_15:
  result = v17;
  *(_DWORD *)(*(_QWORD *)PrefetchContext + 108i64) += ((KUSER_SHARED_DATA.TickCountMultiplier
                                                      * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
                                                    + ((KUSER_SHARED_DATA.TickCount.LowPart
                                                      * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
                                                    - v36;
  return result;
}

Referenced by:

PfpPrefetchRequestPerform