ST_STORE::StAcquireReadContext

PSLIST_ENTRY __fastcall ST_STORE::StAcquireReadContext(__int64 a1){
  PSLIST_ENTRY v2; 
  UINT64 v4; 
  VOID **PoolWithTag; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 

  v2 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)(a1 + 4048));
  if( !v2 )
  {
    v4 = (unsigned int)(*(_DWORD *)(a1 + 4024) + 4544);
    if( (*(_DWORD *)(a1 + 856) & 0x40000) == 0 )
      v4 = (unsigned int)(*(_DWORD *)(a1 + 4024) + 448);
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v4, 1951624563i64);
    v2 = (PSLIST_ENTRY)PoolWithTag;
    if( PoolWithTag )
    {
      memset(PoolWithTag, 0i64, 0x50u);
      v6 = ((unsigned __int64)&v2[5].Next + 15) & 0xFFFFFFFFFFFFFFF0ui64;
      if( *(_DWORD *)(a1 + 4024) )
      {
        v2[1].Next = (_SLIST_ENTRY *)v6;
        v6 += *(unsigned int *)(a1 + 4024);
      }
      v7 = (v6 + 7) & 0xFFFFFFFFFFFFFFF8ui64;
      *((_QWORD *)&v2[1].Next + 1) = v7;
      v8 = (v7 + 175) & 0xFFFFFFFFFFFFFFF8ui64;
      v2[2].Next = (_SLIST_ENTRY *)v8;
      *(_QWORD *)(v7 + 8) = 0i64;
      *(_QWORD *)(v7 + 16) = 0i64;
      *(_QWORD *)(v7 + 32) = 0i64;
      *(_DWORD *)(v7 + 24) = 0;
      *(_QWORD *)v7 = v7 + 40;
      *(_DWORD *)(v7 + 28) = 8;
      *(_QWORD *)(v8 + 8) = 0i64;
      *(_QWORD *)(v8 + 16) = 0i64;
      *(_QWORD *)(v8 + 32) = 0i64;
      *(_DWORD *)(v8 + 24) = 0;
      *(_QWORD *)v8 = v8 + 40;
      *(_DWORD *)(v8 + 28) = 8;
      if( (*(_DWORD *)(a1 + 856) & 0x40000) != 0 )
        v2[3].Next = (_SLIST_ENTRY *)(v8 + 168);
    }
    else
    {
      return 0i64;
    }
  }
  return v2;
}

Referenced by:

No references.