WmipIoControl

NTSTATUS __stdcall WmipIoControl(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
  _IO_STACK_LOCATION *CurrentStackLocation; 
  unsigned int v3; 
  tagWNODE_SINGLE_INSTANCE *MasterIrp; 
  unsigned int SecurityContext; 
  unsigned int v7; 
  __int64 Options; 
  ULONG Flags; 
  int AllDataMultiple; 
  int v11; 
  _KPROCESSOR_MODE v12; 
  UINT8 v13; 
  __int64 v15; 
  unsigned int v16; 
  _KPROCESSOR_MODE v17; 
  UINT8 v18; 
  UINT64 OutBufferLen; 
  UINT64 *RetSize; 
  _KPROCESSOR_MODE RetSizea; 
  UINT64 *ValidSize; 
  UINT64 DesiredAccess; 
  VOID *Handle; 
  _ADAPTER_OBJECT *CapturedGuidString; 
  _UNICODE_STRING CapturedGuidString_8; 
  _OBJECT_ATTRIBUTES CapturedObjectAttributes_8; 
  __int16 CapturedGuidBuffer[48]; 

  CurrentStackLocation = Irp->Tail.CurrentStackLocation;
  v3 = 0;
  MasterIrp = (tagWNODE_SINGLE_INSTANCE *)Irp->AssociatedIrp.MasterIrp;
  SecurityContext = (unsigned int)CurrentStackLocation->Parameters.SecurityContext;
  v7 = *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes;
  Options = CurrentStackLocation->Parameters.Options;
  LODWORD(DesiredAccess) = SecurityContext;
  if( v7 > 0x224158 )
  {
    switch( v7 )
    {
      case 0x224160u:
        goto LABEL_79;
      case 0x228008u:
        v11 = WmipProbeWnodeSingleInstance(MasterIrp, (unsigned int)Options, SecurityContext, 0);
        if( v11 < 0 )
          goto LABEL_19;
        v18 = 2;
        break;
      case 0x22800Cu:
        v11 = WmipProbeWnodeSingleItem((tagWNODE_SINGLE_ITEM *)MasterIrp, (unsigned int)Options);
        if( v11 < 0 )
          goto LABEL_19;
        v18 = 3;
        break;
      default:
        switch( v7 )
        {
          case 0x228024u:
            v11 = WmipProbeWnodeMethodItem((tagWNODE_METHOD_ITEM *)MasterIrp, (unsigned int)Options, SecurityContext);
            if( v11 < 0 )
              goto LABEL_19;
            v13 = 9;
            LOBYTE(v12) = 1;
            goto LABEL_16;
          case 0x22811Cu:
            if( (_DWORD)Options == 22 )
            {
              AllDataMultiple = WmipTranslateFileHandle((WMIFHTOINSTANCENAME *)MasterIrp, &DesiredAccess);
              goto LABEL_17;
            }
LABEL_73:
            v11 = -1073741823;
            goto LABEL_21;
          case 0x22812Cu:
            if( SecurityContext >= 0x38 && &MasterIrp->WnodeHeader.ProviderId <= (ULONG *)((char *)MasterIrp + Options) )
            {
              v16 = MasterIrp->WnodeHeader.BufferSize - 1;
              if( v16 <= 0xFFE && &MasterIrp->WnodeHeader.CountLost + 2 * v16 <= (ULONG *)((char *)MasterIrp + Options) )
              {
                LODWORD(RetSize) = SecurityContext;
                AllDataMultiple = WmipQueryAllDataMultiple(
                                    0,
                                    0i64,
                                    Irp,
                                    1,
                                    (tagWNODE_ALL_DATA *)MasterIrp,
                                    (UINT64)RetSize,
                                    (__int64)MasterIrp,
                                    (__int64)&DesiredAccess);
                goto LABEL_17;
              }
            }
            break;
          case 0x228130u:
            if( SecurityContext >= 0x38 && &MasterIrp->WnodeHeader.ProviderId <= (ULONG *)((char *)MasterIrp + Options) )
            {
              v15 = MasterIrp->WnodeHeader.BufferSize - 1;
              if( (unsigned int)v15 <= 0xFFE
                && &MasterIrp->WnodeHeader.Guid.Data4[24 * v15] <= (unsigned __int8 *)((char *)MasterIrp + Options) )
              {
                LODWORD(RetSize) = MasterIrp->WnodeHeader.BufferSize;
                AllDataMultiple = WmipQuerySingleMultiple(
                                    Irp,
                                    1,
                                    (UINT8 *)MasterIrp,
                                    SecurityContext,
                                    (WMIQSIMULTIPLE *)MasterIrp,
                                    (UINT64)RetSize,
                                    0i64,
                                    0i64,
                                    &DesiredAccess);
                goto LABEL_17;
              }
            }
            break;
          case 0x228144u:
            if( (unsigned int)Options < 0x10
              || SecurityContext < 0x38
              || MasterIrp->WnodeHeader.BufferSize > (unsigned int)(Options - 8) >> 3 )
            {
              v11 = -1073741808;
              goto LABEL_19;
            }
            AllDataMultiple = WmipReceiveNotifications((WMIRECEIVENOTIFICATION *)MasterIrp, &DesiredAccess, Irp);
            goto LABEL_17;
          default:
            goto LABEL_58;
        }
LABEL_70:
        v11 = -1073741811;
        goto LABEL_19;
    }
    LODWORD(DesiredAccess) = Options;
    LOBYTE(v17) = 1;
    LODWORD(RetSize) = Options;
    AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, v17, v18, MasterIrp, (UINT64)RetSize, &DesiredAccess);
    SecurityContext = 0;
    goto LABEL_18;
  }
  switch( v7 )
  {
    case 0x224158u:
      if( SecurityContext >= 0x10 )
      {
        AllDataMultiple = WmipEnumerateMofResources(&MasterIrp->WnodeHeader.BufferSize, SecurityContext, &DesiredAccess);
        goto LABEL_17;
      }
      goto LABEL_70;
    case 0x224000u:
      if( SecurityContext >= 0x48 )
      {
        if( (unsigned int)Options >= 0x30 )
        {
          Flags = MasterIrp->WnodeHeader.Flags;
          if( (Flags & 1) != 0 && (_DWORD)Options == MasterIrp->WnodeHeader.BufferSize && (Flags & 0xFFFFFF7E) == 0 )
          {
            LODWORD(OutBufferLen) = SecurityContext;
            AllDataMultiple = WmipQueryAllData(
                                0i64,
                                Irp,
                                1,
                                (tagWNODE_ALL_DATA *)MasterIrp,
                                OutBufferLen,
                                &DesiredAccess);
LABEL_17:
            SecurityContext = DesiredAccess;
LABEL_18:
            v11 = AllDataMultiple;
            goto LABEL_19;
          }
        }
        goto LABEL_73;
      }
      goto LABEL_55;
    case 0x224004u:
      if( SecurityContext < 0x38 )
        goto LABEL_55;
      v11 = WmipProbeWnodeSingleInstance(MasterIrp, (unsigned int)Options, SecurityContext, 1u);
      if( v11 < 0 )
        goto LABEL_19;
      v13 = 1;
      LOBYTE(v12) = 1;
LABEL_16:
      LODWORD(DesiredAccess) = Options;
      LODWORD(RetSize) = SecurityContext;
      AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, v12, v13, MasterIrp, (UINT64)RetSize, &DesiredAccess);
      goto LABEL_17;
    case 0x224108u:
