PfSnPopulateReadList

VOID __stdcall PfSnPopulateReadList(_PFSN_WORKITEM_CONTEXT *Context){
  __int64 v1; 
  _PFSN_WORKITEM_CONTEXT *v2; 
  unsigned __int32 v3; 
  VOID **PoolWithTag; 
  _PFSN_PREFETCH_HEADER *v5; 
  void *v6; 
  _ERESOURCE *v7; 
  UINT8 v8; 
  _ETHREAD *CurrentThread; 
  NTSTATUS Event; 
  unsigned int *v11; 
  _PFSN_WORKITEM_CONTEXT v12; 
  int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned int v17; 
  UINT8 v18; 
  PF_SECTION_RECORD *v19; 
  __int64 v20; 
  unsigned int v21; 
  _PFSN_WORKITEM_CONTEXT v22; 
  int v23; 
  bool v24; 
  WCHAR *v25; 
  __int64 *PrefetchVolumeInfoInList; 
  PFSN_PREFETCH_VOLUME_INFO *v27; 
  char v28; 
  unsigned int v29; 
  int v30; 
  __int64 v31; 
  int v32; 
  int v33; 
  __int64 v34; 
  unsigned int *v35; 
  __int64 i; 
  unsigned int v37; 
  __int64 v38; 
  int v39; 
  int v40; 
  UINT64 v41; 
  UINT64 SectionIdx; 
  UINT64 ImageSection; 
  _BYTE NeedToCleanup[8]; 
  UINT64 PrefetchPhaseMask; 
  __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  _FILE_OBJECT *OutFileObject; 
  _PFSN_PREFETCH_HEADER *PrefetchHeader; 
  VOID *Handle; 
  __int64 v52; 
  __int64 v53; 
  __int64 v54; 
  __int64 v55; 
  _PFSN_WORKITEM_CONTEXT *v56; 
  __int64 v57; 
  _UNICODE_STRING DestinationString; 
  INT64 v59; 
  __int64 v60; 
  __int64 v61; 
  int v62; 
  int v63; 
  __int128 v64; 
  _KAPC_STATE ApcState; 

  v1 = *((_QWORD *)Context + 4);
  v2 = Context;
  v3 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  v56 = Context;
  PoolWithTag = 0i64;
  HIDWORD(v59) = 0;
  DestinationString = 0i64;
  v5 = *(_PFSN_PREFETCH_HEADER **)(v1 + 8);
  v6 = *(void **)(v1 + 16);
  PrefetchHeader = v5;
  v63 = 0;
  v47 = v1;
  NeedToCleanup[0] = 0;
  Handle = 0i64;
  KiStackAttachProcess(v6, 0i64, &ApcState);
  LOBYTE(v7) = 1;
  PsSetCurrentThreadPrefetching(v7, v8);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  LODWORD(v59) = 48;
  v60 = 0i64;
  v62 = 512;
  v61 = 0i64;
  v64 = 0i64;
  Event = NtCreateEvent((UINT64)&Handle, 0x1F0003ui64, (INT64)&v59, 0i64, 0);
  if( Event >= 0 )
  {
    v11 = *(unsigned int **)v5;
    v12 = v2[10];
    OutFileObject = 0i64;
    v13 = v5[25] & 7;
    v14 = (__int64)v11 + v11[21];
    v15 = (__int64)v11 + v11[23];
    v16 = (__int64)v11 + v11[25];
    v55 = v14;
    v54 = *((_QWORD *)v5 + 8);
    v52 = *((_QWORD *)v5 + 9);
    v17 = v5[24] & 7 | (8 * (v13 | 8));
    v53 = v15;
    v57 = v16;
    LODWORD(PrefetchPhaseMask) = v12;
    v3 = _InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 28), 1u);
    if( v3 >= *(_DWORD *)(v1 + 32) )
      goto LABEL_3;
    while( 1 )
    {
      v19 = (PF_SECTION_RECORD *)(v14 + 32i64 * v3);
      v20 = v3;
      v46 = v3;
      v21 = v19[5];
      if( (v21 & 1) == 0 )
        break;
LABEL_33:
      if( NeedToCleanup[0] )
      {
        PfSnCleanupPrefetchSectionInfo(*((_QWORD *)v5 + 7) + 56 * v20, (__int64)v5, 1);
        NeedToCleanup[0] = 0;
      }
      if( PoolWithTag )
      {
        ExFreePoolWithTag(PoolWithTag, 0);
        PoolWithTag = 0i64;
      }
      v1 = v47;
LABEL_38:
      v3 = _InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 28), 1u);
      if( v3 >= *(_DWORD *)(v1 + 32) )
        goto LABEL_50;
      v14 = v55;
      v2 = v56;
      v16 = v57;
    }
    v22 = v2[11];
    NeedToCleanup[1] = 0;
    v23 = v22 & 1;
    if( v23 )
    {
      v24 = ((unsigned __int8)v12 & BYTE1(v21) & 0x7F) == 0;
    }
    else
    {
      LODWORD(v48) = 0;
      v24 = !_BitScanForward((unsigned int *)&v39, (v21 >> 8) & 0x7F);
      if( v24 )
        v39 = 7;
      v40 = v12 & (1 << v39);
      LODWORD(v48) = v39;
      NeedToCleanup[1] = v40 != 0;
      if( ((unsigned __int8)v12 & (unsigned __int8)(v21 >> 1) & 0x7F) != 0 )
        goto LABEL_10;
      NeedToCleanup[1] = v40 != 0;
      v24 = v40 == 0;
    }
    if( v24 )
    {
LABEL_32:
      v20 = v46;
      goto LABEL_33;
    }
