WmipDereferenceEvent

unsigned int *__fastcall WmipDereferenceEvent(__int64 a1){
  int v1; 
  _DWORD *Buffer; 
  unsigned int v4; 
  INT64 i; 
  int v6; 
  int v7; 
  size_t v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned int v11; 
  UINT64 v12; 
  VOID **PoolWithTag; 
  int v14; 
  _WORD *v15; 
  NTSTATUS v16; 
  int v17; 
  _IO_STATUS_BLOCK Iosb; 
  UINT64 Number; 
  unsigned int v21; 
  unsigned int v22; 
  UINT64 Size; 

  v1 = *(_DWORD *)(a1 + 4);
  Buffer = 0i64;
  v4 = 0;
  KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
  for( i = **(&ExBootDevicesRemovedEvent + 404); ; i = *(_QWORD *)i )
  {
    if( i == *(&ExBootDevicesRemovedEvent + 404) )
    {
      i = 0i64;
      goto LABEL_6;
    }
    if( *(_DWORD *)(i + 56) == v1 )
      break;
  }
  WmipReferenceEntry(i);
LABEL_6:
  KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
  if( i )
  {
    v6 = *(_DWORD *)(a1 + 44);
    LODWORD(Number) = 64;
    v7 = v6 & 0x80;
    if( v7 )
    {
      v8 = 0;
      v9 = 0;
    }
    else
    {
      v8 = *(unsigned __int16 *)(a1 + 68) + 2;
      if( !WmipAlign(2ui64, &Number) || (v9 = Number, v8 > ~(_DWORD)Number) )
      {
LABEL_28:
        WmipUnreferenceEntry((__int64)&stru_140C00F40 + 7664, (volatile signed __int64 *)i);
        return Buffer;
      }
      LODWORD(Number) = v8 + Number;
    }
    if( WmipAlign(8ui64, &Number) )
    {
      v10 = *(_DWORD *)(a1 + 64);
      if( v10 <= ~(_DWORD)Number )
      {
        v21 = 0;
        v11 = Number + v10;
        v12 = (unsigned int)Number + v10;
        v22 = Number + v10;
        while( 1 )
        {
          Size = v12;
          PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v12, 1885957463i64);
          Buffer = PoolWithTag;
          if( !PoolWithTag )
            break;
          memset(PoolWithTag, 0i64, Size);
          *Buffer = v11;
          Buffer[1] = *(_DWORD *)(a1 + 4);
          *(_OWORD *)(Buffer + 6) = *(_OWORD *)(a1 + 48);
          v14 = *(_DWORD *)(a1 + 8);
          Buffer[11] = v7 | 2;
          Buffer[14] = Number;
          Buffer[2] = v14;
          if( v7 )
          {
            Buffer[13] = *(_DWORD *)(a1 + 68);
          }
          else
          {
            v8 -= 2;
            Buffer[12] = v9;
            v15 = (_WORD *)((char *)Buffer + v9);
            *v15 = v8;
            memmove(v15 + 1, (const VOID *)(a1 + 70), v8);
          }
          v16 = WmipSendWmiIrp(1u, *(unsigned int *)(i + 56), Buffer + 6, v11, Buffer, &Iosb);
          if( v16 >= 0 )
          {
            v17 = Buffer[11];
            if( (v17 & 0x20) == 0 )
            {
              Buffer[11] = v17 | *(_DWORD *)(a1 + 44) & 0xFF000008 | 8;
              goto LABEL_28;
            }
            v4 = Buffer[12];
          }
          ExFreePoolWithTag(Buffer, 0);
          Buffer = 0i64;
          if( v16 >= 0 && v4 > v22 )
          {
            v11 = v4;
            v12 = v4;
            ++v21;
            v22 = v4;
            if( v21 < 2 )
              continue;
          }
          goto LABEL_28;
        }
      }
    }
    goto LABEL_28;
  }
  return Buffer;
}

Referenced by:

WmipProcessEvent