sub_1405BD7FC

__int64 __fastcall sub_1405BD7FC(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
  unsigned int v4; 
  VOID **v5; 
  size_t v6; 
  unsigned int *v8; 
  signed int v11; 
  unsigned int *v12; 
  unsigned int i; 
  __int64 v14; 
  unsigned int *v15; 
  unsigned int v16; 
  unsigned int *v17; 
  unsigned int *v18; 
  unsigned int j; 
  __int64 v20; 
  unsigned int *v21; 
  unsigned int v22; 
  size_t *v23; 
  int v24; 
  VOID **PoolWithTag; 
  VOID **v26; 
  int v27; 
  unsigned int v28; 
  unsigned int v29; 
  unsigned int v30; 
  unsigned int v31; 
  int v32; 
  unsigned int v33; 
  unsigned int v34; 
  VOID **v35; 
  __int64 v36; 
  int v37; 
  int v38; 
  unsigned int v39; 
  int v40; 
  unsigned int v41; 
  unsigned int v42; 
  _DWORD *v43; 
  unsigned int v44; 
  __int64 v45; 
  unsigned int v46; 
  int v47; 
  unsigned int v48; 
  unsigned int v49; 
  unsigned __int64 v50; 
  unsigned int v51; 
  __int64 v52; 
  int v53; 
  unsigned int v54; 
  unsigned int v55; 
  __int64 v56; 
  unsigned int v57; 
  int v58; 
  unsigned int v59; 
  unsigned int v60; 
  size_t *v61; 
  unsigned int v62; 
  unsigned int v63; 
  _DWORD *k; 
  unsigned int v65; 
  __int64 v67; 
  int v68; 

  v4 = 0;
  v5 = 0i64;
  v67 = 0i64;
  v6 = 0;
  v68 = 0;
  v8 = *(unsigned int **)(a1 + 8);
  if( v8 && *(_DWORD *)a1 > 3u )
  {
    v12 = *(unsigned int **)(a1 + 8);
    for( i = 0; i < 3; ++i )
    {
      v14 = *v12;
      v15 = v12 + 1;
      if( v12 + 1 < v12 )
        goto LABEL_14;
      v12 = (unsigned int *)((char *)v15 + v14);
      if( (unsigned int *)((char *)v15 + v14) < v15 )
        goto LABEL_14;
    }
    v16 = *v12;
    v17 = v12 + 1;
    if( v12 + 1 < v12 )
    {
LABEL_14:
      v11 = -1073741675;
      goto LABEL_15;
    }
    v18 = 0i64;
    if( v16 )
      v18 = v17;
    v11 = 0;
    if( v16 == 8 )
    {
      v67 = *(_QWORD *)v18;
      goto LABEL_15;
    }
    return(unsigned int)-1073741789;
  }
  v11 = -1073741811;
LABEL_15:
  if( v11 >= 0 )
  {
    if( v8 && *(_DWORD *)a1 > 4u )
    {
      for( j = 0; j < 4; ++j )
      {
        v20 = *v8;
        v21 = v8 + 1;
        if( v8 + 1 < v8 )
          goto LABEL_28;
        v8 = (unsigned int *)((char *)v21 + v20);
        if( (unsigned int *)((char *)v21 + v20) < v21 )
          goto LABEL_28;
      }
      v22 = *v8;
      if( v8 + 1 < v8 )
      {
LABEL_28:
        v11 = -1073741675;
        goto LABEL_29;
      }
      v23 = 0i64;
      if( v22 )
        v23 = v8 + 1;
      v11 = 0;
      if( v22 == 4 )
      {
        v6 = *v23;
        goto LABEL_29;
      }
      return(unsigned int)-1073741789;
    }
    v11 = -1073741811;
LABEL_29:
    if( v11 >= 0 )
    {
      if( v6 )
      {
        v24 = 0;
        PoolWithTag = ExAllocatePoolWithTag(1ui64, v6, 542329939i64);
        v5 = PoolWithTag;
        if( !PoolWithTag )
          return(unsigned int)-1073741801;
        memset(PoolWithTag, 0i64, v6);
      }
      else
      {
        v24 = 1;
      }
      if( qword_140D2C478 )
      {
        v26 = 0i64;
        if( !v24 )
          v26 = v5;
        v27 = qword_140D2C478(v26, v6, &v68);
      }
      else
      {
        v27 = -1073741637;
      }
      v28 = v6 + 4;
      if( v6 >= 0xFFFFFFFC )
      {
        v11 = -1073741675;
      }
      else
      {
        if( v28 >= 0xFFFFFFEC || (v4 = v6 + 32, v6 + 32 < v6 + 24) )
        {
          v11 = -1073741675;
          goto LABEL_132;
        }
        v11 = 0;
      }
      if( v11 < 0 )
      {
LABEL_132:
        if( v5 )
          ExFreeHeapPool(v5);
        return(unsigned int)v11;
      }
      v29 = 0;
      if( v4 >= 0xFFFFFFF8 )
      {
        v11 = -1073741675;
        goto LABEL_132;
      }
      v30 = (v4 + 15) & 0xFFFFFFF8;
      if( v30 >= v4 + 8 )
      {
        v29 = v30 + 8;
        if( v30 + 8 < v30 )
        {
          v11 = -1073741675;
          goto LABEL_58;
        }
        v11 = 0;
      }
      else
      {
        v11 = -1073741675;
      }
      if( v11 >= 0 )
      {
        v31 = v29 + 4;
        v32 = *(_DWORD *)(a2 + 16);
        v33 = v29 + 8;
        if( v33 < v31 || (v34 = v33 + v32, v33 + v32 < v33) || v34 + 4 < v34 )
          v11 = -1073741675;
        else
          v11 = v34 + 4 + *(_DWORD *)(a2 + 32) < v34 + 4 ? 0xC0000095 : 0;
      }
LABEL_58:
      if( v11 < 0 )
        goto LABEL_132;
      if( !a4 )
      {
        v11 = -1073741811;
        goto LABEL_132;
      }
      v11 = 0;
      *(_DWORD *)(a4 + 4) = v4;
      if( v4 )
      {
        v35 = ExAllocatePoolWithTag(1ui64, v4, 542329939i64);
        if( v35 )
        {
          *(_QWORD *)(a4 + 8) = v35;
          *(_DWORD *)a4 = 0;
        }
        else
        {
          v11 = -1073741801;
        }
      }
      else
      {
        v11 = -1073741762;
      }
      if( v11 < 0 )
        goto LABEL_132;
      v36 = *(_QWORD *)(a4 + 8);
      v37 = v27 | 0x10000000;
      v38 = -1;
      if( v36 )
      {
        v42 = 0;
        v43 = *(_DWORD **)(a4 + 8);
        if( *(_DWORD *)a4 )
        {
          while( 1 )
          {
            v44 = *v43 + 4;
            if( *v43 >= 0xFFFFFFFC )
              break;
            if( (_DWORD *)((char *)v43 + v44) < v43 )
              goto LABEL_131;
            ++v42;
            v43 = (_DWORD *)((char *)v43 + v44);
            if( v42 >= *(_DWORD *)a4 )
              goto LABEL_78;
          }
          v11 = -1073741675;
        }
        else
        {
LABEL_78:
          if( v43 + 1 < v43 )
            goto LABEL_131;
          v11 = 0;
          if( (unsigned __int64)(v43 + 2) > v36 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
            goto LABEL_80;
          *v43 = 4;
          v43[1] = v37;
          ++*(_DWORD *)a4;
        }
      }
      else
      {
        v39 = *(_DWORD *)(a4 + 4);
        v40 = -1;
        v41 = v39 + 8;
        if( v39 + 8 >= v39 )
          v40 = v39 + 8;
        v11 = v41 < v39 ? 0xC0000095 : 0;
        *(_DWORD *)(a4 + 4) = v40;
        if( v41 >= v39 )
        {
          ++*(_DWORD *)a4;
          goto LABEL_84;
        }
      }
      if( v11 < 0 )
        goto LABEL_132;
LABEL_84:
      v45 = *(_QWORD *)(a4 + 8);
      if( v45 )
      {
        v49 = 0;
        v50 = *(_QWORD *)(a4 + 8);
        if( *(_DWORD *)a4 )
        {
          while( 1 )
          {
            v51 = *(_DWORD *)v50 + 4;
            if( *(_DWORD *)v50 >= 0xFFFFFFFC )
              break;
            if( v50 + v51 < v50 )
              goto LABEL_131;
            ++v49;
            v50 += v51;
            if( v49 >= *(_DWORD *)a4 )
              goto LABEL_93;
          }
          v11 = -1073741675;
        }
        else
        {
LABEL_93:
          if( v50 + 4 < v50 )
            goto LABEL_131;
          v11 = 0;
          if( v50 + 12 > v45 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
            goto LABEL_80;
          *(_DWORD *)v50 = 8;
          *(_QWORD *)(v50 + 4) = v67;
          ++*(_DWORD *)a4;
        }
      }
      else
      {
        v46 = *(_DWORD *)(a4 + 4);
        v47 = -1;
        v48 = v46 + 12;
        if( v46 + 12 >= v46 )
          v47 = v46 + 12;
        v11 = v48 < v46 ? 0xC0000095 : 0;
        *(_DWORD *)(a4 + 4) = v47;
        if( v48 >= v46 )
        {
          ++*(_DWORD *)a4;
          goto LABEL_97;
        }
      }
      if( v11 < 0 )
        goto LABEL_132;
LABEL_97:
      if( v5 )
      {
        if( !v6 )
          goto LABEL_99;
      }
      else if( v6 )
      {
LABEL_99:
        v11 = -1073741811;
        goto LABEL_100;
      }
      v56 = *(_QWORD *)(a4 + 8);
      if( v56 )
      {
        v60 = 0;
        v61 = *(size_t **)(a4 + 8);
        if( !*(_DWORD *)a4 )
        {
LABEL_119:
          if( v61 + 1 < v61 )
            goto LABEL_131;
          v11 = 0;
          if( (unsigned __int64)v61 + v6 + 4 > v56 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
            goto LABEL_80;
          *v61 = v6;
          if( v5 )
            memmove(v61 + 1, v5, v6);
          ++*(_DWORD *)a4;
          goto LABEL_100;
        }
        while( 1 )
        {
          v62 = *v61 + 4;
          if( *v61 >= 0xFFFFFFFC )
            break;
          if( (size_t *)((char *)v61 + v62) < v61 )
            goto LABEL_131;
          ++v60;
          v61 = (size_t *)((char *)v61 + v62);
          if( v60 >= *(_DWORD *)a4 )
            goto LABEL_119;
        }
      }
      else if( v28 >= 4 )
      {
        v57 = *(_DWORD *)(a4 + 4);
        v58 = -1;
        v59 = v57 + v28;
        if( v57 + v28 >= v57 )
          v58 = v57 + v28;
        v11 = v59 < v57 ? 0xC0000095 : 0;
        *(_DWORD *)(a4 + 4) = v58;
        if( v59 >= v57 )
        {
          ++*(_DWORD *)a4;
          goto LABEL_101;
        }
LABEL_100:
        if( v11 < 0 )
          goto LABEL_132;
LABEL_101:
        v52 = *(_QWORD *)(a4 + 8);
        v53 = v68;
        if( !v52 )
        {
          v54 = *(_DWORD *)(a4 + 4);
          v55 = v54 + 8;
          if( v54 + 8 >= v54 )
            v38 = v54 + 8;
          v11 = v55 < v54 ? 0xC0000095 : 0;
          *(_DWORD *)(a4 + 4) = v38;
          if( v55 >= v54 )
          {
            ++*(_DWORD *)a4;
            v11 = 0;
          }
          goto LABEL_132;
        }
        v63 = 0;
        for( k = *(_DWORD **)(a4 + 8); v63 < *(_DWORD *)a4; k = (_DWORD *)((char *)k + v65) )
        {
          v65 = *k + 4;
          if( *k >= 0xFFFFFFFC || (_DWORD *)((char *)k + v65) < k )
            goto LABEL_131;
          ++v63;
        }
        if( k + 1 >= k )
        {
          v11 = 0;
          if( (unsigned __int64)(k + 2) <= v52 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
          {
            *k = 4;
            k[1] = v53;
            ++*(_DWORD *)a4;
            goto LABEL_132;
          }
LABEL_80:
          v11 = -1073741789;
          goto LABEL_132;
        }
LABEL_131:
        v11 = -1073741675;
        goto LABEL_132;
      }
      v11 = -1073741675;
      goto LABEL_100;
    }
  }
  return(unsigned int)v11;
}

Referenced by:

sub_1405F50F8