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.