sub_140961F8C
__int64 __fastcall sub_140961F8C(__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;
NTSTATUS v15;
_BYTE *v16;
volatile unsigned __int64 TickCountQuad;
unsigned int v18;
int v19;
unsigned int v20;
VOID **PoolWithTag;
unsigned int v22;
__int64 v23;
unsigned int v24;
int v25;
unsigned int v26;
unsigned int v27;
unsigned __int64 v28;
unsigned int v29;
_LARGE_INTEGER v31;
__int64 v32;
v4 = 0i64;
v32 = 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;
v32 = *(_QWORD *)v14;
goto LABEL_19;
}
return(unsigned int)-1073741789;
}
v7 = -1073741811;
LABEL_19:
if( (v7 & 0x80000000) == 0 )
{
v31.QuadPart = -270000000i64;
v15 = KeWaitForSingleObject((UINT64)&SbiVmbusArrivalEvent + 2848, 6, 1, 0, (INT64)&v31);
if( v15 >= 0 && v15 != 192 && v15 != 258 )
{
if( *(&SbiVmbusArrivalEvent + 705) || !dword_140D2C1C4 )
{
TickCountQuad = KUSER_SHARED_DATA.TickCountQuad;
KeQueryTimeIncrement(v16);
dword_140D2C1C4 = 1;
qword_140D2C168 = (__int64)(TickCountQuad * v18) / 10000;
KeResetEvent((_KEVENT *)((char *)&SbiVmbusArrivalEvent + 2816));
v4 = v32;
}
KeReleaseMutex((_KMUTANT *)((char *)&SbiVmbusArrivalEvent + 2848), 0);
}
v19 = *(_DWORD *)(a2 + 32);
if( *(_DWORD *)(a2 + 16) < 0xFFFFFFD0 )
{
v20 = *(_DWORD *)(a2 + 16) + 52;
if( v20 >= *(_DWORD *)(a2 + 16) + 48 )
{
v7 = v20 + v19 < v20 ? 0xC0000095 : 0;
if( v20 + v19 < v20 )
return v7;
*(_DWORD *)(a4 + 4) = 20;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x14ui64, 542329939i64);
if( !PoolWithTag )
return(unsigned int)-1073741801;
*(_QWORD *)(a4 + 8) = PoolWithTag;
*(_DWORD *)a4 = 0;
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) = 0x10000000;
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_43;
}
}
else
{
LABEL_43:
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