sub_140960810

INT64 __fastcall sub_140960810(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
  int v4; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned int *v9; 
  signed int v10; 
  unsigned int *v11; 
  unsigned int i; 
  __int64 v13; 
  unsigned int *v14; 
  unsigned int v15; 
  __int64 *v16; 
  __int64 *v17; 
  unsigned int *v18; 
  unsigned int j; 
  __int64 v20; 
  unsigned int *v21; 
  unsigned int v22; 
  unsigned int *v23; 
  unsigned int *v24; 
  unsigned int v25; 
  unsigned int *v26; 
  unsigned int k; 
  __int64 v28; 
  unsigned int *v29; 
  unsigned int v30; 
  unsigned int *v31; 
  unsigned int *v32; 
  unsigned int m; 
  __int64 v34; 
  unsigned int *v35; 
  unsigned int v36; 
  unsigned int *v37; 
  unsigned int n; 
  __int64 v39; 
  unsigned int *v40; 
  unsigned int v41; 
  unsigned int *v42; 
  void *PoolWithTag; 
  void *v44; 
  int v45; 
  unsigned int v46; 
  unsigned int v47; 
  unsigned int v48; 
  int v49; 
  unsigned int v50; 
  unsigned int v51; 
  unsigned int v52; 
  VOID *v53; 
  __int64 v54; 
  int v55; 
  int v56; 
  unsigned int v57; 
  int v58; 
  unsigned int v59; 
  unsigned int v60; 
  _DWORD *v61; 
  unsigned int v62; 
  __int64 v63; 
  unsigned int v64; 
  int v65; 
  unsigned int v66; 
  unsigned int v67; 
  unsigned __int64 v68; 
  unsigned int v69; 
  __int64 v70; 
  UINT8 *v71; 
  __int64 v72; 
  int v73; 
  unsigned int v74; 
  unsigned int v75; 
  __int64 v76; 
  unsigned int v77; 
  int v78; 
  unsigned int v79; 
  unsigned int v80; 
  unsigned __int64 v81; 
  unsigned int v82; 
  unsigned int v83; 
  _DWORD *ii; 
  unsigned int v85; 
  unsigned int v87; 
  int v88; 
  void *Src; 
  __int64 v90; 
  unsigned int Size; 
  v4 = 0;
  v90 = 0i64;
  v87 = 0;
  v7 = 0;
  Size = 0;
  v8 = 0;
  v9 = *(unsigned int **)(a1 + 8);
  Src = 0i64;
  v88 = 0;
  if( v9 && *(_DWORD *)a1 > 3u )
  {
    v11 = v9;
    for( i = 0; i < 3; ++i )
    {
      v13 = *v11;
      v14 = v11 + 1;
      if( v11 + 1 < v11 )
        goto LABEL_14;
      v11 = (unsigned int *)((char *)v14 + v13);
      if( (unsigned int *)((char *)v14 + v13) < v14 )
        goto LABEL_14;
    }
    v15 = *v11;
    v16 = (__int64 *)(v11 + 1);
    if( v11 + 1 < v11 )
    {
LABEL_14:
      v10 = -1073741675;
    }
    else
    {
      v17 = 0i64;
      if( v15 )
        v17 = v16;
      v10 = 0;
      if( v15 != 8 )
        return(unsigned int)-1073741789;
      v90 = *v17;
    }
  }
  else
  {
    v10 = -1073741811;
  }
  if( v10 < 0 )
    return(unsigned int)v10;
  if( v9 && *(_DWORD *)a1 > 4u )
  {
    v18 = v9;
    for( j = 0; j < 4; ++j )
    {
      v20 = *v18;
      v21 = v18 + 1;
      if( v18 + 1 < v18 )
        goto LABEL_28;
      v18 = (unsigned int *)((char *)v21 + v20);
      if( (unsigned int *)((char *)v21 + v20) < v21 )
        goto LABEL_28;
    }
    v22 = *v18;
    v23 = v18 + 1;
    if( v18 + 1 < v18 )
    {
LABEL_28:
      v10 = -1073741675;
    }
    else
    {
      v24 = 0i64;
      if( v22 )
        v24 = v23;
      v10 = 0;
      if( v22 != 4 )
        return(unsigned int)-1073741789;
      v87 = *v24;
    }
  }
  else
  {
    v10 = -1073741811;
  }
  if( v10 < 0 )
    return(unsigned int)v10;
  if( !v9 )
    return(unsigned int)-1073741811;
  v25 = *(_DWORD *)a1;
  if( *(_DWORD *)a1 <= 5u )
    return(unsigned int)-1073741811;
  v26 = v9;
  for( k = 0; k < 5; ++k )
  {
    v28 = *v26;
    v29 = v26 + 1;
    if( v26 + 1 < v26 )
      return(unsigned int)-1073741675;
    v26 = (unsigned int *)((char *)v29 + v28);
    if( (unsigned int *)((char *)v29 + v28) < v29 )
      return(unsigned int)-1073741675;
  }
  v30 = *v26;
  if( v26 + 1 < v26 )
    return(unsigned int)-1073741675;
  v31 = 0i64;
  if( v30 )
    v31 = v26 + 1;
  if( v25 <= 6 )
    return(unsigned int)-1073741811;
  v32 = v9;
  for( m = 0; m < 6; ++m )
  {
    v34 = *v32;
    v35 = v32 + 1;
    if( v32 + 1 < v32 )
      return(unsigned int)-1073741675;
    v32 = (unsigned int *)((char *)v35 + v34);
    if( (unsigned int *)((char *)v35 + v34) < v35 )
      return(unsigned int)-1073741675;
  }
  v36 = *v32;
  if( v32 + 1 < v32 )
    return(unsigned int)-1073741675;
  v37 = 0i64;
  if( v36 )
    v37 = v32 + 1;
  if( v25 > 7 )
  {
    for( n = 0; n < 7; ++n )
    {
      v39 = *v9;
      v40 = v9 + 1;
      if( v9 + 1 < v9 )
        goto LABEL_59;
      v9 = (unsigned int *)((char *)v40 + v39);
      if( (unsigned int *)((char *)v40 + v39) < v40 )
        goto LABEL_59;
    }
    v41 = *v9;
    if( v9 + 1 < v9 )
    {
LABEL_59:
      v10 = -1073741675;
      goto LABEL_60;
    }
    v42 = 0i64;
    if( v41 )
      v42 = v9 + 1;
    v10 = 0;
    if( v41 == 4 )
    {
      v8 = *v42;
      Size = *v42;
      goto LABEL_60;
    }
    return(unsigned int)-1073741789;
  }
  v10 = -1073741811;
LABEL_60:
  if( v10 >= 0 )
  {
    if( v8 )
    {
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, v8, 0x20534C53ui64);
      Src = PoolWithTag;
      if( !PoolWithTag )
        return(unsigned int)-1073741801;
      memset((INT64)PoolWithTag, 0i64);
      v8 = Size;
    }
    else
    {
      v4 = 1;
    }
    if( qword_140D2C450 )
    {
      v44 = 0i64;
      if( !v4 )
        v44 = Src;
      v45 = qword_140D2C450(v87, v31, v30, v37, v36, v44, v8, &v88);
    }
    else
    {
      v45 = -1073741637;
    }
    v46 = Size + 4;
    if( Size >= 0xFFFFFFFC )
    {
      v10 = -1073741675;
    }
    else
    {
      if( v46 >= 0xFFFFFFEC || (v7 = Size + 32, Size + 32 < Size + 24) )
      {
        v10 = -1073741675;
        goto LABEL_161;
      }
      v10 = 0;
    }
    if( v10 < 0 )
    {
LABEL_161:
      if( Src )
        ExFreePoolWithTag(Src, 0x20534C53u);
      return(unsigned int)v10;
    }
    v47 = 0;
    if( v7 >= 0xFFFFFFF8 )
      goto LABEL_160;
    v48 = (v7 + 15) & 0xFFFFFFF8;
    if( v48 >= v7 + 8 )
    {
      v47 = v48 + 8;
      if( v48 + 8 < v48 )
        goto LABEL_88;
      v10 = 0;
    }
    else
    {
      v10 = -1073741675;
    }
    if( v10 < 0 )
      goto LABEL_161;
    v49 = *(_DWORD *)(a2 + 16);
    v50 = v47 + 4;
    v51 = v47 + 8;
    if( v51 >= v50 )
    {
      v52 = v51 + v49;
      if( v51 + v49 >= v51 && v52 + 4 >= v52 )
      {
        v10 = v52 + 4 + *(_DWORD *)(a2 + 32) < v52 + 4 ? 0xC0000095 : 0;
        goto LABEL_89;
      }
    }
LABEL_88:
    v10 = -1073741675;
LABEL_89:
    if( v10 < 0 )
      goto LABEL_161;
    if( !a4 )
    {
      v10 = -1073741811;
      goto LABEL_161;
    }
    v10 = 0;
    *(_DWORD *)(a4 + 4) = v7;
    if( v7 )
    {
      v53 = ExAllocatePoolWithTag(PagedPool, v7, 0x20534C53ui64);
      if( v53 )
      {
        *(_QWORD *)(a4 + 8) = v53;
        *(_DWORD *)a4 = 0;
      }
      else
      {
        v10 = -1073741801;
      }
    }
    else
    {
      v10 = -1073741762;
    }
    if( v10 < 0 )
      goto LABEL_161;
    v54 = *(_QWORD *)(a4 + 8);
    v55 = v45 | 0x10000000;
    v56 = -1;
    if( v54 )
    {
      v60 = 0;
      v61 = *(_DWORD **)(a4 + 8);
      if( *(_DWORD *)a4 )
      {
        while( 1 )
        {
          v62 = *v61 + 4;
          if( *v61 >= 0xFFFFFFFC )
            break;
          if( (_DWORD *)((char *)v61 + v62) < v61 )
            goto LABEL_160;
          ++v60;
          v61 = (_DWORD *)((char *)v61 + v62);
          if( v60 >= *(_DWORD *)a4 )
            goto LABEL_107;
        }
        v10 = -1073741675;
      }
      else
      {
LABEL_107:
        if( v61 + 1 < v61 )
          goto LABEL_160;
        v10 = 0;
        if( (unsigned __int64)(v61 + 2) > v54 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
          goto LABEL_109;
        *v61 = 4;
        v61[1] = v55;
        ++*(_DWORD *)a4;
      }
    }
    else
    {
      v57 = *(_DWORD *)(a4 + 4);
      v58 = -1;
      v59 = v57 + 8;
      if( v57 + 8 >= v57 )
        v58 = v57 + 8;
      v10 = v59 < v57 ? 0xC0000095 : 0;
      *(_DWORD *)(a4 + 4) = v58;
      if( v59 >= v57 )
      {
        ++*(_DWORD *)a4;
        goto LABEL_113;
      }
    }
    if( v10 < 0 )
      goto LABEL_161;
LABEL_113:
    v63 = *(_QWORD *)(a4 + 8);
    if( v63 )
    {
      v67 = 0;
      v68 = *(_QWORD *)(a4 + 8);
      if( *(_DWORD *)a4 )
      {
        while( 1 )
        {
          v69 = *(_DWORD *)v68 + 4;
          if( *(_DWORD *)v68 >= 0xFFFFFFFC )
            break;
          if( v68 + v69 < v68 )
            goto LABEL_160;
          ++v67;
          v68 += v69;
          if( v67 >= *(_DWORD *)a4 )
            goto LABEL_122;
        }
        v10 = -1073741675;
      }
      else
      {
LABEL_122:
        if( v68 + 4 < v68 )
          goto LABEL_160;
        v10 = 0;
        if( v68 + 12 > v63 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
          goto LABEL_109;
        v70 = v90;
        *(_DWORD *)v68 = 8;
        *(_QWORD *)(v68 + 4) = v70;
        ++*(_DWORD *)a4;
      }
    }
    else
    {
      v64 = *(_DWORD *)(a4 + 4);
      v65 = -1;
      v66 = v64 + 12;
      if( v64 + 12 >= v64 )
        v65 = v64 + 12;
      v10 = v66 < v64 ? 0xC0000095 : 0;
      *(_DWORD *)(a4 + 4) = v65;
      if( v66 >= v64 )
      {
        ++*(_DWORD *)a4;
        goto LABEL_126;
      }
    }
    if( v10 < 0 )
      goto LABEL_161;
LABEL_126:
    v71 = (UINT8 *)Src;
    if( Src )
    {
      if( !Size )
        goto LABEL_128;
    }
    else if( Size )
    {
LABEL_128:
      v10 = -1073741811;
      goto LABEL_129;
    }
    v76 = *(_QWORD *)(a4 + 8);
    if( v76 )
    {
      v80 = 0;
      v81 = *(_QWORD *)(a4 + 8);
      if( !*(_DWORD *)a4 )
      {
LABEL_148:
        if( v81 + 4 < v81 )
          goto LABEL_160;
        v10 = 0;
        if( v81 + Size + 4i64 > v76 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
          goto LABEL_109;
        *(_DWORD *)v81 = Size;
        if( v71 )
          memmove((UINT8 *)(v81 + 4), v71, Size);
        ++*(_DWORD *)a4;
        goto LABEL_129;
      }
      while( 1 )
      {
        v82 = *(_DWORD *)v81 + 4;
        if( *(_DWORD *)v81 >= 0xFFFFFFFC )
          break;
        if( v81 + v82 < v81 )
          goto LABEL_160;
        ++v80;
        v81 += v82;
        if( v80 >= *(_DWORD *)a4 )
          goto LABEL_148;
      }
    }
    else if( v46 >= 4 )
    {
      v77 = *(_DWORD *)(a4 + 4);
      v78 = -1;
      v79 = v77 + v46;
      if( v77 + v46 >= v77 )
        v78 = v77 + v46;
      v10 = v79 < v77 ? 0xC0000095 : 0;
      *(_DWORD *)(a4 + 4) = v78;
      if( v79 >= v77 )
      {
        ++*(_DWORD *)a4;
        goto LABEL_130;
      }
LABEL_129:
      if( v10 < 0 )
        goto LABEL_161;
LABEL_130:
      v72 = *(_QWORD *)(a4 + 8);
      v73 = v88;
      if( !v72 )
      {
        v74 = *(_DWORD *)(a4 + 4);
        v75 = v74 + 8;
        if( v74 + 8 >= v74 )
          v56 = v74 + 8;
        v10 = v75 < v74 ? 0xC0000095 : 0;
        *(_DWORD *)(a4 + 4) = v56;
        if( v75 >= v74 )
        {
          ++*(_DWORD *)a4;
          v10 = 0;
        }
        goto LABEL_161;
      }
      v83 = 0;
      for( ii = *(_DWORD **)(a4 + 8); v83 < *(_DWORD *)a4; ii = (_DWORD *)((char *)ii + v85) )
      {
        v85 = *ii + 4;
        if( *ii >= 0xFFFFFFFC || (_DWORD *)((char *)ii + v85) < ii )
          goto LABEL_160;
        ++v83;
      }
      if( ii + 1 >= ii )
      {
        v10 = 0;
        if( (unsigned __int64)(ii + 2) <= v72 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
        {
          *ii = 4;
          ii[1] = v73;
          ++*(_DWORD *)a4;
          goto LABEL_161;
        }
LABEL_109:
        v10 = -1073741789;
        goto LABEL_161;
      }
LABEL_160:
      v10 = -1073741675;
      goto LABEL_161;
    }
    v10 = -1073741675;
    goto LABEL_129;
  }
  return(unsigned int)v10;
}

Referenced by:

sub_1405F50F8