WmipIoControl

INT64 __stdcall WmipIoControl(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
  _DWORD *v2; 
  ACCESS_MASK v3; 
  tagWNODE_SINGLE_INSTANCE *v4; 
  ACCESS_MASK v6; 
  unsigned int v7; 
  __int64 v8; 
  ULONG Flags; 
  int AllDataMultiple; 
  int v11; 
  UINT8 v12; 
  __int64 v14; 
  __int64 v15; 
  unsigned int v16; 
  UINT8 v17; 
  POBJECT_TYPE ObjectType; 
  UINT64 AccessMode; 
  ACCESS_MASK DesiredAccess[2]; 
  void *Handle; 
  PADAPTER_OBJECT Object; 
  __int128 Object_8; 
  __int128 v24[3]; 
  __int16 v25[48]; 
  v2 = (_DWORD *)*((_QWORD *)Irp + 23);
  v3 = 0;
  v4 = (tagWNODE_SINGLE_INSTANCE *)*((_QWORD *)Irp + 3);
  v6 = v2[2];
  v7 = v2[6];
  v8 = (unsigned int)v2[4];
  DesiredAccess[0] = v6;
  if( v7 > 0x224158 )
  {
    switch( v7 )
    {
      case 0x224160u:
        goto LABEL_79;
      case 0x228008u:
        v11 = WmipProbeWnodeSingleInstance(v4, (unsigned int)v8, v6, 0);
        if( v11 < 0 )
          goto LABEL_19;
        v17 = 2;
        break;
      case 0x22800Cu:
        v11 = WmipProbeWnodeSingleItem((tagWNODE_SINGLE_ITEM *)v4, (unsigned int)v8);
        if( v11 < 0 )
          goto LABEL_19;
        v17 = 3;
        break;
      default:
        switch( v7 )
        {
          case 0x228024u:
            v11 = WmipProbeWnodeMethodItem((tagWNODE_METHOD_ITEM *)v4, (unsigned int)v8, v6);
            if( v11 < 0 )
              goto LABEL_19;
            v12 = 9;
            goto LABEL_16;
          case 0x22811Cu:
            if( (_DWORD)v8 == 22 )
            {
              AllDataMultiple = WmipTranslateFileHandle((__int64)v4, DesiredAccess);
              goto LABEL_17;
            }
LABEL_73:
            v11 = -1073741823;
            goto LABEL_21;
          case 0x22812Cu:
            if( v6 >= 0x38 && &v4->WnodeHeader.ProviderId <= (ULONG *)((char *)v4 + v8) )
            {
              v16 = v4->WnodeHeader.BufferSize - 1;
              if( v16 <= 0xFFE && &v4->WnodeHeader.CountLost + 2 * v16 <= (ULONG *)((char *)v4 + v8) )
              {
                LODWORD(AccessMode) = v6;
                AllDataMultiple = WmipQueryAllDataMultiple(
                                    0i64,
                                    0i64,
                                    Irp,
                                    1,
                                    v4,
                                    AccessMode,
                                    (INT64)v4,
                                    (INT64)DesiredAccess);
                goto LABEL_17;
              }
            }
            break;
          case 0x228130u:
            if( v6 >= 0x38 && &v4->WnodeHeader.ProviderId <= (ULONG *)((char *)v4 + v8) )
            {
              v15 = v4->WnodeHeader.BufferSize - 1;
              if( (unsigned int)v15 <= 0xFFE
                && &v4->WnodeHeader.Guid.Data4[24 * v15] <= (unsigned __int8 *)((char *)v4 + v8) )
              {
                AllDataMultiple = WmipQuerySingleMultiple(
                                    Irp,
                                    1,
                                    (__int64)v4,
                                    v6,
                                    (__int64)v4,
                                    v4->WnodeHeader.BufferSize,
                                    0i64,
                                    0i64,
                                    (int *)DesiredAccess);
                goto LABEL_17;
              }
            }
            break;
          case 0x228144u:
            if( (unsigned int)v8 < 0x10 || v6 < 0x38 || v4->WnodeHeader.BufferSize > (unsigned int)(v8 - 8) >> 3 )
            {
              v11 = -1073741808;
              goto LABEL_19;
            }
            AllDataMultiple = WmipReceiveNotifications(&v4->WnodeHeader.BufferSize, DesiredAccess, (__int64)Irp);
            goto LABEL_17;
          default:
            goto LABEL_58;
        }
LABEL_70:
        v11 = -1073741811;
        goto LABEL_19;
    }
    DesiredAccess[0] = v8;
    LODWORD(AccessMode) = v8;
    AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, 1, v17, (INT64)v4, AccessMode, (INT64)DesiredAccess);
    v6 = 0;
    goto LABEL_18;
  }
  switch( v7 )
  {
    case 0x224158u:
      if( v6 >= 0x10 )
      {
        AllDataMultiple = WmipEnumerateMofResources((UINT64 *)&v4->WnodeHeader.BufferSize, v6, DesiredAccess);
        goto LABEL_17;
      }
      goto LABEL_70;
    case 0x224000u:
      if( v6 >= 0x48 )
      {
        if( (unsigned int)v8 >= 0x30 )
        {
          Flags = v4->WnodeHeader.Flags;
          if( (Flags & 1) != 0 && (_DWORD)v8 == v4->WnodeHeader.BufferSize && (Flags & 0xFFFFFF7E) == 0 )
          {
            LODWORD(ObjectType) = v6;
            AllDataMultiple = WmipQueryAllData(0i64, Irp, 1, v4, (UINT64)ObjectType, (INT64)DesiredAccess);
LABEL_17:
            v6 = DesiredAccess[0];
LABEL_18:
            v11 = AllDataMultiple;
            goto LABEL_19;
          }
        }
        goto LABEL_73;
      }
      goto LABEL_55;
    case 0x224004u:
      if( v6 < 0x38 )
        goto LABEL_55;
      v11 = WmipProbeWnodeSingleInstance(v4, (unsigned int)v8, v6, 1u);
      if( v11 < 0 )
        goto LABEL_19;
      v12 = 1;
LABEL_16:
      DesiredAccess[0] = v8;
      LODWORD(AccessMode) = v6;
      AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, 1, v12, (INT64)v4, AccessMode, (INT64)DesiredAccess);
      goto LABEL_17;
    case 0x224108u:
LABEL_31:
      Handle = 0i64;
      DesiredAccess[0] = 0;
      memset(v24, 0, sizeof(v24));
      Object = 0i64;
      Object_8 = 0i64;
      v11 = WmipProbeWmiOpenGuidBlock(
              (__int64)v24,
              (__int64)&Object_8,
              v25,
              DesiredAccess,
              &v4->WnodeHeader.BufferSize,
              v8,
              v6);
      if( v11 >= 0 )
      {
        LOBYTE(v14) = 1;
        v11 = WmipOpenBlock(v7, v14, (__int64)v24, DesiredAccess[0], &Object);
        if( v11 >= 0 )
        {
          v11 = ObOpenObjectByPointer(Object, 0, 0i64, DesiredAccess[0], WmipGuidObjectType, 1, &Handle);
          if( v11 >= 0 )
          {
            if( IoIs32bitProcess(0i64) )
              v4->WnodeHeader.Version = (unsigned int)Handle;
            else
              v4->WnodeHeader.TimeStamp.QuadPart = (LONGLONG)Handle;
          }
          HalPutDmaAdapter(Object);
        }
      }
LABEL_19:
      if( v11 == 259 || v11 == -1073741536 )
        return(unsigned int)v11;
      goto LABEL_21;
    case 0x224124u:
      if( v6 >= 4 )
      {
        v4->WnodeHeader.BufferSize = 1;
        v6 = 4;
        v11 = 0;
        goto LABEL_21;
      }
      goto LABEL_55;
    case 0x224134u:
LABEL_79:
      if( v6 >= 8 )
      {
        AllDataMultiple = WmipEnumerateGuids(v7, v4, v6, DesiredAccess);
        goto LABEL_17;
      }
      goto LABEL_55;
  }
  if( v7 != 2244920 )
  {
    if( v7 != 2244924 && v7 != 2244928 )
    {
LABEL_58:
      v11 = -1073741808;
      goto LABEL_21;
    }
    goto LABEL_31;
  }
  if( v6 >= 0x10 )
  {
    AllDataMultiple = WmipQueryGuidInfo((__int64)v4);
    v6 = 16;
    goto LABEL_18;
  }
LABEL_55:
  v11 = -1073741789;
LABEL_21:
  *((_DWORD *)Irp + 12) = v11;
  if( v11 >= 0 )
    v3 = v6;
  *((_QWORD *)Irp + 7) = v3;
  IofCompleteRequest(Irp, 0);
  return(unsigned int)v11;
}

Referenced by:

No references.