PnpBuildCmResourceLists

void __fastcall PnpBuildCmResourceLists(unsigned __int64 a1, unsigned __int64 a2, char a3){
  unsigned __int64 v4; 
  unsigned int v5; 
  unsigned int v6; 
  _DWORD *v7; 
  int v8; 
  _DWORD *v9; 
  _CM_RESOURCE_LIST *v10; 
  _DEVICE_NODE *v11; 
  unsigned int v12; 
  unsigned __int64 i; 
  __int64 v14; 
  void *v15; 
  void *v16; 
  _DEVICE_NODE *v17; 
  _CM_RESOURCE_LIST *v18; 

  v4 = a1;
  if( a3 )
  {
    for( i = a1; i < a2; i += 64i64 )
    {
      if( *(_QWORD *)i )
        v14 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)i + 312i64) + 40i64);
      else
        v14 = 0i64;
      ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
      v15 = *(void **)(v14 + 416);
      if( v15 )
      {
        ExFreePoolWithTag(v15, 0);
        *(_QWORD *)(v14 + 416) = 0i64;
      }
      v16 = *(void **)(v14 + 424);
      if( v16 )
      {
        ExFreePoolWithTag(v16, 0);
        *(_QWORD *)(v14 + 424) = 0i64;
      }
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
    }
  }
  v5 = -1;
  do
  {
    v6 = v5;
    v5 = 0;
    if( v4 >= a2 )
      break;
    v7 = (_DWORD *)(v4 + 56);
    do
    {
      *((_QWORD *)v7 - 2) = 0i64;
      v8 = *(v7 - 12);
      if( (v8 & 0x28) == 0 )
      {
        if( (v8 & 0x10) != 0 )
        {
          *v7 = -1073741823;
        }
        else if( v6 == -1 || *v7 == -1073741267 )
        {
          *v7 = 0;
          v9 = v7 - 14;
          PnpBuildCmResourceList((__int64)(v7 - 14), 1);
          if( *v7 == -1073741267 )
          {
            ++v5;
          }
          else
          {
            if( a3 )
            {
              if( *(_QWORD *)v9 )
                v17 = *(_DEVICE_NODE **)(*(_QWORD *)(*(_QWORD *)v9 + 312i64) + 40i64);
              else
                v17 = 0i64;
              if( (*(v7 - 12) & 0x400) != 0 )
                PipClearDevNodeFlags(v17, 0xC00ui64);
              ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
              v18 = (_CM_RESOURCE_LIST *)*((_QWORD *)v7 - 2);
              v17->ResourceList = v18;
              if( !v18 )
                PipSetDevNodeFlags(v17, 0x100ui64);
              v17->ResourceListTranslated = (_CM_RESOURCE_LIST *)*((_QWORD *)v7 - 1);
              KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
            }
            v10 = (_CM_RESOURCE_LIST *)*((_QWORD *)v7 - 2);
            if( v10 )
            {
              if( *(_QWORD *)v9 )
                v11 = *(_DEVICE_NODE **)(*(_QWORD *)(*(_QWORD *)v9 + 312i64) + 40i64);
              else
                v11 = 0i64;
              v12 = PnpDetermineResourceListSize(*((_DWORD **)v7 - 2));
              IopWriteAllocatedResourcesToRegistry(v11, v10, v12);
            }
          }
        }
      }
      v7 += 16;
    }
    while( (unsigned __int64)(v7 - 14) < a2 );
    v4 = a1;
    if( !v5 )
      break;
  }
  while( v5 < v6 );
}

Referenced by:

PnpAllocateResources
PnpReallocateResources
PnpRebalance