sub_140960EA4

INT64 __fastcall sub_140960EA4(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
  signed int v7; 
  unsigned int *v8; 
  unsigned int *v9; 
  unsigned int i; 
  __int64 v11; 
  unsigned int *v12; 
  unsigned int v13; 
  unsigned int *v14; 
  unsigned int *v15; 
  wchar_t *v16; 
  size_t v17; 
  unsigned int j; 
  __int64 v19; 
  unsigned int *v20; 
  size_t v21; 
  unsigned int *v22; 
  __int64 v23; 
  unsigned int v24; 
  UINT64 v25; 
  UINT8 *PoolWithTag; 
  UINT8 *v27; 
  UINT8 *v28; 
  unsigned int *v29; 
  unsigned int k; 
  __int64 v31; 
  unsigned int *v32; 
  unsigned int v33; 
  unsigned int *v34; 
  unsigned int m; 
  __int64 v36; 
  unsigned int *v37; 
  unsigned int *v38; 
  int v39; 
  int v40; 
  unsigned int v41; 
  _DWORD *v42; 
  int v43; 
  unsigned int v44; 
  __int64 v45; 
  unsigned int v46; 
  int v47; 
  unsigned int v48; 
  unsigned __int64 v49; 
  unsigned int v50; 
  unsigned int v51; 
  __int64 v53; 
  size_t pcbLength; 
  v53 = 0i64;
  if( !a2 || !a4 )
    return(unsigned int)-1073741811;
  v8 = *(unsigned int **)(a1 + 8);
  if( v8 && *(_DWORD *)a1 > 3u )
  {
    v9 = v8;
    for( i = 0; i < 3; ++i )
    {
      v11 = *v9;
      v12 = v9 + 1;
      if( v9 + 1 < v9 )
        goto LABEL_17;
      v9 = (unsigned int *)((char *)v12 + v11);
      if( (unsigned int *)((char *)v12 + v11) < v12 )
        goto LABEL_17;
    }
    v13 = *v9;
    v14 = v9 + 1;
    if( v9 + 1 < v9 )
    {
LABEL_17:
      v7 = -1073741675;
    }
    else
    {
      v15 = 0i64;
      if( v13 )
        v15 = v14;
      v7 = 0;
      if( v13 != 8 )
        return(unsigned int)-1073741789;
      v53 = *(_QWORD *)v15;
    }
  }
  else
  {
    v7 = -1073741811;
  }
  if( v7 < 0 )
    return(unsigned int)v7;
  pcbLength = 0i64;
  v16 = 0i64;
  LODWORD(v17) = 0;
  if( v8 && *(_DWORD *)a1 > 4u )
  {
    for( j = 0; j < 4; ++j )
    {
      v19 = *v8;
      v20 = v8 + 1;
      if( v8 + 1 < v8 )
        goto LABEL_39;
      v8 = (unsigned int *)((char *)v20 + v19);
      if( (unsigned int *)((char *)v20 + v19) < v20 )
        goto LABEL_39;
    }
    v21 = *v8;
    if( v8 + 1 < v8 )
    {
LABEL_39:
      v7 = -1073741675;
    }
    else
    {
      if( (_DWORD)v21 )
        v16 = (wchar_t *)(v8 + 1);
      v7 = 0;
      if( !(_DWORD)v21
        || (v21 & 1) != 0
        || v16[(v21 >> 1) - 1]
        || StringCbLengthW(v16, v21, &pcbLength) < 0
        || pcbLength + 2 != v23 )
      {
        return(unsigned int)-1073741762;
      }
      v17 = pcbLength >> 1;
    }
  }
  else
  {
    v7 = -1073741811;
  }
  if( v7 < 0 )
    return(unsigned int)v7;
  v24 = 2 * v17 + 2;
  if( 2 * (_DWORD)v17 == -2 )
    return(unsigned int)-1073741762;
  v25 = v24;
  PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v24, 0x20534C53ui64);
  v27 = PoolWithTag;
  if( !PoolWithTag )
    return(unsigned int)-1073741801;
  memmove(PoolWithTag, (UINT8 *)v16, v25);
  v28 = v27;
  v22 = *(unsigned int **)(a1 + 8);
  if( !v22 || *(_DWORD *)a1 <= 5u )
    goto LABEL_33;
  v29 = *(unsigned int **)(a1 + 8);
  for( k = 0; k < 5; ++k )
  {
    v31 = *v29;
    v32 = v29 + 1;
    if( v29 + 1 < v29 )
      goto LABEL_85;
    v29 = (unsigned int *)((char *)v32 + v31);
    if( (unsigned int *)((char *)v32 + v31) < v32 )
      goto LABEL_85;
  }
  v33 = *v29;
  if( v29 + 1 >= v29 )
  {
    v34 = 0i64;
    if( v33 )
      v34 = v29 + 1;
    if( *(_DWORD *)a1 > 6u )
    {
      for( m = 0; m < 6; ++m )
      {
        v36 = *v22;
        v37 = v22 + 1;
        if( v22 + 1 < v22 )
          goto LABEL_85;
        v22 = (unsigned int *)((char *)v37 + v36);
        if( (unsigned int *)((char *)v37 + v36) < v37 )
          goto LABEL_85;
      }
      if( v22 + 1 < v22 )
        goto LABEL_85;
      v38 = 0i64;
      if( *v22 )
        v38 = v22 + 1;
      if( qword_140D2C420 )
        v39 = qword_140D2C420(v28, v34, v33, v38, *v22);
      else
        v39 = -1073741637;
      v7 = v39;
      if( v39 < 0 )
        goto LABEL_86;
      v40 = *(_DWORD *)(a2 + 32);
      if( *(_DWORD *)(a2 + 16) < 0xFFFFFFD0 )
      {
        v41 = *(_DWORD *)(a2 + 16) + 52;
        if( v41 >= *(_DWORD *)(a2 + 16) + 48 )
        {
          v7 = v41 + v40 < v41 ? 0xC0000095 : 0;
          if( v41 + v40 < v41 )
            goto LABEL_86;
          *(_DWORD *)(a4 + 4) = 20;
          v42 = ExAllocatePoolWithTag(PagedPool, 0x14ui64, 0x20534C53ui64);
          if( !v42 )
          {
            v7 = -1073741801;
            goto LABEL_86;
          }
          *(_QWORD *)(a4 + 8) = v42;
          *(_DWORD *)a4 = 0;
          v43 = v39 | 0x10000000;
          if( v42 + 1 >= v42 )
          {
            if( v42 + 2 > (_DWORD *)((char *)v42 + *(unsigned int *)(a4 + 4)) )
            {
LABEL_72:
              v7 = -1073741789;
              goto LABEL_86;
            }
            *v42 = 4;
            v42[1] = v43;
            v44 = ++*(_DWORD *)a4;
            v45 = *(_QWORD *)(a4 + 8);
            if( !v45 )
            {
              v46 = *(_DWORD *)(a4 + 4);
              v47 = -1;
              v48 = v46 + 12;
              if( v46 + 12 >= v46 )
                v47 = v46 + 12;
              v7 = v48 < v46 ? 0xC0000095 : 0;
              *(_DWORD *)(a4 + 4) = v47;
              if( v48 >= v46 )
              {
                v7 = 0;
                *(_DWORD *)a4 = v44 + 1;
              }
              goto LABEL_86;
            }
            v49 = *(_QWORD *)(a4 + 8);
            v50 = 0;
            if( v44 )
            {
              while( 1 )
              {
                v51 = *(_DWORD *)v49 + 4;
                if( *(_DWORD *)v49 >= 0xFFFFFFFC || v49 + v51 < v49 )
                  break;
                ++v50;
                v49 += v51;
                if( v50 >= v44 )
                  goto LABEL_82;
              }
            }
            else
            {
LABEL_82:
              if( v49 + 4 >= v49 )
              {
                v7 = 0;
                if( v49 + 12 > v45 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
                  goto LABEL_72;
                *(_DWORD *)v49 = 8;
                *(_QWORD *)(v49 + 4) = v53;
                ++*(_DWORD *)a4;
                goto LABEL_86;
              }
            }
          }
        }
      }
      goto LABEL_85;
    }
LABEL_33:
    v7 = -1073741811;
    goto LABEL_86;
  }
LABEL_85:
  v7 = -1073741675;
LABEL_86:
  if( v28 )
    ExFreePoolWithTag(v28, 0x20534C53u);
  return(unsigned int)v7;
}

Referenced by:

sub_1405F50F8