WmipDereferenceEvent

_WNODE_HEADER *__stdcall WmipDereferenceEvent(tagWNODE_EVENT_REFERENCE *WnodeRef){
  ULONG ProviderId; 
  _WNODE_HEADER *Buffer; 
  unsigned int BufferSize; 
  UINT64 i; 
  ULONG Flags; 
  int v7; 
  unsigned int v8; 
  ULONG v9; 
  ULONG TargetDataBlockSize; 
  unsigned int v11; 
  size_t v12; 
  _WNODE_HEADER *PoolWithTag; 
  ULONG Version; 
  UINT8 *v15; 
  int v16; 
  ULONG v17; 
  IO_STATUS_BLOCK Iosb[5]; 
  UINT64 Number; 
  unsigned int v21; 
  unsigned int v22; 
  size_t Size; 
  ProviderId = WnodeRef->WnodeHeader.ProviderId;
  Buffer = 0i64;
  BufferSize = 0;
  KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
  for( i = *(_QWORD *)WmipDSHeadPtr; ; i = *(_QWORD *)i )
  {
    if( i == WmipDSHeadPtr )
    {
      i = 0i64;
      goto LABEL_6;
    }
    if( *(_DWORD *)(i + 56) == ProviderId )
      break;
  }
  WmipReferenceEntry(i);
LABEL_6:
  KeReleaseMutex(&WmipSMMutex, 0);
  if( i )
  {
    Flags = WnodeRef->WnodeHeader.Flags;
    LODWORD(Number) = 64;
    v7 = Flags & 0x80;
    if( v7 )
    {
      v8 = 0;
      v9 = 0;
    }
    else
    {
      v8 = LOWORD(WnodeRef->TargetInstanceIndex) + 2;
      if( !WmipAlign(2ui64, &Number) || (v9 = Number, v8 > ~(_DWORD)Number) )
      {
LABEL_28:
        WmipUnreferenceEntry((__int64)&WmipDSChunkInfo, (volatile signed __int64 *)i);
        return Buffer;
      }
      LODWORD(Number) = v8 + Number;
    }
    if( WmipAlign(8ui64, &Number) )
    {
      TargetDataBlockSize = WnodeRef->TargetDataBlockSize;
      if( TargetDataBlockSize <= ~(_DWORD)Number )
      {
        v21 = 0;
        v11 = Number + TargetDataBlockSize;
        v12 = (unsigned int)Number + TargetDataBlockSize;
        v22 = Number + TargetDataBlockSize;
        while( 1 )
        {
          Size = v12;
          PoolWithTag = (_WNODE_HEADER *)ExAllocatePoolWithTag(NonPagedPoolNx, v12, 0x70696D57ui64);
          Buffer = PoolWithTag;
          if( !PoolWithTag )
            break;
          memset((INT64)PoolWithTag, 0i64);
          Buffer->BufferSize = v11;
          Buffer->ProviderId = WnodeRef->WnodeHeader.ProviderId;
          Buffer->Guid = WnodeRef->TargetGuid;
          Version = WnodeRef->WnodeHeader.Version;
          Buffer->Flags = v7 | 2;
          Buffer[1].Version = Number;
          Buffer->Version = Version;
          if( v7 )
          {
            Buffer[1].ProviderId = WnodeRef->TargetInstanceIndex;
          }
          else
          {
            v8 -= 2;
            Buffer[1].BufferSize = v9;
            v15 = (UINT8 *)Buffer + v9;
            *(_WORD *)v15 = v8;
            memmove(v15 + 2, (UINT8 *)&WnodeRef->TargetInstanceName[1], v8);
          }
          v16 = WmipSendWmiIrp(1u, *(unsigned int *)(i + 56), &Buffer->Guid, v11, Buffer, Iosb);
          if( v16 >= 0 )
          {
            v17 = Buffer->Flags;
            if( (v17 & 0x20) == 0 )
            {
              Buffer->Flags = v17 | WnodeRef->WnodeHeader.Flags & 0xFF000008 | 8;
              goto LABEL_28;
            }
            BufferSize = Buffer[1].BufferSize;
          }
          ExFreePoolWithTag(Buffer, 0);
          Buffer = 0i64;
          if( v16 >= 0 && BufferSize > v22 )
          {
            v11 = BufferSize;
            v12 = BufferSize;
            ++v21;
            v22 = BufferSize;
            if( v21 < 2 )
              continue;
          }
          goto LABEL_28;
        }
      }
    }
    goto LABEL_28;
  }
  return Buffer;
}

Referenced by:

WmipProcessEvent