LABEL_10:
    v25 = (WCHAR *)(v16 + (unsigned int)v19[3]);
    PrefetchVolumeInfoInList = PfSnFindPrefetchVolumeInfoInList(v25, (_QWORD *)v5 + 5, 0);
    if( PrefetchVolumeInfoInList )
    {
      PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (unsigned int)(8 * v19[2] + 24), 1280336707i64);
      if( !PoolWithTag )
      {
        v1 = v47;
        Event = -1073741670;
        v5 = PrefetchHeader;
        goto LABEL_53;
      }
      *((_DWORD *)PoolWithTag + 3) = v23;
      *PoolWithTag = 0i64;
      *((_DWORD *)PoolWithTag + 2) = 0;
      RtlInitUnicodeString(&DestinationString, &v25[*((unsigned int *)PrefetchVolumeInfoInList + 6) + 1]);
      v12 = PrefetchPhaseMask;
      v27 = (PFSN_PREFETCH_VOLUME_INFO *)PrefetchVolumeInfoInList;
      v5 = PrefetchHeader;
      LODWORD(ImageSection) = v23;
      LODWORD(SectionIdx) = v3;
      LODWORD(v41) = PrefetchPhaseMask;
      if( PfSnGetSectionObject(
             PrefetchHeader,
             v27,
             &DestinationString,
             v19,
             v41,
             SectionIdx,
             ImageSection,
             Handle,
             &OutFileObject,
             NeedToCleanup) >= 0 )
      {
        v28 = NeedToCleanup[1];
        v29 = 0;
        v30 = 1;
        if( NeedToCleanup[1] )
        {
          v29 = 1;
          PoolWithTag[(unsigned int)(*((_DWORD *)PoolWithTag + 2))++ + 2] = 0i64;
          if( !OutFileObject->SectionObjectPointer->ImageSectionObject )
            v30 = 0;
        }
        v31 = *v19;
        v32 = v19[1];
        v33 = 0;
        v34 = (int)v31 + v32;
        if( v31 < v34 )
        {
          v35 = (unsigned int *)(v53 + 8 * v31 + 4);
          for( i = v34 - v31; i; --i )
          {
            v37 = *v35;
            if( (*v35 & 1) == 0 )
            {
              if( (v37 & 8) != 0 && !v30 )
              {
LABEL_21:
                if( *(v35 - 1) || !v28 )
                {
                  PoolWithTag[(unsigned int)(*((_DWORD *)PoolWithTag + 2))++ + 2] = (VOID *)((unsigned __int64)*(v35 - 1) << 9);
                  ++v29;
                }
                else
                {
                  v33 = 1;
                }
                goto LABEL_23;
              }
              if( _bittest(&v12, (v37 >> 4) & 7) )
              {
                if( v23 )
                {
                  if( (v37 & 2) != 0 )
                    goto LABEL_21;
                }
                else if( (v37 & 4) != 0 )
                {
                  goto LABEL_21;
                }
              }
            }
LABEL_23:
            v35 += 2;
          }
        }
        if( *((_DWORD *)PoolWithTag + 2) != 1 || !v28 || !v30 || v33 )
        {
          v1 = v47;
          PoolWithTag[2] = (VOID *)(v17 | (unsigned __int64)PoolWithTag[2]);
          *PoolWithTag = OutFileObject;
          v38 = (unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 24), 1u);
          *(_QWORD *)(v54 + 8 * v38) = PoolWithTag;
          PoolWithTag = 0i64;
          _InterlockedExchangeAdd((volatile signed __int32 *)(v1 + 36), v29);
          if( NeedToCleanup[0] )
          {
            *(_DWORD *)(v52 + 4 * v38) = v3;
            NeedToCleanup[0] = 0;
          }
          else
          {
            *(_DWORD *)(v52 + 4 * v38) = -1;
          }
          goto LABEL_38;
        }
      }
    }
    else
    {
      v12 = PrefetchPhaseMask;
      v5 = PrefetchHeader;
    }
    goto LABEL_32;
  }
LABEL_53:
  *(_DWORD *)(v1 + 40) = Event;
LABEL_50:
  if( NeedToCleanup[0] )
    PfSnCleanupPrefetchSectionInfo(*((_QWORD *)v5 + 7) + 56i64 * v3, (__int64)v5, 1);
LABEL_3:
  if( Handle )
    NtClose((UINT64)Handle);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  PsSetCurrentThreadPrefetching(0i64, v18);
  KiUnstackDetachProcess(&ApcState, 0i64);
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)v1);
}

Referenced by:

No references.