int __fastcall sub_10B845F(int a1, unsigned int a2, int a3, signed int a4)
{
signed int v4;
//
edi@1
unsigned int v5;
//
eax@1
int v6;
//
edx@6
int v7;
//
ebx@6
int v8;
//
esi@6
unsigned int v9;
//
edi@7
int v10;
//
eax@8
int v11;
//
ecx@8
int v12;
//
eax@8
int v13;
//
ecx@11
int v14;
//
eax@11
int v15;
//
esi@11
int v16;
//
edx@11
int v17;
//
edi@21
signed int v18;
//
ecx@21
int v19;
//
esi@21
int v20;
//
eax@23
int v21;
//
ecx@23
int result;
//
eax@25
int v23;
//
eax@26
int v24;
//
[sp+Ch] [bp-11Ch]@1
int v25;
//
[sp+18h] [bp-110h]@6
int v26;
//
[sp+18h] [bp-110h]@25
int v27;
//
[sp+1Ch] [bp-10Ch]@6
int v28;
//
[sp+1Ch] [bp-10Ch]@25
unsigned int v29;
//
[sp+20h] [bp-108h]@1
int v30;
//
[sp+20h] [bp-108h]@23
int v31;
//
[sp+24h] [bp-104h]@8
int v32[63];
//
[sp+28h] [bp-100h]@8
unsigned int v33;
//
[sp+124h] [bp-4h]@1
int v34;
//
[sp+128h] [bp+0h]@1
v33 = (unsigned int)&v34 ^ __security_cookie;
v4 = a4;
v5 = a2;
v29 = a2;
v24 = a1;
if
( a4 != 16 && a4 != 12 )
{
if
( a4 != 8 )
v4 = 16;
a4 = v4;
}
v6 = a3;
v7 = 0;
*(_DWORD *)a1 = v4;
v8 = 0;
v25 = 0;
v27 = 0;
if
( ((v5 - 8) & 0x80000000u) == 0 )
{
v9 = v5 >> 3;
v27 = 8 * (v5 >> 3);
do
{
v10 = *(_BYTE *)(v6 + 5);
*(&v31 + v8) = (*(_BYTE *)(v6 + 3) << 24) | (*(_BYTE *)(v6 + 2) << 16) | (*(_BYTE *)(v6 + 1) << 8) | *(_BYTE *)v6;
v11 = (*(_BYTE *)(v6 + 6) << 16) | (v10 << 8) | *(_BYTE *)(v6 + 4);
v12 = *(_BYTE *)(v6 + 7) << 24;
v6 += 8;
v32[v8] = v12 | v11;
v8 += 2;
--v9;
}
while
( v9 );
v4 = a4;
v5 = v29;
v25 = v8;
}
if
( v5 != v27 )
{
v13 = 0;
v14 = v29 & 7;
v15 = 0;
v16 = v14 + v6;
switch ( v14 )
{
case
8:
--v16;
v13 = *(_BYTE *)v16 << 24;
goto LABEL_13;
case
7:
LABEL_13:
--v16;
v13 |= *(_BYTE *)v16 << 16;
goto LABEL_14;
case
6:
LABEL_14:
--v16;
v13 |= *(_BYTE *)v16 << 8;
goto LABEL_15;
case
5:
LABEL_15:
--v16;
v13 |= *(_BYTE *)v16;
goto LABEL_16;
case
4:
LABEL_16:
--v16;
v15 = *(_BYTE *)v16 << 24;
goto LABEL_17;
case
3:
LABEL_17:
--v16;
v15 |= *(_BYTE *)v16 << 16;
goto LABEL_18;
case
2:
LABEL_18:
--v16;
v15 |= *(_BYTE *)v16 << 8;
goto LABEL_19;
case
1:
LABEL_19:
v15 |= *(_BYTE *)(v16 - 1);
break
;
default:
break
;
}
*(&v31 + v25) = v15;
v32[v25] = v13;
}
v17 = 2 * v4 + 2;
v18 = 1;
v19 = (signed int)(v29 + 3) / 4;
for
( *(_DWORD *)(v24 + 4) = 0xB7E15163u; v18 < v17; ++v18 )
*(_DWORD *)(v24 + 4 * v18 + 4) = *(_DWORD *)(v24 + 4 * v18) - 0x61C88647;
v30 = 0;
v20 = v19;
v21 = 0;
if
( v17 > v19 )
v20 = v17;
v28 = 3 * v20;
result = 0;
v26 = 0;
if
( v28 > 0 )
{
do
{
v21 = __ROL__(*(_DWORD *)(v24 + 4 * result + 4) + v30 + v21, 3);
*(_DWORD *)(v24 + 4 * result + 4) = v21;
v23 = __ROL__(v21 + v30 + *(&v31 + v7), (v30 + (_BYTE)v21) & 0x1F);
*(&v31 + v7) = v23;
v30 = v23;
result = v26 + 1;
if
( v26 + 1 >= v17 )
result = 0;
++v7;
v26 = result;
if
( v7 >= v19 )
v7 = 0;
--v28;
}
while
( v28 );
}
return
result;
}
unsigned int __fastcall sub_10B7C16(int a1, int a2, unsigned int a3, int a4, int a5, int a6)
{
int v6;
//
edi@1
int v7;
//
edx@1
int v8;
//
esi@2
int v9;
//
ebx@2
int v10;
//
ecx@2
unsigned int v11;
//
eax@2
int v12;
//
esi@3
int v13;
//
ecx@4
int v14;
//
ecx@4
int v15;
//
eax@4
unsigned int v16;
//
eax@4
bool v17;
//
zf@4
int v18;
//
ecx@7
int v19;
//
edx@7
int v20;
//
eax@7
unsigned int v21;
//
eax@16
unsigned int result;
//
eax@17
int v23;
//
ebx@18
int v24;
//
ecx@18
int v25;
//
esi@18
bool v26;
//
sf@18
unsigned int v27;
//
eax@18
int v28;
//
ebx@19
int v29;
//
edi@20
int v30;
//
esi@20
int v31;
//
ecx@20
int v32;
//
edx@20
int v33;
//
eax@23
int v34;
//
ecx@23
int v35;
//
eax@23
int v36;
//
eax@23
int v37;
//
edx@23
int v38;
//
ecx@23
unsigned int v39;
//
edx@32
unsigned int v40;
//
[sp+Ch] [bp-1Ch]@4
int v41;
//
[sp+10h] [bp-18h]@4
int v42;
//
[sp+14h] [bp-14h]@18
unsigned int v43;
//
[sp+18h] [bp-10h]@7
int v44;
//
[sp+1Ch] [bp-Ch]@2
int v45;
//
[sp+20h] [bp-8h]@2
int v46;
//
[sp+24h] [bp-4h]@5
unsigned int v47;
//
[sp+30h] [bp+8h]@3
int v48;
//
[sp+30h] [bp+8h]@7
unsigned int v49;
//
[sp+30h] [bp+8h]@18
int v50;
//
[sp+3Ch] [bp+14h]@18
int v51;
//
[sp+3Ch] [bp+14h]@23
v6 = a2;
v7 = a1;
if
( a6 )
{
v8 = a5;
v9 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | (*(_BYTE *)(a5 + 1) << 8) | *(_BYTE *)a5;
v10 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v11 = a3 - 8;
v44 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v45 = a3 - 8;
if
( ((a3 - 8) & 0x80000000u) == 0 )
{
v12 = v7;
v47 = a3 >> 3;
v45 += -8 * v47;
do
{
v13 = (*(_BYTE *)(v12 + 5) << 8) | *(_BYTE *)(v12 + 4);
v40 = v9 ^ ((*(_BYTE *)(v12 + 3) << 24) | (*(_BYTE *)(v12 + 2) << 16) | (*(_BYTE *)(v12 + 1) << 8) | *(_BYTE *)v12);
v14 = (*(_BYTE *)(v12 + 6) << 16) | v13;
v15 = *(_BYTE *)(v12 + 7) << 24;
v12 += 8;
v41 = v44 ^ (v15 | v14);
sub_10B809E(&v40, a4);
v9 = v40;
v10 = v41;
v16 = v40 >> 8;
*(_BYTE *)v6 = v40;
*(_BYTE *)(v6 + 1) = v16;
*(_BYTE *)(v6 + 2) = (unsigned int)v9 >> 16;
*(_BYTE *)(v6 + 3) = BYTE3(v9);
*(_BYTE *)(v6 + 4) = v10;
*(_BYTE *)(v6 + 5) = BYTE1(v10);
*(_BYTE *)(v6 + 6) = (unsigned int)v10 >> 16;
*(_BYTE *)(v6 + 7) = BYTE3(v10);
v6 += 8;
v17 = v47-- == 1;
v44 = v10;
}
while
( !v17 );
v11 = v45;
v46 = v12;
v8 = a5;
v7 = v46;
}
if
( v11 != -8 )
{
v18 = v7 + v11 + 8;
v19 = 0;
v43 = v45 + 7;
v20 = 0;
v48 = 0;
switch ( v45 + 7 )
{
case
7:
--v18;
v19 = *(_BYTE *)v18 << 24;
goto LABEL_9;
case
6:
LABEL_9:
--v18;
v19 |= *(_BYTE *)v18 << 16;
goto LABEL_10;
case
5:
LABEL_10:
--v18;
v19 |= *(_BYTE *)v18 << 8;
goto LABEL_11;
case
4:
LABEL_11:
--v18;
v19 |= *(_BYTE *)v18;
goto LABEL_12;
case
3:
LABEL_12:
--v18;
v48 = *(_BYTE *)v18 << 24;
goto LABEL_13;
case
2:
LABEL_13:
--v18;
v48 |= *(_BYTE *)v18 << 16;
goto LABEL_14;
case
1:
LABEL_14:
--v18;
v48 |= *(_BYTE *)v18 << 8;
goto LABEL_15;
case
0:
LABEL_15:
v20 = *(_BYTE *)(v18 - 1) | v48;
break
;
default:
break
;
}
v41 = v44 ^ v19;
v40 = v9 ^ v20;
sub_10B809E(&v40, a4);
v9 = v40;
v10 = v41;
v21 = v40 >> 8;
*(_BYTE *)v6 = v40;
*(_BYTE *)(v6 + 1) = v21;
v8 = a5;
*(_BYTE *)(v6 + 2) = (unsigned int)v9 >> 16;
*(_BYTE *)(v6 + 3) = BYTE3(v9);
*(_BYTE *)(v6 + 4) = v10;
*(_BYTE *)(v6 + 5) = BYTE1(v10);
*(_BYTE *)(v6 + 6) = (unsigned int)v10 >> 16;
*(_BYTE *)(v6 + 7) = BYTE3(v10);
}
*(_BYTE *)v8 = v9;
*(_BYTE *)(v8 + 1) = BYTE1(v9);
*(_BYTE *)(v8 + 2) = (unsigned int)v9 >> 16;
*(_BYTE *)(v8 + 3) = BYTE3(v9);
*(_BYTE *)(v8 + 4) = v10;
*(_BYTE *)(v8 + 5) = BYTE1(v10);
result = (unsigned int)v10 >> 16;
*(_BYTE *)(v8 + 6) = (unsigned int)v10 >> 16;
*(_BYTE *)(v8 + 7) = BYTE3(v10);
}
else
{
v23 = a5;
v42 = a5;
v24 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | (*(_BYTE *)(a5 + 1) << 8) | *(_BYTE *)a5;
v50 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | (*(_BYTE *)(a5 + 1) << 8) | *(_BYTE *)a5;
v25 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v26 = ((a3 - 8) & 0x80000000u) != 0;
v27 = a3 - 8;
v45 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v49 = a3 - 8;
if
( !v26 )
{
v28 = v6;
v43 = (v27 + 8) >> 3;
v49 += -8 * v43;
do
{
v30 = (*(_BYTE *)(v7 + 5) << 8) | *(_BYTE *)(v7 + 4);
v40 = (*(_BYTE *)(v7 + 3) << 24) | (*(_BYTE *)(v7 + 2) << 16) | (*(_BYTE *)(v7 + 1) << 8) | *(_BYTE *)v7;
v29 = v40;
v25 = (*(_BYTE *)(v7 + 7) << 24) | (*(_BYTE *)(v7 + 6) << 16) | v30;
v46 = v7 + 8;
v41 = v25;
sub_10B82CE(&v40, a4);
v31 = v50 ^ v40;
v32 = v45 ^ v41;
*(_BYTE *)v28 = v50 ^ v40;
*(_BYTE *)(v28 + 1) = BYTE1(v31);
*(_BYTE *)(v28 + 2) = (unsigned int)v31 >> 16;
*(_BYTE *)(v28 + 3) = BYTE3(v31);
v24 = v29;
*(_BYTE *)(v28 + 4) = v32;
*(_BYTE *)(v28 + 5) = BYTE1(v32);
*(_BYTE *)(v28 + 6) = (unsigned int)v32 >> 16;
*(_BYTE *)(v28 + 7) = BYTE3(v32);
v28 += 8;
v17 = v43-- == 1;
v7 = v46;
v50 = v29;
v45 = v25;
}
while
( !v17 );
v27 = v49;
v44 = v28;
v23 = v42;
v6 = v44;
}
if
( v27 == -8 )
{
v39 = v45;
}
else
{
v33 = *(_BYTE *)(v7 + 5);
v42 = (*(_BYTE *)(v7 + 3) << 24) | (*(_BYTE *)(v7 + 2) << 16) | (*(_BYTE *)(v7 + 1) << 8) | *(_BYTE *)v7;
v40 = v42;
v34 = (v33 << 8) | *(_BYTE *)(v7 + 4);
v35 = *(_BYTE *)(v7 + 6);
v44 = v34;
v44 = ((v35 | (*(_BYTE *)(v7 + 7) << 8)) << 16) | v34;
v41 = v44;
sub_10B82CE(&v40, a4);
v36 = v25 ^ v41;
v37 = v50 ^ v40;
v51 = v25 ^ v41;
v38 = v6 + v49 + 8;
switch ( v49 + 7 )
{
case
7u:
--v38;
*(_BYTE *)v38 = BYTE3(v36);
v36 = v51;
goto LABEL_25;
case
6u:
LABEL_25:
--v38;
*(_BYTE *)v38 = (unsigned int)v36 >> 16;
BYTE1(v36) = BYTE1(v51);
goto LABEL_26;
case
5u:
LABEL_26:
--v38;
*(_BYTE *)v38 = BYTE1(v36);
LOBYTE(v36) = v51;
goto LABEL_27;
case
4u:
LABEL_27:
--v38;
*(_BYTE *)v38 = v36;
goto LABEL_28;
case
3u:
LABEL_28:
--v38;
*(_BYTE *)v38 = BYTE3(v37);
goto LABEL_29;
case
2u:
LABEL_29:
--v38;
*(_BYTE *)v38 = (unsigned int)v37 >> 16;
goto LABEL_30;
case
1u:
LABEL_30:
--v38;
*(_BYTE *)v38 = BYTE1(v37);
goto LABEL_31;
case
0u:
LABEL_31:
*(_BYTE *)(v38 - 1) = v37;
break
;
default:
break
;
}
v24 = v42;
v39 = v44;
}
*(_BYTE *)v23 = v24;
*(_BYTE *)(v23 + 1) = BYTE1(v24);
*(_BYTE *)(v23 + 2) = (unsigned int)v24 >> 16;
*(_BYTE *)(v23 + 3) = BYTE3(v24);
*(_BYTE *)(v23 + 4) = v39;
*(_BYTE *)(v23 + 5) = BYTE1(v39);
result = v39 >> 16;
*(_BYTE *)(v23 + 6) = v39 >> 16;
*(_BYTE *)(v23 + 7) = BYTE3(v39);
}
return
result;
}
int __fastcall sub_10B82CE(int a1, int a2)
{
int v2;
//
eax@1
int v3;
//
esi@1
int v4;
//
esi@2
int v5;
//
esi@2
int v6;
//
eax@2
int v7;
//
eax@2
int v8;
//
esi@2
int v9;
//
esi@2
int v10;
//
eax@2
int v11;
//
eax@2
int v12;
//
esi@2
int v13;
//
esi@2
int v14;
//
eax@2
int v15;
//
eax@2
int v16;
//
esi@2
int v17;
//
eax@2
int v18;
//
esi@4
int v19;
//
esi@4
int v20;
//
eax@4
int v21;
//
eax@4
int v22;
//
esi@4
int v23;
//
esi@4
int v24;
//
eax@4
int v25;
//
eax@4
int v26;
//
esi@4
int v27;
//
esi@4
int v28;
//
eax@4
int v29;
//
eax@4
int v30;
//
esi@4
int v31;
//
eax@4
int v32;
//
esi@5
int v33;
//
esi@5
int v34;
//
eax@5
int v35;
//
eax@5
int v36;
//
esi@5
int v37;
//
esi@5
int v38;
//
eax@5
int v39;
//
eax@5
int v40;
//
esi@5
int v41;
//
esi@5
int v42;
//
eax@5
int v43;
//
eax@5
int v44;
//
esi@5
int v45;
//
esi@5
int v46;
//
eax@5
int v47;
//
eax@5
int v48;
//
esi@5
int v49;
//
esi@5
int v50;
//
eax@5
int v51;
//
eax@5
int v52;
//
esi@5
int v53;
//
esi@5
int v54;
//
eax@5
int v55;
//
eax@5
int v56;
//
esi@5
int v57;
//
esi@5
int v58;
//
eax@5
int v59;
//
eax@5
int v60;
//
esi@5
int v61;
//
esi@5
int v62;
//
eax@5
int result;
//
eax@5
v2 = *(_DWORD *)a1;
v3 = *(_DWORD *)(a1 + 4);
if
( *(_DWORD *)a2 == 16 )
{
v4 = __ROR__(v3 - *(_DWORD *)(a2 + 136), v2 & 0x1F);
v5 = v2 ^ v4;
v6 = __ROR__(v2 - *(_DWORD *)(a2 + 132), v5 & 0x1F);
v7 = v5 ^ v6;
v8 = __ROR__(v5 - *(_DWORD *)(a2 + 128), v7 & 0x1F);
v9 = v7 ^ v8;
v10 = __ROR__(v7 - *(_DWORD *)(a2 + 124), v9 & 0x1F);
v11 = v9 ^ v10;
v12 = __ROR__(v9 - *(_DWORD *)(a2 + 120), v11 & 0x1F);
v13 = v11 ^ v12;
v14 = __ROR__(v11 - *(_DWORD *)(a2 + 116), v13 & 0x1F);
v15 = v13 ^ v14;
v16 = __ROR__(v13 - *(_DWORD *)(a2 + 112), v15 & 0x1F);
v3 = v15 ^ v16;
v17 = __ROR__(v15 - *(_DWORD *)(a2 + 108), v3 & 0x1F);
v2 = v3 ^ v17;
LABEL_4:
v18 = __ROR__(v3 - *(_DWORD *)(a2 + 104), v2 & 0x1F);
v19 = v2 ^ v18;
v20 = __ROR__(v2 - *(_DWORD *)(a2 + 100), v19 & 0x1F);
v21 = v19 ^ v20;
v22 = __ROR__(v19 - *(_DWORD *)(a2 + 96), v21 & 0x1F);
v23 = v21 ^ v22;
v24 = __ROR__(v21 - *(_DWORD *)(a2 + 92), v23 & 0x1F);
v25 = v23 ^ v24;
v26 = __ROR__(v23 - *(_DWORD *)(a2 + 88), v25 & 0x1F);
v27 = v25 ^ v26;
v28 = __ROR__(v25 - *(_DWORD *)(a2 + 84), v27 & 0x1F);
v29 = v27 ^ v28;
v30 = __ROR__(v27 - *(_DWORD *)(a2 + 80), v29 & 0x1F);
v3 = v29 ^ v30;
v31 = __ROR__(v29 - *(_DWORD *)(a2 + 76), v3 & 0x1F);
v2 = v3 ^ v31;
goto LABEL_5;
}
if
( *(_DWORD *)a2 == 12 )
goto LABEL_4;
LABEL_5:
v32 = __ROR__(v3 - *(_DWORD *)(a2 + 72), v2 & 0x1F);
v33 = v2 ^ v32;
v34 = __ROR__(v2 - *(_DWORD *)(a2 + 68), v33 & 0x1F);
v35 = v33 ^ v34;
v36 = __ROR__(v33 - *(_DWORD *)(a2 + 64), v35 & 0x1F);
v37 = v35 ^ v36;
v38 = __ROR__(v35 - *(_DWORD *)(a2 + 60), v37 & 0x1F);
v39 = v37 ^ v38;
v40 = __ROR__(v37 - *(_DWORD *)(a2 + 56), v39 & 0x1F);
v41 = v39 ^ v40;
v42 = __ROR__(v39 - *(_DWORD *)(a2 + 52), v41 & 0x1F);
v43 = v41 ^ v42;
v44 = __ROR__(v41 - *(_DWORD *)(a2 + 48), v43 & 0x1F);
v45 = v43 ^ v44;
v46 = __ROR__(v43 - *(_DWORD *)(a2 + 44), v45 & 0x1F);
v47 = v45 ^ v46;
v48 = __ROR__(v45 - *(_DWORD *)(a2 + 40), v47 & 0x1F);
v49 = v47 ^ v48;
v50 = __ROR__(v47 - *(_DWORD *)(a2 + 36), v49 & 0x1F);
v51 = v49 ^ v50;
v52 = __ROR__(v49 - *(_DWORD *)(a2 + 32), v51 & 0x1F);
v53 = v51 ^ v52;
v54 = __ROR__(v51 - *(_DWORD *)(a2 + 28), v53 & 0x1F);
v55 = v53 ^ v54;
v56 = __ROR__(v53 - *(_DWORD *)(a2 + 24), v55 & 0x1F);
v57 = v55 ^ v56;
v58 = __ROR__(v55 - *(_DWORD *)(a2 + 20), v57 & 0x1F);
v59 = v57 ^ v58;
v60 = __ROR__(v57 - *(_DWORD *)(a2 + 16), v59 & 0x1F);
v61 = v59 ^ v60;
v62 = __ROR__(v59 - *(_DWORD *)(a2 + 12), v61 & 0x1F);
result = (v61 ^ v62) - *(_DWORD *)(a2 + 4);
*(_DWORD *)(a1 + 4) = v61 - *(_DWORD *)(a2 + 8);
*(_DWORD *)a1 = result;
return
result;
}