ST_STORE::StDmCombineRegion
__int64 __fastcall ST_STORE::StDmCombineRegion(UINT64 a1, int a2){
unsigned __int16 *v2;
int v5;
int v6;
unsigned int *PreviousEntry;
__int64 v8;
VOID *v9;
__int64 v10;
__int64 v11;
unsigned int *v12;
__int64 v13;
VOID *v14;
__int64 result;
int v16;
__int64 v17;
int v18;
VOID **PoolWithTag;
v2 = *(unsigned __int16 **)(a1 + 1056);
if( v2 )
{
*(_QWORD *)(a1 + 1056) = 0i64;
PoolWithTag = (VOID **)v2;
}
else
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x1000ui64, 1951624563i64);
v2 = (unsigned __int16 *)PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
}
*(_QWORD *)v2 = 0i64;
*(_DWORD *)v2 = a2;
*((_DWORD *)v2 + 1) = 528384;
v5 = *(_DWORD *)(a1 + 808) | (a2 << *(_DWORD *)(a1 + 812));
v17 = 0i64;
v18 = 0;
v6 = *(_DWORD *)(a1 + 120);
if( (v6 & 1) == 0 )
{
B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
(__int64 *)(a1 + 64),
a1 + 88);
v6 = *(_DWORD *)(a1 + 120);
}
*(_DWORD *)(a1 + 120) = v6 | 1;
ST_STORE::StDmPageRecordUnprotect(a1, *(_QWORD *)(a1 + 760));
**(_DWORD **)(a1 + 760) = v5;
if( (int)B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultIterStart(
a1 + 88,
a1 + 64,
*(_DWORD *)(a1 + 768)) < 0 )
__int2c();
while( 1 )
{
PreviousEntry = (unsigned int *)B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeFindPreviousEntry(
a1 + 64,
a1 + 88);
if( !PreviousEntry )
break;
v9 = (VOID *)*PreviousEntry;
v10 = (unsigned int)v9 >> *(_DWORD *)(a1 + 456);
_BitScanReverse((unsigned int *)&v11, v10);
v8 = 2 * (v10 ^ (unsigned int)(1 << v11));
v12 = (unsigned int *)(*(unsigned int *)(a1 + 472)
+ *(_DWORD *)(a1 + 464) * ((unsigned int)v9 & *(_DWORD *)(a1 + 460))
+ *(_QWORD *)(*(_QWORD *)(a1 + 8 * v11 + 192) + 16 * (v10 ^ (unsigned int)(1 << v11))));
if( *v12 >> *(_DWORD *)(a1 + 812) != a2 )
break;
if( (v12[1] & 0xFFFFF000) <= 0x1000
&& (unsigned int)ST_STORE::StDmCombineBufferAddEntry(a1, (unsigned int *)v2, (__int64)&v17, v12) == -2147483643 )
{
result = ST_STORE::StDmCombineBufferProcess(a1, (unsigned __int16 **)&PoolWithTag, v13, v14);
if( (int)result < 0 )
goto LABEL_26;
v16 = *(_DWORD *)(a1 + 120);
if( (v16 & 1) == 0 )
{
B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
(__int64 *)(a1 + 64),
a1 + 88);
v16 = *(_DWORD *)(a1 + 120);
}
*(_DWORD *)(a1 + 120) = v16 | 1;
**(_DWORD **)(a1 + 760) = *v12;
if( (int)B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultIterStart(
a1 + 88,
a1 + 64,
*(_DWORD *)(a1 + 768)) < 0 )
__int2c();
v2 = (unsigned __int16 *)PoolWithTag;
v17 = 0i64;
v18 = 0;
*PoolWithTag = 0i64;
*(_DWORD *)v2 = a2;
*((_DWORD *)v2 + 1) = 528384;
}
}
if( v2 + 4 >= (unsigned __int16 *)((char *)v2 + v2[3]) )
{
LABEL_18:
result = 0i64;
goto LABEL_19;
}
result = ST_STORE::StDmCombineBufferProcess(a1, (unsigned __int16 **)&PoolWithTag, v8, v9);
if( (int)result >= 0 )
{
v2 = (unsigned __int16 *)PoolWithTag;
goto LABEL_18;
}
LABEL_26:
v2 = (unsigned __int16 *)PoolWithTag;
LABEL_19:
if( v2 )
*(_QWORD *)(a1 + 1056) = v2;
return result;
}
Referenced by:
No references.