IoWMIAllocateInstanceIds

NTSTATUS __stdcall IoWMIAllocateInstanceIds(const _GUID *Guid, UINT64 InstanceCount, UINT64 *FirstInstanceId){
  VOID ***v3; 
  int v5; 
  VOID **v8; 
  unsigned int v9; 
  _QWORD *v10; 
  int v11; 
  __int64 v12; 
  VOID **PoolWithTag; 
  VOID **v14; 
  _GUID v15; 

  v3 = 0i64;
  v5 = InstanceCount;
  if( !*(&ExBootDevicesRemovedEvent + 391) )
    return -1073741823;
  KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
  v8 = (VOID **)*(&ExBootDevicesRemovedEvent + 437);
LABEL_11:
  if( v8 )
  {
    v9 = 0;
    v10 = v8 + 1;
    while( 1 )
    {
      v11 = *((_DWORD *)v10 + 4);
      if( v11 == -1 )
        break;
      v12 = *(_QWORD *)&Guid->Data1 - *v10;
      if( *(_QWORD *)&Guid->Data1 == *v10 )
        v12 = *(_QWORD *)Guid->Data4 - v10[1];
      if( !v12 )
      {
        *(_DWORD *)FirstInstanceId = v11;
        *((_DWORD *)v10 + 4) += v5;
        KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
        return 0;
      }
      ++v9;
      v10 = (_QWORD *)((char *)v10 + 20);
      if( v9 >= 8 )
      {
        v3 = (VOID ***)v8;
        v8 = (VOID **)*v8;
        goto LABEL_11;
      }
    }
  }
  else
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 0xA8ui64, 1768516951i64);
    v14 = PoolWithTag;
    if( !PoolWithTag )
    {
      KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
      return -1073741670;
    }
    memset(PoolWithTag + 1, 255i64, 0xA0u);
    *v14 = 0i64;
    if( v3 )
      *v3 = v14;
    else
      *(&ExBootDevicesRemovedEvent + 437) = v14;
    v10 = v14 + 1;
  }
  v15 = *Guid;
  *((_DWORD *)v10 + 4) = v5;
  *(_GUID *)v10 = v15;
  KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
  *(_DWORD *)FirstInstanceId = 0;
  return 0;
}

Referenced by:

No references.