LABEL_31:
      LODWORD(ValidSize) = SecurityContext;
      LODWORD(RetSize) = Options;
      Handle = 0i64;
      LODWORD(DesiredAccess) = 0;
      memset(&CapturedObjectAttributes_8, 0, sizeof(CapturedObjectAttributes_8));
      CapturedGuidString = 0i64;
      CapturedGuidString_8 = 0i64;
      v11 = WmipProbeWmiOpenGuidBlock(
              &CapturedObjectAttributes_8,
              &CapturedGuidString_8,
              (WCHAR *)CapturedGuidBuffer,
              &DesiredAccess,
              (WMIOPENGUIDBLOCK *)MasterIrp,
              (UINT64)RetSize,
              (UINT64)ValidSize);
      if( v11 >= 0 )
      {
        v11 = WmipOpenBlock(
                v7,
                1,
                &CapturedObjectAttributes_8,
                (unsigned int)DesiredAccess,
                (_WMIGUIDOBJECT **)&CapturedGuidString);
        if( v11 >= 0 )
        {
          LOBYTE(RetSizea) = 1;
          v11 = ObOpenObjectByPointer(
                  CapturedGuidString,
                  0i64,
                  0i64,
                  DesiredAccess,
                  WmipGuidObjectType,
                  RetSizea,
                  &Handle);
          if( v11 >= 0 )
          {
            if( IoIs32bitProcess(0i64) )
              MasterIrp->WnodeHeader.Version = (unsigned int)Handle;
            else
              MasterIrp->WnodeHeader.TimeStamp.QuadPart = (LONGLONG)Handle;
          }
          HalPutDmaAdapter(CapturedGuidString);
        }
      }
LABEL_19:
      if( v11 == 259 || v11 == -1073741536 )
        return v11;
      goto LABEL_21;
    case 0x224124u:
      if( SecurityContext >= 4 )
      {
        MasterIrp->WnodeHeader.BufferSize = 1;
        SecurityContext = 4;
        v11 = 0;
        goto LABEL_21;
      }
      goto LABEL_55;
    case 0x224134u:
LABEL_79:
      if( SecurityContext >= 8 )
      {
        AllDataMultiple = WmipEnumerateGuids(v7, MasterIrp, SecurityContext, &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( SecurityContext >= 0x10 )
  {
    AllDataMultiple = WmipQueryGuidInfo((WMIQUERYGUIDINFO *)MasterIrp);
    SecurityContext = 16;
    goto LABEL_18;
  }
LABEL_55:
  v11 = -1073741789;
LABEL_21:
  Irp->IoStatus.Status = v11;
  if( v11 >= 0 )
    v3 = SecurityContext;
  Irp->IoStatus.Information = v3;
  IofCompleteRequest(Irp, 0);
  return v11;
}

Referenced by:

No references.