WmipCopyFromEventQueues

NTSTATUS __fastcall WmipCopyFromEventQueues(
        _KEVENT **a1,
        unsigned int a2,
        _DWORD *a3,
        __int64 a4,
        _DWORD *a5,
        _QWORD *a6,
        char a7){
  __int64 v7; 
  _KEVENT **v8; 
  _KEVENT **v9; 
  __int64 i; 
  __int64 v11; 
  __int64 v12; 
  int v14; 
  _DWORD *v15; 
  unsigned int v16; 
  __int64 v17; 
  unsigned int v18; 
  __int64 *v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned int *v22; 
  unsigned int v23; 
  __int64 v24; 
  _KEVENT *v25; 
  NTSTATUS result; 
  __int64 v27; 
  _KEVENT *v28; 
  unsigned __int64 v29; 
  __int64 v30; 

  v7 = a2;
  v8 = a1;
  if( a2 )
  {
    v9 = a1 + 1;
    for( i = a2; i; --i )
    {
      v11 = (__int64)*(v9 - 1);
      if( a7 )
      {
        v30 = *(_QWORD *)(v11 + 96);
        if( v30 && *(_DWORD *)(v11 + 116) )
        {
          *v9 = (_KEVENT *)v30;
          *(_WORD *)(v30 + 10) = 0;
          *((_DWORD *)*v9 + 2) |= *(unsigned __int16 *)(v11 + 120) << 16;
          *(_DWORD *)(v11 + 120) = 0;
          goto LABEL_6;
        }
      }
      else
      {
        v12 = *(_QWORD *)(v11 + 128);
        if( v12 && *(_DWORD *)(v11 + 148) )
        {
          *v9 = (_KEVENT *)v12;
          *(_WORD *)(v12 + 10) = 0;
          *((_DWORD *)*v9 + 2) |= *(unsigned __int16 *)(v11 + 152) << 16;
          *(_DWORD *)(v11 + 152) = 0;
          goto LABEL_6;
        }
      }
      *v9 = 0i64;
LABEL_6:
      v9 += 2;
    }
  }
  v14 = 0;
  v15 = 0i64;
  while( 1 )
  {
    v16 = -1;
    v17 = 0x7FFFFFFFFFFFFFFFi64;
    v18 = 0;
    if( !(_DWORD)v7 )
      break;
    v19 = (__int64 *)(v8 + 1);
    do
    {
      v20 = *v19;
      if( *v19 && *(_QWORD *)(v20 + 16) < v17 )
      {
        v17 = *(_QWORD *)(v20 + 16);
        v16 = v18;
      }
      ++v18;
      v19 += 2;
    }
    while( v18 < (unsigned int)v7 );
    if( v16 == -1 )
      break;
    v21 = 2i64 * v16;
    v15 = a3;
    v22 = (unsigned int *)v8[2 * v16 + 1];
    v23 = (*v22 + 7) & 0xFFFFFFF8;
    memmove(a3, v22, *v22);
    v14 += v23;
    a3[3] = v23;
    a3 = (_DWORD *)((char *)a3 + v23);
    v24 = v22[3];
    if( (_DWORD)v24 )
      v25 = (_KEVENT *)((char *)v22 + v24);
    else
      v25 = 0i64;
    v8[v21 + 1] = v25;
  }
  *a6 = v15;
  result = (int)a5;
  *a5 = v14;
  if( (_DWORD)v7 )
  {
    v27 = v7;
    do
    {
      v28 = *v8;
      v29 = (unsigned __int64)*v8 + (-(__int64)(a7 != 0) & 0xFFFFFFFFFFFFFFE0ui64) + 128;
      if( *(_QWORD *)v29 )
      {
        ExFreePoolWithTag(*(PVOID *)v29, 0);
        *(_QWORD *)v29 = 0i64;
        *(_DWORD *)(v29 + 20) = 0;
        *(_QWORD *)(v29 + 8) = 0i64;
      }
      result = KeResetEvent(v28);
      v8 += 2;
      --v27;
    }
    while( v27 );
  }
  return result;
}

Referenced by:

WmipReceiveNotifications