sub_140963760
__int64 __fastcall sub_140963760(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
__int64 v4;
unsigned int v7;
unsigned int *v8;
unsigned int i;
__int64 v10;
unsigned int *v11;
unsigned int v12;
unsigned int *v13;
unsigned int *v14;
int v15;
int v16;
NTSTATUS v17;
int v18;
unsigned int v19;
VOID **PoolWithTag;
int v21;
unsigned int v22;
__int64 v23;
unsigned int v24;
int v25;
unsigned int v26;
unsigned int v27;
unsigned __int64 v28;
unsigned int v29;
_LARGE_INTEGER Interval;
v4 = 0i64;
if( !a1 || !a2 || !a4 )
return(unsigned int)-1073741811;
v8 = *(unsigned int **)(a1 + 8);
if( v8 && *(_DWORD *)a1 > 3u )
{
for( i = 0; i < 3; ++i )
{
v10 = *v8;
v11 = v8 + 1;
if( v8 + 1 < v8 )
goto LABEL_18;
v8 = (unsigned int *)((char *)v11 + v10);
if( (unsigned int *)((char *)v11 + v10) < v11 )
goto LABEL_18;
}
v12 = *v8;
v13 = v8 + 1;
if( v8 + 1 < v8 )
{
LABEL_18:
v7 = -1073741675;
goto LABEL_19;
}
v14 = 0i64;
if( v12 )
v14 = v13;
v7 = 0;
if( v12 == 8 )
{
v4 = *(_QWORD *)v14;
goto LABEL_19;
}
return(unsigned int)-1073741789;
}
v7 = -1073741811;
LABEL_19:
if( (v7 & 0x80000000) == 0 )
{
Interval.QuadPart = -35000000i64;
do
{
KeDelayExecutionThread(1, 1u, &Interval);
v16 = v15;
}
while( v15 == 257 );
if( v15 >= 0 && v15 != 192 )
{
Interval.QuadPart = -270000000i64;
do
{
v17 = KeWaitForSingleObject((UINT64)&SbiVmbusArrivalEvent + 2848, 6, 1, 1, (INT64)&Interval);
v16 = v17;
}
while( v17 == 257 );
if( v17 >= 0 && v17 != 192 && v17 != 258 )
KeReleaseMutex((_KMUTANT *)((char *)&SbiVmbusArrivalEvent + 2848), 0);
}
v18 = *(_DWORD *)(a2 + 32);
if( *(_DWORD *)(a2 + 16) < 0xFFFFFFD0 )
{
v19 = *(_DWORD *)(a2 + 16) + 52;
if( v19 >= *(_DWORD *)(a2 + 16) + 48 )
{
v7 = v19 + v18 < v19 ? 0xC0000095 : 0;
if( v19 + v18 < v19 )
return v7;
*(_DWORD *)(a4 + 4) = 20;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x14ui64, 542329939i64);
if( !PoolWithTag )
return(unsigned int)-1073741801;
*(_QWORD *)(a4 + 8) = PoolWithTag;
*(_DWORD *)a4 = 0;
v21 = v16 | 0x10000000;
if( (VOID **)((char *)PoolWithTag + 4) >= PoolWithTag )
{
if( PoolWithTag + 1 > (VOID **)((char *)PoolWithTag + *(unsigned int *)(a4 + 4)) )
return(unsigned int)-1073741789;
*(_DWORD *)PoolWithTag = 4;
*((_DWORD *)PoolWithTag + 1) = v21;
v22 = ++*(_DWORD *)a4;
v23 = *(_QWORD *)(a4 + 8);
if( !v23 )
{
v24 = *(_DWORD *)(a4 + 4);
v25 = -1;
v26 = v24 + 12;
if( v24 + 12 >= v24 )
v25 = v24 + 12;
v7 = v26 < v24 ? 0xC0000095 : 0;
*(_DWORD *)(a4 + 4) = v25;
if( v26 >= v24 )
{
v7 = 0;
*(_DWORD *)a4 = v22 + 1;
}
return v7;
}
v27 = 0;
v28 = *(_QWORD *)(a4 + 8);
if( v22 )
{
while( 1 )
{
v29 = *(_DWORD *)v28 + 4;
if( *(_DWORD *)v28 >= 0xFFFFFFFC || v28 + v29 < v28 )
break;
++v27;
v28 += v29;
if( v27 >= v22 )
goto LABEL_46;
}
}
else
{
LABEL_46:
if( v28 + 4 >= v28 )
{
v7 = 0;
if( v28 + 12 <= v23 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
{
*(_DWORD *)v28 = 8;
*(_QWORD *)(v28 + 4) = v4;
++*(_DWORD *)a4;
return v7;
}
return(unsigned int)-1073741789;
}
}
}
}
}
return(unsigned int)-1073741675;
}
return v7;
}Referenced by:
sub_1405F50F8