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