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