WmipAddDataSource

NTSTATUS __stdcall WmipAddDataSource(
        _REGENTRY *RegEntry,
        WMIREGINFOW *WmiRegInfo,
        UINT64 BufferSize,
        WCHAR *RegPath,
        WCHAR *ResourceName){
  __int64 v5; 
  unsigned int v6; 
  _QWORD *v9; 
  _QWORD *v10; 
  WMIREGGUIDW *p_Data2; 
  ULONG v12; 
  ULONG Flags; 
  int v14; 
  _QWORD *v15; 
  char v16; 
  NTSTATUS v17; 
  _GUID *v18; 
  tagInstanceSet *v19; 
  WCHAR *v20; 
  WCHAR *v21; 
  char *v23; 
  _QWORD **v24; 
  _QWORD *v25; 
  _QWORD *v26; 
  _QWORD *v27; 
  __int64 v28; 
  tagInstanceSet *v29; 
  bool v30; 
  _QWORD *v31; 
  __int64 v32; 
  _QWORD *v33; 
  _QWORD *v34; 
  _QWORD *v35; 
  _QWORD *v36; 
  __int64 v37; 
  _QWORD *v38; 
  UINT8 *NewMofResource; 
  char v40[8]; 
  tagInstanceSet *BinaryMofInstanceSet; 
  __int128 v42; 
  __int128 v43; 
  char v44; 
  unsigned int v45; 

  v45 = BufferSize;
  v5 = *((_QWORD *)RegEntry + 4);
  BinaryMofInstanceSet = 0i64;
  v40[0] = 0;
  v6 = BufferSize;
  v44 = 0;
  v42 = 0i64;
  v43 = 0i64;
  if( !v5 )
  {
    v9 = WmipAllocEntry((__int64)&stru_140C00F40 + 7664);
    v5 = (__int64)v9;
    if( v9 )
    {
      v10 = v9 + 5;
      *(_DWORD *)(v5 + 64) = 4;
      v10[1] = v10;
      *v10 = v10;
      *(_QWORD *)(v5 + 72) = v5 + 80;
      *(_OWORD *)(v5 + 80) = 0i64;
      *(_OWORD *)(v5 + 96) = 0i64;
    }
    if( !v5 )
      return -1073741670;
    *(_DWORD *)(v5 + 56) = RegEntry[14];
    v44 = 1;
  }
  p_Data2 = (WMIREGGUIDW *)&WmiRegInfo->WmiRegGuid[0].Guid.Data2;
  v12 = 0;
  if( !WmiRegInfo->GuidCount )
  {
LABEL_10:
    v14 = RegEntry[12] & 0x40000000;
    if( v14 )
    {
      *((_QWORD *)&v42 + 1) = &v42;
      *(_QWORD *)&v42 = &v42;
      *((_QWORD *)&v43 + 1) = &v43;
      *(_QWORD *)&v43 = &v43;
    }
    v15 = (_QWORD *)((unsigned __int64)&v42 & -(__int64)(v14 != 0));
    KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
    v16 = v44;
    v17 = WmipLinkDataSourceToList(v5, v44, (__int64)v15);
    KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
    if( v15 )
    {
      while( 1 )
      {
        v23 = (char *)*v15;
        if( (_QWORD *)*v15 == v15 )
          break;
        if( *((_QWORD **)v23 + 1) != v15 )
          goto LABEL_61;
        v34 = *(_QWORD **)v23;
        if( *(char **)(*(_QWORD *)v23 + 8i64) != v23 )
          goto LABEL_61;
        *v15 = v34;
        v34[1] = v15;
        WmipLegacyEtwWorker(*((VOID **)v23 + 2));
        v35 = v23 + 40;
        while( 1 )
        {
          v36 = (_QWORD *)*v35;
          if( (_QWORD *)*v35 == v35 )
            break;
          if( (_QWORD *)v36[1] != v35 )
            goto LABEL_61;
          v37 = *v36;
          if( *(_QWORD **)(*v36 + 8i64) != v36 )
            goto LABEL_61;
          *v35 = v37;
          *(_QWORD *)(v37 + 8) = v35;
          KeSetEvent((PRKEVENT)(v36 + 2), 0, 0);
        }
        ExFreePoolWithTag(v23, 0x70696D57u);
      }
      v24 = (_QWORD **)(v15 + 2);
      while( 1 )
      {
        v25 = *v24;
        if( *v24 == v24 )
          break;
        if( (_QWORD **)v25[1] != v24 )
          goto LABEL_61;
        v38 = (_QWORD *)*v25;
        if( *(_QWORD **)(*v25 + 8i64) != v25 )
          goto LABEL_61;
        *v24 = v38;
        v38[1] = v24;
        KeWaitForSingleObject((UINT64)(v25 + 4), 0, 0, 0, 0i64);
        ExFreePoolWithTag(v25, 0x70696D57u);
      }
    }
    if( v17 >= 0 )
    {
      v19 = BinaryMofInstanceSet;
      *((_QWORD *)RegEntry + 4) = v5;
      if( v19 )
        WmipGenerateBinaryMofNotification(v19, &GUID_MOF_RESOURCE_ADDED_NOTIFICATION, v18);
      if( RegPath )
        v20 = WmipCountedToSz(RegPath);
      else
        v20 = 0i64;
      if( ResourceName )
        v21 = WmipCountedToSz(ResourceName);
      else
        v21 = 0i64;
      if( v20 )
      {
        if( *v20 && v21 && *v21 && WmipAddMofResource((tagDATASOURCE *)v5, v20, 0, v21, (UINT8 *)v40) >= 0 && v40[0] )
          WmipGenerateMofResourceNotification(v20, v21, &GUID_MOF_RESOURCE_ADDED_NOTIFICATION, 1ui64);
        ExFreePoolWithTag(v20, 0);
      }
      if( v21 )
        ExFreePoolWithTag(v21, 0);
      WmipGenerateRegistrationNotification((tagDATASOURCE *)v5, 1ui64);
      v5 = 0i64;
      v17 = 0;
    }
    goto LABEL_28;
  }
  while( 1 )
  {
    Flags = p_Data2->Flags;
    if( (Flags & 0x10000) != 0 || (Flags & 0x81000) == 0x80000 )
      goto LABEL_9;
    v26 = WmipAllocEntry((__int64)&stru_140C00F40 + 4496);
    v27 = v26;
    if( !v26 )
      break;
    *((_DWORD *)v26 + 4) |= 8u;
    v26[7] = p_Data2;
    v26[8] = v5;
    LODWORD(NewMofResource) = *(_DWORD *)(v5 + 56);
    v17 = WmipBuildInstanceSet(p_Data2, WmiRegInfo, v6, (tagInstanceSet *)v26, (UINT64)NewMofResource);
    v28 = *(_QWORD *)&p_Data2->Guid.Data1 - WmipBinaryMofGuid;
    if( *(_QWORD *)&p_Data2->Guid.Data1 == WmipBinaryMofGuid )
      v28 = *(_QWORD *)p_Data2->Guid.Data4 - 0x102906C9A000F0B2i64;
    v29 = BinaryMofInstanceSet;
    v30 = v28 == 0;
    v31 = (_QWORD *)(v5 + 40);
    v32 = *(_QWORD *)(v5 + 40);
    if( v30 )
      v29 = (tagInstanceSet *)v27;
    v33 = v27 + 5;
    BinaryMofInstanceSet = v29;
    if( *(_QWORD **)(v32 + 8) != v31 )
LABEL_61:
      __fastfail(3u);
    *v33 = v32;
    v33[1] = v31;
    *(_QWORD *)(v32 + 8) = v33;
    *v31 = v33;
    if( v17 < 0 )
      goto LABEL_47;
    v6 = v45;
LABEL_9:
    ++v12;
    p_Data2 = (WMIREGGUIDW *)((char *)p_Data2 + 32);
    if( v12 >= WmiRegInfo->GuidCount )
      goto LABEL_10;
  }
  v17 = -1073741670;
LABEL_47:
  v16 = v44;
LABEL_28:
  if( v5 && v16 )
  {
    *(_DWORD *)(v5 + 16) |= 1u;
    WmipUnreferenceEntry((__int64)&stru_140C00F40 + 7664, (volatile signed __int64 *)v5);
  }
  return v17;
}

Referenced by:

WmipInitializeDataStructs
WmipProcessWmiRegInfo