DWORD
__stdcall StartAddress(unsigned
int
*lpThreadParameter)
{
int
*b;
int
*c;
int
*d;
void
*a_;
char
v5;
int
v6;
int
*b_i;
int
v8;
BOOL
v9;
int
v10;
int
i;
int
v12;
int
*c__;
int
new_t1_;
int
new_t0_;
int
*b_j_;
int
j_;
int
i_;
unsigned
__int64
v19;
__int64
v20;
int
i__;
int
c_minus_d;
int
t1;
int
j;
int
*v3_i;
unsigned
int
t0;
int
new_t0;
__int64
v28;
bool
v29;
__int64
v30;
void
(__cdecl *v31)(
void
*);
__int64
v33;
__int64
v34;
__int64
v35;
__int64
v36;
int
*v37;
int
*b_j;
int
*v3_i_;
int
*b_i_;
int
t1_;
int
v1_____;
int
*c_;
int
j___;
int
i___;
int
*a;
int
*b_;
int
*d_;
int
t0_;
int
t1___;
int
a_minus_b;
unsigned
int
t0___;
unsigned
int
x_1;
int
v54;
unsigned
int
x_0;
unsigned
int
seed;
a = (
int
*)
calloc
(10000u, 4u);
b = (
int
*)
calloc
(10000u, 4u);
b_ = b;
c = (
int
*)
calloc
(20000u, 4u);
c_ = c;
d = (
int
*)
calloc
(20000u, 4u);
a_ = a;
d_ = d;
if
( !a )
goto
LABEL_41;
if
( !b )
goto
LABEL_40;
if
( !c )
goto
LABEL_40;
if
( !d )
goto
LABEL_40;
v54 = 0;
if
( (
int
)lpThreadParameter[2] <= 0 )
goto
LABEL_40;
while
( 2 )
{
WaitForSingleObject(hMutex, 0xFFFFFFFF);
v5 = global_fail;
ReleaseMutex(hMutex);
if
( v5 )
break
;
seed = 0;
CryptGenRandom(hProv, 4u, (
BYTE
*)&seed);
srand
(seed);
v6 = 0;
b_i = b;
b_i_ = b;
a_minus_b = (
char
*)a - (
char
*)b;
do
{
v8 = dword_4031CC[
rand
() % 7];
*(
int
*)((
char
*)b_i + a_minus_b) = v8;
v9 = v6 == 0;
v10 =
rand
() % (
int
)((__PAIR64__(v8, v6++) - 1) >> 32);
*b_i_ = v9 + v10;
b_i = ++b_i_;
}
while
( v6 < 10000 );
for
( i = 0; i < 20000; ++i )
{
v12 =
rand
();
c__ = c_;
c_[i] = dword_4031CC[v12 % 7];
}
new_t1_ = 0;
new_t0_ = 0;
x_0 = *lpThreadParameter;
b_j_ = b_;
x_1 = lpThreadParameter[1];
j_ = 0;
i_ = 0;
LABEL_12:
b_j = b_j_;
j___ = j_;
while
( 1 )
{
t0_ = new_t0_;
t1_ = new_t1_;
if
( j_ >= 10000 && (new_t1_ < 0 || new_t1_ <= 0 && !new_t0_) )
break
;
if
( i_ >= 20000 )
{
LABEL_38:
WaitForSingleObject(hMutex, 0xFFFFFFFF);
global_fail = 1;
ReleaseMutex(hMutex);
b = b_;
goto
LABEL_39;
}
if
( j_ >= 10000 )
{
v34 = c__[i_];
v20 = __SPAIR64__(new_t1_, new_t0_) / v34;
new_t1_ = (unsigned
__int64
)(__SPAIR64__(new_t1_, new_t0_) / v34) >> 32;
new_t0_ = v20;
c__ = c_;
d_[i_++] = __SPAIR64__(t1_, t0_) % v34;
j_ = j___;
b_j_ = b_j;
}
else
{
new_t1_ = (*b_j + *(
int
*)((
char
*)b_j_ + a_minus_b) * __PAIR64__(new_t1_, new_t0_)) >> 32;
v33 = c_[i_];
new_t0_ = *b_j + *(
int
*)((
char
*)b_j_ + a_minus_b) * new_t0_;
if
( (
__int64
)(__SPAIR64__(t1_, t0_) / v33 * __PAIR64__(new_t1_, new_t0_)) < __SPAIR64__(x_1, x_0) )
{
j_ = j___ + 1;
c__ = c_;
b_j_ = b_j + 1;
goto
LABEL_12;
}
v19 = __SPAIR64__(t1_, t0_) / v33;
new_t1_ = HIDWORD(v19);
new_t0_ = v19;
c__ = c_;
d_[i_++] = __SPAIR64__(t1_, t0_) % v33;
j_ = j___;
b_j_ = b_j;
}
}
i__ = i_ - 1;
i___ = i__;
c_minus_d = (
char
*)c__ - (
char
*)d_;
t1 = 0;
j = 9999;
v3_i = &d_[i__];
v1_____ = c_minus_d;
t0 = 0;
v3_i_ = v3_i;
while
( 1 )
{
t0___ = t0;
t1___ = t1;
if
( i__ < 0 && (t1 < 0 || t1 <= 0 && !t0) )
break
;
if
( j < 0 )
goto
LABEL_38;
if
( i__ < 0 )
{
v36 = a[j];
v30 = __SPAIR64__(t1, t0) / v36;
t1 = (unsigned
__int64
)(__SPAIR64__(t1, t0) / v36) >> 32;
t0 = v30;
v29 = (unsigned
int
)(__SPAIR64__(t1___, t0___) % v36) == b_[j];
LABEL_34:
if
( !v29 )
goto
LABEL_38;
i__ = i___;
--j;
v3_i = v3_i_;
c_minus_d = v1_____;
}
else
{
new_t0 = *v3_i_ + *(
int
*)((
char
*)v3_i + c_minus_d) * t0;
t1 = (*v3_i_ + *(
int
*)((
char
*)v3_i + c_minus_d) * __PAIR64__(t1, t0)) >> 32;
v35 = a[j];
v28 = __SPAIR64__(t1___, t0) / v35;
t0 = new_t0;
if
( (
signed
__int64
)(v28 * __PAIR64__(t1, new_t0)) >= *(_QWORD *)lpThreadParameter )
{
t1 = HIDWORD(v28);
t0 = v28;
v29 = (unsigned
int
)(__SPAIR64__(t1___, t0___) % v35) == b_[j];
goto
LABEL_34;
}
i__ = i___ - 1;
c_minus_d = v1_____;
v3_i = v3_i_ - 1;
--i___;
--v3_i_;
}
}
b = b_;
if
( ++v54 < (
int
)lpThreadParameter[2] )
continue
;
break
;
}
LABEL_39:
a_ = a;
d = d_;
c = c_;
LABEL_40:
free
(a_);
LABEL_41:
if
( b )
{
v37 = b;
v31 =
free
;
free
(v37);
}
else
{
v31 =
free
;
}
if
( c )
v31(c);
if
( d )
v31(d);
if
( NtCurrentPeb()->BeingDebugged )
{
WaitForSingleObject(hMutex, 0xFFFFFFFF);
global_fail = 1;
ReleaseMutex(hMutex);
}
return
0;
}