WmipWriteWnodeToObject

NTSTATUS __stdcall WmipWriteWnodeToObject(_WMIGUIDOBJECT *Object, _WNODE_HEADER *Wnode, UINT8 IsHighPriority){
  __int64 v6; 
  NTSTATUS v7; 
  char v8; 
  ULONG BufferSize; 
  _DWORD *v10; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&ExBootDevicesRemovedEvent + 429, &LockHandle);
  v6 = *((_QWORD *)Object + 9);
  v7 = 0;
  if( v6 )
  {
    WmipClearIrpObjectList(*((_IRP **)Object + 9));
    v6 &= -(__int64)(_InterlockedExchange64((volatile __int64 *)(v6 + 104), 0i64) != 0);
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  v8 = 1;
  __writecr8(LockHandle.OldIrql);
  if( !v6 )
    return WmipQueueNotification(
             Object,
             (_WMIGUIDOBJECT *)((char *)Object + (-(__int64)(IsHighPriority != 0) & 0xFFFFFFFFFFFFFFE0ui64) + 128),
             Wnode);
  BufferSize = Wnode->BufferSize;
  v10 = *(_DWORD **)(v6 + 24);
  if( Wnode->BufferSize > *(_DWORD *)(*(_QWORD *)(v6 + 184) + 8i64) )
  {
    v10[12] = BufferSize;
    *v10 = 56;
    BufferSize = 56;
    v10[11] = 32;
  }
  else
  {
    memmove(v10, Wnode, BufferSize);
    v8 = 0;
  }
  *(_QWORD *)(v6 + 56) = BufferSize;
  *(_DWORD *)(v6 + 48) = 0;
  IofCompleteRequest((PIRP)v6, 0);
  if( v8 )
    return WmipQueueNotification(
             Object,
             (_WMIGUIDOBJECT *)((char *)Object + (-(__int64)(IsHighPriority != 0) & 0xFFFFFFFFFFFFFFE0ui64) + 128),
             Wnode);
  return v7;
}

Referenced by:

WmipProcessEvent