WmipQueueNotification

NTSTATUS __stdcall WmipQueueNotification(VOID *Object, WMIEVENTQUEUE *EventQueue, _WNODE_HEADER *Wnode){
  VOID **v3; 
  unsigned int v5; 
  NTSTATUS v6; 
  __int64 v7; 
  ULONG BufferSize; 
  _KEVENT *v10; 
  unsigned int v11; 
  ULONG v12; 
  VOID **PoolWithTag; 
  char *v14; 
  VOID **v16; 
  ULONG Size; 

  v3 = *(VOID ***)EventQueue;
  v5 = EventQueue[4];
  v6 = 0;
  v7 = *((_QWORD *)EventQueue + 1);
  BufferSize = Wnode->BufferSize;
  v10 = (_KEVENT *)Object;
  v11 = EventQueue[5];
  Size = Wnode->BufferSize;
  v12 = (v11 + Wnode->BufferSize + 7) & 0xFFFFFFF8;
  if( !v3 )
    goto LABEL_20;
  if( v12 > v5 )
    v3 = 0i64;
  if( !v3 )
  {
LABEL_20:
    if( v12 > 0x80000 )
      goto LABEL_17;
    if( v12 > v5 )
      v5 = (v12 + 0x3FFF) & 0xFFFFC000;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v5, 1885957463i64);
    v3 = PoolWithTag;
    if( !PoolWithTag )
    {
LABEL_17:
      ++EventQueue[6];
      return -1073741670;
    }
    memset(PoolWithTag, 0i64, v5);
    if( *(_QWORD *)EventQueue )
    {
      memmove(v3, *(const VOID **)EventQueue, EventQueue[5]);
      v16 = *(VOID ***)EventQueue;
      v7 += (__int64)v3 - *(_QWORD *)EventQueue;
      *((_QWORD *)EventQueue + 1) = v7;
      ExFreePoolWithTag(v16, 0);
    }
    v11 = EventQueue[5];
    BufferSize = Size;
    v10 = (_KEVENT *)Object;
    *(_QWORD *)EventQueue = v3;
    EventQueue[4] = v5;
  }
  v14 = (char *)v3 + v11;
  if( v7 )
    *(_DWORD *)(v7 + 12) = (_DWORD)v14 - v7;
  *((_QWORD *)EventQueue + 1) = v14;
  EventQueue[5] = v12;
  memmove(v14, Wnode, BufferSize);
  KeSetEvent(v10, 0, 0);
  return v6;
}

Referenced by:

WmipWriteWnodeToObject