sub_1409612A0

__int64 __fastcall sub_1409612A0(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
  unsigned int v6; 
  void *v7; 
  unsigned int *v8; 
  signed int v9; 
  unsigned int *v10; 
  unsigned int i; 
  __int64 v12; 
  unsigned int *v13; 
  unsigned int v14; 
  __int64 *v15; 
  __int64 *v16; 
  unsigned int *v17; 
  unsigned int j; 
  __int64 v19; 
  unsigned int *v20; 
  unsigned int v21; 
  unsigned int *v22; 
  unsigned int *v23; 
  WCHAR *v24; 
  UINT64 v25; 
  unsigned int k; 
  __int64 v27; 
  unsigned int *v28; 
  UINT64 v29; 
  unsigned int *v30; 
  __int64 v31; 
  size_t v32; 
  VOID **PoolWithTag; 
  VOID **v34; 
  unsigned int v35; 
  unsigned int *v36; 
  unsigned int m; 
  __int64 v38; 
  unsigned int *v39; 
  unsigned int v40; 
  unsigned int *v41; 
  unsigned int *v43; 
  unsigned int n; 
  __int64 v45; 
  unsigned int *v46; 
  unsigned int v47; 
  unsigned int *v48; 
  unsigned int ii; 
  __int64 v50; 
  unsigned int *v51; 
  unsigned int v52; 
  size_t *v53; 
  size_t v54; 
  size_t v55; 
  int v56; 
  VOID **v57; 
  VOID *v58; 
  int v59; 
  unsigned int v60; 
  int v61; 
  unsigned int v62; 
  unsigned int v63; 
  int v64; 
  unsigned int v65; 
  unsigned int v66; 
  unsigned int v67; 
  VOID **v68; 
  __int64 v69; 
  int v70; 
  int v71; 
  unsigned int v72; 
  int v73; 
  unsigned int v74; 
  _DWORD *v75; 
  unsigned int v76; 
  unsigned int v77; 
  __int64 v78; 
  unsigned int v79; 
  int v80; 
  unsigned int v81; 
  unsigned __int64 v82; 
  unsigned int v83; 
  unsigned int v84; 
  __int64 v85; 
  VOID *v86; 
  __int64 v87; 
  int v88; 
  unsigned int v89; 
  unsigned int v90; 
  __int64 v91; 
  unsigned int v92; 
  int v93; 
  unsigned int v94; 
  size_t *v95; 
  unsigned int kk; 
  unsigned int v97; 
  _DWORD *v98; 
  unsigned int jj; 
  unsigned int v100; 
  unsigned int v101; 
  int v102; 
  VOID *Src; 
  PVOID P; 
  UINT64 pcbLength; 
  __int64 v106; 
  size_t Size; 

  v106 = 0i64;
  P = 0i64;
  v6 = 0;
  v101 = 0;
  v7 = 0i64;
  Size = 0;
  v8 = *(unsigned int **)(a1 + 8);
  Src = 0i64;
  v102 = 0;
  if( v8 && *(_DWORD *)a1 > 3u )
  {
    v10 = v8;
    for( i = 0; i < 3; ++i )
    {
      v12 = *v10;
      v13 = v10 + 1;
      if( v10 + 1 < v10 )
        goto LABEL_14;
      v10 = (unsigned int *)((char *)v13 + v12);
      if( (unsigned int *)((char *)v13 + v12) < v13 )
        goto LABEL_14;
    }
    v14 = *v10;
    v15 = (__int64 *)(v10 + 1);
    if( v10 + 1 < v10 )
    {
LABEL_14:
      v9 = -1073741675;
    }
    else
    {
      v16 = 0i64;
      if( v14 )
        v16 = v15;
      v9 = 0;
      if( v14 != 8 )
        return(unsigned int)-1073741789;
      v106 = *v16;
    }
  }
  else
  {
    v9 = -1073741811;
  }
  if( v9 < 0 )
    return(unsigned int)v9;
  if( v8 && *(_DWORD *)a1 > 4u )
  {
    v17 = v8;
    for( j = 0; j < 4; ++j )
    {
      v19 = *v17;
      v20 = v17 + 1;
      if( v17 + 1 < v17 )
        goto LABEL_28;
      v17 = (unsigned int *)((char *)v20 + v19);
      if( (unsigned int *)((char *)v20 + v19) < v20 )
        goto LABEL_28;
    }
    v21 = *v17;
    v22 = v17 + 1;
    if( v17 + 1 < v17 )
    {
LABEL_28:
      v9 = -1073741675;
    }
    else
    {
      v23 = 0i64;
      if( v21 )
        v23 = v22;
      v9 = 0;
      if( v21 != 4 )
        return(unsigned int)-1073741789;
      v101 = *v23;
    }
  }
  else
  {
    v9 = -1073741811;
  }
  if( v9 < 0 )
    return(unsigned int)v9;
  pcbLength = 0i64;
  v24 = 0i64;
  LODWORD(v25) = 0;
  if( v8 && *(_DWORD *)a1 > 5u )
  {
    for( k = 0; k < 5; ++k )
    {
      v27 = *v8;
      v28 = v8 + 1;
      if( v8 + 1 < v8 )
        goto LABEL_53;
      v8 = (unsigned int *)((char *)v28 + v27);
      if( (unsigned int *)((char *)v28 + v27) < v28 )
        goto LABEL_53;
    }
    v29 = *v8;
    if( v8 + 1 < v8 )
    {
LABEL_53:
      v9 = -1073741675;
    }
    else
    {
      if( (_DWORD)v29 )
        v24 = (WCHAR *)(v8 + 1);
      v9 = 0;
      if( !(_DWORD)v29 || (v29 & 1) != 0 )
        return(unsigned int)-1073741762;
      if( v24[(v29 >> 1) - 1] )
        return(unsigned int)-1073741762;
      if( StringCbLengthW(v24, v29, &pcbLength) < 0 || pcbLength + 2 != v31 )
        return(unsigned int)-1073741762;
      v25 = pcbLength >> 1;
    }
  }
  else
  {
    v9 = -1073741811;
  }
  if( v9 < 0 )
    return(unsigned int)v9;
  if( 2 * (_DWORD)v25 == -2 )
    return(unsigned int)-1073741762;
  v32 = 2 * v25 + 2;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v32, 542329939i64);
  v34 = PoolWithTag;
  if( !PoolWithTag )
    return(unsigned int)-1073741801;
  memmove(PoolWithTag, v24, v32);
  P = v34;
  v30 = *(unsigned int **)(a1 + 8);
  if( !v30 || (v35 = *(_DWORD *)a1, *(_DWORD *)a1 <= 6u) )
  {
    v9 = -1073741811;
    goto LABEL_70;
  }
  v36 = *(unsigned int **)(a1 + 8);
  for( m = 0; m < 6; ++m )
  {
    v38 = *v36;
    v39 = v36 + 1;
    if( v36 + 1 >= v36 )
    {
      v36 = (unsigned int *)((char *)v39 + v38);
      if( (unsigned int *)((char *)v39 + v38) >= v39 )
        continue;
    }
    v9 = -1073741675;
    goto LABEL_70;
  }
  v40 = *v36;
  if( v36 + 1 < v36 )
  {
    v9 = -1073741675;
    goto LABEL_69;
  }
  v41 = 0i64;
  if( v40 )
    v41 = v36 + 1;
  if( v35 <= 7 )
  {
    v9 = -1073741811;
    goto LABEL_69;
  }
  v43 = *(unsigned int **)(a1 + 8);
  for( n = 0; n < 7; ++n )
  {
    v45 = *v43;
    v46 = v43 + 1;
    if( v43 + 1 < v43 )
      goto LABEL_201;
    v43 = (unsigned int *)((char *)v46 + v45);
    if( (unsigned int *)((char *)v46 + v45) < v46 )
      goto LABEL_201;
  }
  v47 = *v43;
  if( v43 + 1 < v43 )
  {
LABEL_201:
    v9 = -1073741675;
LABEL_69:
    v7 = 0i64;
    goto LABEL_70;
  }
  v48 = 0i64;
  if( v47 )
    v48 = v43 + 1;
  if( v35 > 8 )
  {
    for( ii = 0; ii < 8; ++ii )
    {
      v50 = *v30;
      v51 = v30 + 1;
      if( v30 + 1 < v30 )
        goto LABEL_94;
      v30 = (unsigned int *)((char *)v51 + v50);
      if( (unsigned int *)((char *)v51 + v50) < v51 )
        goto LABEL_94;
    }
    v52 = *v30;
    if( v30 + 1 < v30 )
    {
LABEL_94:
      v9 = -1073741675;
      goto LABEL_95;
    }
    v53 = 0i64;
    if( v52 )
      v53 = v30 + 1;
    v9 = 0;
    if( v52 != 4 )
    {
      v9 = -1073741789;
      goto LABEL_69;
    }
    v54 = *v53;
    Size = *v53;
  }
  else
  {
    v9 = -1073741811;
LABEL_95:
    v54 = 0;
  }
  if( v9 < 0 )
    goto LABEL_69;
  if( v54 )
  {
    v55 = v54;
    v56 = 0;
    v57 = ExAllocatePoolWithTag(1ui64, v54, 542329939i64);
    Src = v57;
    if( !v57 )
    {
      v9 = -1073741801;
      v7 = 0i64;
      goto LABEL_70;
    }
    memset(v57, 0i64, v55);
    v54 = Size;
  }
  else
  {
    v56 = 1;
  }
  if( qword_140D2C400 )
  {
    v58 = 0i64;
    if( !v56 )
      v58 = Src;
    v59 = qword_140D2C400(v101, P, v41, v40, v48, v47, v58, v54, &v102);
  }
  else
  {
    v59 = -1073741637;
  }
  v60 = Size + 4;
  if( Size < 0xFFFFFFFC )
  {
    if( v60 < 0xFFFFFFEC )
    {
      v6 = Size + 32;
      if( Size + 32 >= Size + 24 )
      {
        v9 = 0;
        v61 = -1073741675;
        goto LABEL_114;
      }
    }
LABEL_111:
    v9 = -1073741675;
LABEL_112:
    v7 = Src;
    goto LABEL_70;
  }
  v61 = -1073741675;
  v9 = -1073741675;
