PfSnPrefetchMetadata

__int64 __fastcall PfSnPrefetchMetadata(__int64 a1, INT64 a2, EVENT_DESCRIPTOR *r8_0){
  INT64 v3; 
  int v4; 
  unsigned int v6; 
  NTSTATUS v7; 
  __int64 v8; 
  __int64 v9; 
  LIST_ENTRY *v10; 
  unsigned int *v11; 
  LIST_ENTRY *PrefetchVolumeInfoInList; 
  LIST_ENTRY *v13; 
  _DWORD *v14; 
  unsigned int i; 
  WCHAR v16; 
  UINT64 v17; 
  int v18; 
  int v19; 
  unsigned int v20; 
  _QWORD *v21; 
  unsigned int v22; 
  _LIST_ENTRY *Flink; 
  unsigned int v24; 
  unsigned int v25; 
  unsigned int *v26; 
  UINT64 v27; 
  unsigned int v29; 
  INT64 v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  INT64 a4[2]; 
  __int64 v35; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  UINT64 a3; 
  INT64 v38; 
  __int64 v39; 
  struct _UNICODE_STRING DestinationString; 
  unsigned int v41; 
  unsigned int v42; 
  int v43; 
  void *EventHandle; 
  v42 = a2;
  v3 = *(_QWORD *)a1;
  v4 = 0;
  *(&ObjectAttributes.Length + 1) = 0;
  *(&ObjectAttributes.Attributes + 1) = 0;
  v38 = v3;
  EventHandle = 0i64;
  v35 = 0i64;
  LOBYTE(r8_0) = 1;
  v6 = a2;
  DestinationString = 0i64;
  *(_OWORD *)a4 = 0i64;
  PfSnLogPrefetchMetadata(v3, a2, r8_0);
  if( v3 )
  {
    ObjectAttributes.Length = 48;
    ObjectAttributes.RootDirectory = 0i64;
    ObjectAttributes.Attributes = 512;
    ObjectAttributes.ObjectName = 0i64;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    v7 = NtCreateEvent(&EventHandle, 0x1F0003ui64, &ObjectAttributes, NotificationEvent, 0);
    if( v7 >= 0 )
    {
      v8 = v3 + *(unsigned int *)(v3 + 108);
      v9 = 0i64;
      v39 = v8;
      v43 = 0;
      if( *(_DWORD *)(v3 + 112) )
      {
        v10 = (LIST_ENTRY *)(a1 + 40);
        do
        {
          v11 = (unsigned int *)(v8 + 96 * v9);
          PrefetchVolumeInfoInList = PfSnFindPrefetchVolumeInfoInList((const WCHAR *)(v8 + *v11), v10, 1ui64);
          v13 = PrefetchVolumeInfoInList;
          if( PrefetchVolumeInfoInList && (HIDWORD(PrefetchVolumeInfoInList[6].Blink) & 1) != 0 )
          {
            v14 = v11 + 9;
            for( i = 0; i < 7; ++i )
            {
              if( _bittest((const int *)&v6, i) )
                v4 += *v14 + v14[7];
              ++v14;
            }
            PfSnPrefetchFileMetadata(
              a1,
              PrefetchVolumeInfoInList[2].Flink,
              v8 + v11[5],
              (unsigned int)PrefetchVolumeInfoInList[6].Blink,
              v4,
              EventHandle);
            LODWORD(v13[6].Blink) += v4;
            v16 = 768;
            v17 = *(_QWORD *)(a1 + 80);
            a3 = v17;
            *(_DWORD *)v17 = 4;
            v18 = *(_DWORD *)(a1 + 96);
            v19 = *(_DWORD *)(a1 + 100) & 7 | 8;
            *(_DWORD *)(v17 + 4) = 768;
            *(_QWORD *)(v17 + 8) = v18 & 7 | (unsigned __int64)(unsigned int)(8 * v19);
            v20 = 0;
            v21 = (_QWORD *)(v17 + 16);
            do
            {
              v22 = v20++;
              *v21++ = v22 << 12;
            }
            while( v20 < 0x300 );
            Flink = v13[6].Flink;
            v24 = 0;
            v25 = v42;
            v26 = v11 + 16;
            v27 = a3;
            v41 = 0;
            do
            {
              if( _bittest((const int *)&v25, v24) )
              {
                v29 = 0;
                if( *v26 )
                {
                  do
                  {
                    RtlInitUnicodeString(&DestinationString, (PCWSTR)&Flink->Flink + LODWORD(v13[1].Blink) + 2, v16);
                    v30 = *(_QWORD *)(a1 + 8);
                    ObjectAttributes.RootDirectory = v13[4].Flink;
                    ObjectAttributes.Length = 48;
                    ObjectAttributes.ObjectName = &DestinationString;
                    ObjectAttributes.Attributes = 576;
                    v35 = 0i64;
                    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
                    *(_OWORD *)a4 = 0i64;
                    PfpPrefetchEntireDirectory(v30, (INT64)&v13[2], v27, (INT64)a4, (INT64)&ObjectAttributes);
                    if( a4[0] && *(_DWORD *)(a1 + 120) < *(_DWORD *)(a1 + 124) )
                    {
                      v31 = v35;
                      v32 = 3i64 * *(unsigned int *)(a1 + 120);
                      v33 = *(_QWORD *)(a1 + 112);
                      *(_OWORD *)(v33 + 8 * v32) = *(_OWORD *)a4;
                      *(_QWORD *)(v33 + 8 * v32 + 16) = v31;
                      ++*(_DWORD *)(a1 + 120);
                    }
                    ++v29;
                    Flink = (_LIST_ENTRY *)((char *)Flink + 2 * LOWORD(Flink->Flink) + 4);
                  }
                  while( v29 < *v26 );
                  v24 = v41;
                  v25 = v42;
                }
              }
              ++v24;
              ++v26;
              v41 = v24;
            }
            while( v24 < 7 );
            v3 = v38;
            v4 = 0;
            v8 = v39;
            v13[6].Flink = Flink;
            v6 = v42;
          }
          v10 = (LIST_ENTRY *)(a1 + 40);
          v9 = (unsigned int)(v43 + 1);
          v43 = v9;
        }
        while( (unsigned int)v9 < *(_DWORD *)(v3 + 112) );
      }
      v7 = 0;
    }
    if( EventHandle )
      NtClose(EventHandle);
  }
  else
  {
    v7 = -1073741811;
  }
  PfSnLogPrefetchMetadata(v3, v6, 0i64);
  return(unsigned int)v7;
}

Referenced by:

PfSnAsyncPrefetchStep