WmipSendEnableDisableRequest

__int64 __fastcall WmipSendEnableDisableRequest(unsigned __int8 a1, __int64 a2, char a3){
  int v6; 
  bool v7; 
  __int64 v8; 
  __int64 v9; 
  int v10; 
  char *PoolWithTag; 
  __int64 *i; 
  int v13; 
  __int64 v14; 
  int v15; 
  UINT64 v16; 
  int v17; 
  __int128 v18; 
  __int64 v19; 
  char *v20; 
  volatile signed __int64 *v21; 
  bool v23; 
  IO_STATUS_BLOCK Iosb; 
  __int128 Buffer[3]; 
  char P[512]; 
  memset((INT64)P, 0i64);
  v6 = *(_DWORD *)(a2 + 16);
  memset(Buffer, 0, sizeof(Buffer));
  if( (v6 & 1) != 0 )
    return 0i64;
  v7 = ((a1 - 4) & 0xFD) == 0;
  v8 = *(unsigned int *)(a2 + 36);
  v23 = v7;
  v9 = 0i64;
  v10 = a3 != 0 ? 0x2000 : 0x4000;
  if( (unsigned int)v8 > 0x40 )
  {
    PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, 8 * v8, 0x70696D57ui64);
    if( !PoolWithTag )
      return 3221225626i64;
    v7 = ((a1 - 4) & 0xFD) == 0;
  }
  else
  {
    PoolWithTag = P;
  }
  for( i = *(__int64 **)(a2 + 56); i != (__int64 *)(a2 + 56) && (unsigned int)v9 < *(_DWORD *)(a2 + 36); i = (__int64 *)*i )
  {
    v13 = *((_DWORD *)i + 4);
    if( (v13 & 0x1000) == 0 && (a3 || (v13 & 4) != 0) )
    {
      v14 = i[8];
      if( (*(_DWORD *)(v14 + 16) & 0x20000000) == 0 )
      {
        v15 = v13 & v10;
        if( v7 )
        {
          if( !v15 )
            goto LABEL_13;
        }
        else if( v15 )
        {
LABEL_13:
          v16 = i[8];
          *(_QWORD *)&PoolWithTag[8 * v9] = v14;
          WmipReferenceEntry(v16);
          v13 = *((_DWORD *)i + 4);
          v9 = (unsigned int)(v9 + 1);
          v7 = v23;
        }
        if( v7 )
          v17 = v13 | v10;
        else
          v17 = v13 & ~v10;
        *((_DWORD *)i + 4) = v17;
        continue;
      }
    }
  }
  KeReleaseMutex(&WmipSMMutex, 0);
  if( (_DWORD)v9 )
  {
    memset((char *)Buffer + 4, 0, 20);
    *((_QWORD *)&Buffer[2] + 1) = 0i64;
    v18 = *(_OWORD *)(a2 + 72);
    v19 = (unsigned int)v9;
    v20 = PoolWithTag;
    *(__int128 *)((char *)&Buffer[1] + 8) = v18;
    LODWORD(Buffer[0]) = 48;
    do
    {
      v21 = *(volatile signed __int64 **)v20;
      WmipSendWmiIrp(a1, *(unsigned int *)(*(_QWORD *)v20 + 56i64), (char *)&Buffer[1] + 8, 0x30ui64, Buffer, &Iosb);
      WmipUnreferenceEntry((__int64)&WmipDSChunkInfo, v21);
      v20 += 8;
      --v19;
    }
    while( v19 );
  }
  if( PoolWithTag != P )
    ExFreePoolWithTag(PoolWithTag, 0);
  KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
  return 0i64;
}

Referenced by:

WmipDoDisableRequest
WmipSendEnableRequest