PfpPrefetchDirectoryStream

INT64 __fastcall PfpPrefetchDirectoryStream(UINT64 *a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
  __int64 v6; 
  unsigned int *Src; 
  UINT64 v10; 
  unsigned __int64 v11; 
  unsigned int v12; 
  UINT64 v13; 
  int v14; 
  unsigned int v15; 
  unsigned int v16; 
  unsigned int v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  int v22; 
  UINT64 v24; 
  size_t Size; 
  SIZE_T Length; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29[2]; 
  int v30[2]; 
  __int128 v31; 
  __int64 v32; 
  unsigned int SublistMax; 
  v6 = a1[5];
  Src = (unsigned int *)a1[3];
  *(_OWORD *)v29 = 0i64;
  v32 = 0x200000000i64;
  v10 = *a1;
  v11 = 0i64;
  v28 = v6;
  *(_QWORD *)v30 = 0i64;
  v12 = *(unsigned __int16 *)(v10 + 30);
  *Src = 4;
  v13 = *a1;
  SublistMax = v12;
  v31 = 0i64;
  *((_QWORD *)Src + 1) = (8 * (v12 & 7)) | (unsigned __int64)(*(_DWORD *)(v13 + 28) & 7);
  v14 = PfpOpenHandleCreate((__int64)v30, v6, *(_QWORD *)(a5 + 16), *(_QWORD *)(a5 + 8), 1048577, a6, 0, a2);
  if( v14 >= 0 )
  {
    if( (*(_DWORD *)(*a1 + 80) & 4) != 0 )
      MmQueryMemoryListInformation((PVOID)0xFFFFFFFFFFFFFFFFi64, (UINT64)(a1 + 6), (UINT64 *)0xB0);
    v15 = 0;
    while( v15 < *(_DWORD *)(a3 + 16) )
    {
      Src[1] = 0;
      if( v15 >= *(_DWORD *)(a3 + 16) )
        break;
      v16 = *((_DWORD *)a1 + 8);
      v17 = 0;
      do
      {
        v18 = *(_QWORD *)(a3 + 24);
        v19 = *(_QWORD *)(v18 + 16i64 * v15);
        v20 = v11;
        v21 = v19 + *(unsigned int *)(v18 + 16i64 * v15 + 8);
        if( v19 >= v11 )
          v20 = *(_QWORD *)(v18 + 16i64 * v15);
        while( v20 < v21 )
        {
          *(_QWORD *)&Src[2 * Src[1] + 4] = v20;
          v20 += 4096i64;
          v17 = Src[1] + 1;
          Src[1] = v17;
          v16 = *((_DWORD *)a1 + 8);
          if( v17 >= v16 )
          {
            v11 = v20;
            break;
          }
        }
        if( v17 >= v16 )
          break;
        ++v15;
      }
      while( v15 < *(_DWORD *)(a3 + 16) );
      if( !v17 )
        break;
      if( PfpCheckPrefetchAbort(a1)
        || (*(_DWORD *)(*a1 + 80) & 4) != 0 && a1[6] + a1[7] + PfpGetPageListCount(a1 + 11, 0i64, SublistMax) < 0x80 )
      {
        v14 = -1073741248;
        goto LABEL_24;
      }
      LOBYTE(v27) = 0;
      LODWORD(Length) = 0;
      LODWORD(Size) = 8 * v22 + 16;
      LODWORD(v24) = 590112;
      v14 = IopXxxControlFile(*(void **)v30, 0i64, 0i64, 0i64, (__int64)v29, v24, Src, Size, 0i64, Length, v27);
      if( (*(_DWORD *)(*a1 + 80) & 4) != 0 )
        PfpUpdateRepurposedByPrefetch((_SYSTEM_MEMORY_LIST_INFORMATION *)(a1 + 6), Src[1]);
      if( v14 < 0 )
      {
        if( v14 == -1073741807 )
          break;
        goto LABEL_24;
      }
      if( v14 == 259 )
        KeBugCheckEx(0x191u, 0x14BCui64, 0i64, 0i64, 0i64);
    }
    v14 = 0;
LABEL_24:
    v6 = v28;
  }
  if( (v32 & 0x400000000i64) != 0 )
    PfpOpenHandleClose(v30, v6);
  return(unsigned int)v14;
}

Referenced by:

PfpVolumePrefetchMetadata