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.