WmipPrepareForWnodeAD

NTSTATUS __stdcall WmipPrepareForWnodeAD(
        _WMIGUIDOBJECT *GuidObject,
        _GUID *Guid,
        UINT64 *ProviderIdCount,
        tagInstanceSet ***ProviderIdList,
        UINT8 *InternalGuid){
  __int64 v5; 
  int v8; 
  bool v9; 
  UINT8 *v10; 
  tagInstanceSet **v11; 
  int v12; 
  int v13; 
  tagInstanceSet *v14; 
  tagInstanceSet *InstanceSet; 
  UINT64 PIMaxPtr; 
  tagInstanceSet **PIPtrPtr; 
  UINT64 PICountPtr; 

  v5 = *((_QWORD *)GuidObject + 7);
  if( !v5 || !*(_DWORD *)(v5 + 36) )
    return -1073741055;
  v8 = 0;
  v9 = (*(_DWORD *)(v5 + 16) & 1) == 0;
  v10 = InternalGuid;
  *Guid = *(_GUID *)(v5 + 72);
  if( !v9 )
  {
    *v10 = 1;
    return v8;
  }
  v11 = *ProviderIdList;
  v12 = 0;
  *v10 = 0;
  v13 = *(_DWORD *)ProviderIdCount;
  PIPtrPtr = v11;
  LODWORD(PIMaxPtr) = v13;
  LODWORD(PICountPtr) = 0;
  KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
  v14 = (tagInstanceSet *)(v5 + 56);
  InstanceSet = *(tagInstanceSet **)(v5 + 56);
  if( InstanceSet != v14 )
  {
    do
    {
      if( v8 < 0 )
        break;
      if( (InstanceSet[4] & 0x89000) == 0 )
      {
        WmipReferenceEntry((INT64)InstanceSet);
        v8 = WmipAddProviderIdToPIList(&PIPtrPtr, &PICountPtr, &PIMaxPtr, v11, InstanceSet);
      }
      InstanceSet = *(tagInstanceSet **)InstanceSet;
    }
    while( InstanceSet != v14 );
    v11 = PIPtrPtr;
    v12 = PICountPtr;
  }
  KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
  if( !v12 )
    return -1073741055;
  *(_DWORD *)ProviderIdCount = v12;
  *ProviderIdList = v11;
  return v8;
}

Referenced by:

WmipQueryAllData