LABEL_114:
  if( v9 < 0 )
    goto LABEL_112;
  v62 = 0;
  if( v6 >= 0xFFFFFFF8 )
  {
LABEL_116:
    v9 = v61;
    goto LABEL_112;
  }
  v63 = (v6 + 15) & 0xFFFFFFF8;
  if( v63 < v6 + 8 )
  {
    v9 = -1073741675;
    goto LABEL_121;
  }
  v62 = v63 + 8;
  if( v63 + 8 < v63 )
    goto LABEL_126;
  v9 = 0;
LABEL_121:
  if( v9 < 0 )
    goto LABEL_112;
  v64 = *(_DWORD *)(a2 + 16);
  v65 = v62 + 4;
  v66 = v62 + 8;
  if( v66 < v65 || (v67 = v66 + v64, v66 + v64 < v66) || v67 + 4 < v67 )
LABEL_126:
    v9 = -1073741675;
  else
    v9 = v67 + 4 + *(_DWORD *)(a2 + 32) < v67 + 4 ? 0xC0000095 : 0;
  if( v9 < 0 )
    goto LABEL_112;
  if( !a4 )
  {
    v9 = -1073741811;
    goto LABEL_112;
  }
  *(_DWORD *)(a4 + 4) = v6;
  v9 = 0;
  if( v6 )
  {
    v68 = ExAllocatePoolWithTag(1ui64, v6, 542329939i64);
    if( v68 )
    {
      *(_QWORD *)(a4 + 8) = v68;
      *(_DWORD *)a4 = 0;
    }
    else
    {
      v9 = -1073741801;
    }
  }
  else
  {
    v9 = -1073741762;
  }
  if( v9 < 0 )
    goto LABEL_112;
  v69 = *(_QWORD *)(a4 + 8);
  v70 = v59 | 0x10000000;
  v71 = -1;
  if( v69 )
  {
    v75 = *(_DWORD **)(a4 + 8);
    v76 = 0;
    if( *(_DWORD *)a4 )
    {
      while( 1 )
      {
        v77 = *v75 + 4;
        if( *v75 >= 0xFFFFFFFC )
          break;
        if( (_DWORD *)((char *)v75 + v77) < v75 )
          goto LABEL_116;
        ++v76;
        v75 = (_DWORD *)((char *)v75 + v77);
        if( v76 >= *(_DWORD *)a4 )
          goto LABEL_145;
      }
      v9 = -1073741675;
      goto LABEL_150;
    }
LABEL_145:
    if( v75 + 1 < v75 )
      goto LABEL_116;
    v9 = 0;
    if( (unsigned __int64)(v75 + 2) <= v69 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
    {
      *v75 = 4;
      v75[1] = v70;
      ++*(_DWORD *)a4;
      goto LABEL_150;
    }
    goto LABEL_147;
  }
  v72 = *(_DWORD *)(a4 + 4);
  v73 = -1;
  v74 = v72 + 8;
  if( v72 + 8 >= v72 )
    v73 = v72 + 8;
  v9 = v74 < v72 ? 0xC0000095 : 0;
  *(_DWORD *)(a4 + 4) = v73;
  if( v74 >= v72 )
  {
    ++*(_DWORD *)a4;
    goto LABEL_151;
  }
LABEL_150:
  if( v9 < 0 )
    goto LABEL_112;
LABEL_151:
  v78 = *(_QWORD *)(a4 + 8);
  if( v78 )
  {
    v82 = *(_QWORD *)(a4 + 8);
    v83 = 0;
    if( *(_DWORD *)a4 )
    {
      while( 1 )
      {
        v84 = *(_DWORD *)v82 + 4;
        if( *(_DWORD *)v82 >= 0xFFFFFFFC )
          break;
        if( v82 + v84 < v82 )
          goto LABEL_116;
        ++v83;
        v82 += v84;
        if( v83 >= *(_DWORD *)a4 )
          goto LABEL_160;
      }
      v9 = -1073741675;
      goto LABEL_163;
    }
LABEL_160:
    if( v82 + 4 < v82 )
      goto LABEL_116;
    v9 = 0;
    if( v82 + 12 <= v78 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
    {
      v85 = v106;
      *(_DWORD *)v82 = 8;
      *(_QWORD *)(v82 + 4) = v85;
      ++*(_DWORD *)a4;
      goto LABEL_163;
    }
    goto LABEL_147;
  }
  v79 = *(_DWORD *)(a4 + 4);
  v80 = -1;
  v81 = v79 + 12;
  if( v79 + 12 >= v79 )
    v80 = v79 + 12;
  v9 = v81 < v79 ? 0xC0000095 : 0;
  *(_DWORD *)(a4 + 4) = v80;
  if( v81 >= v79 )
  {
    ++*(_DWORD *)a4;
    goto LABEL_164;
  }
LABEL_163:
  if( v9 < 0 )
    goto LABEL_112;
LABEL_164:
  v86 = Src;
  v61 = 0;
  if( Src )
  {
    if( Size )
      goto LABEL_175;
LABEL_166:
    v9 = -1073741811;
    goto LABEL_167;
  }
  if( Size )
    goto LABEL_166;
LABEL_175:
  v91 = *(_QWORD *)(a4 + 8);
  if( !v91 )
  {
    if( v60 >= 4 )
    {
      v92 = *(_DWORD *)(a4 + 4);
      v93 = -1;
      v94 = v92 + v60;
      if( v92 + v60 >= v92 )
        v93 = v92 + v60;
      v9 = v94 < v92 ? 0xC0000095 : 0;
      *(_DWORD *)(a4 + 4) = v93;
      if( v94 >= v92 )
      {
        ++*(_DWORD *)a4;
        goto LABEL_168;
      }
LABEL_167:
      if( v9 < 0 )
        goto LABEL_112;
LABEL_168:
      v87 = *(_QWORD *)(a4 + 8);
      v88 = v102;
      if( !v87 )
      {
        v89 = *(_DWORD *)(a4 + 4);
        v90 = v89 + 8;
        if( v89 + 8 >= v89 )
          v71 = v89 + 8;
        v9 = v90 < v89 ? 0xC0000095 : 0;
        *(_DWORD *)(a4 + 4) = v71;
        if( v90 < v89 )
          goto LABEL_112;
        ++*(_DWORD *)a4;
        goto LABEL_116;
      }
      v98 = *(_DWORD **)(a4 + 8);
      for( jj = 0; jj < *(_DWORD *)a4; v98 = (_DWORD *)((char *)v98 + v100) )
      {
        v100 = *v98 + 4;
        if( *v98 >= 0xFFFFFFFC || (_DWORD *)((char *)v98 + v100) < v98 )
          goto LABEL_111;
        ++jj;
      }
      if( v98 + 1 < v98 )
        goto LABEL_111;
      v9 = 0;
      if( (unsigned __int64)(v98 + 2) <= v87 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
      {
        *v98 = 4;
        v98[1] = v88;
        ++*(_DWORD *)a4;
        goto LABEL_112;
      }
LABEL_147:
      v9 = -1073741789;
      goto LABEL_112;
    }
LABEL_181:
    v9 = -1073741675;
    goto LABEL_167;
  }
  v95 = *(size_t **)(a4 + 8);
  for( kk = 0; kk < *(_DWORD *)a4; v95 = (size_t *)((char *)v95 + v97) )
  {
    v97 = *v95 + 4;
    if( *v95 >= 0xFFFFFFFC )
      goto LABEL_181;
    if( (size_t *)((char *)v95 + v97) < v95 )
      goto LABEL_189;
    ++kk;
  }
  if( v95 + 1 < v95 )
  {
LABEL_189:
    v9 = -1073741675;
  }
  else
  {
    v9 = 0;
    if( (unsigned __int64)v95 + Size + 4 <= v91 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
    {
      *v95 = Size;
      if( v86 )
        memmove(v95 + 1, v86, Size);
      ++*(_DWORD *)a4;
      goto LABEL_167;
    }
    v9 = -1073741789;
  }
  v7 = Src;
LABEL_70:
  if( P )
    ExFreePoolWithTag(P, 0x20534C53u);
  if( v7 )
    ExFreePoolWithTag(v7, 0x20534C53u);
  return(unsigned int)v9;
}

Referenced by:

sub_1405F50F8