PnpProcessAssignResources

INT64 __fastcall PnpProcessAssignResources(INT64 a1, INT64 a2){
  UINT *v2; 
  UINT *v3; 
  unsigned int v4; 
  char v6; 
  INT64 result; 
  _PNP_ASSIGN_RESOURCES_CONTEXT *v8; 
  __int64 DeviceCount; 
  _PNP_RESOURCE_REQUEST *PoolWithTag; 
  _PNP_RESOURCE_REQUEST *v11; 
  INT64 v12; 
  _DEVICE_OBJECT **DeviceList; 
  __int64 v14; 
  _DEVICE_OBJECT *v15; 
  _CM_RESOURCE_LIST **p_ResourceAssignment; 
  __int64 v17; 
  __int64 v18; 
  int v19; 
  _PNP_DEVNODE_STATE *v20; 
  __int64 v21; 
  int v22; 
  v3 = v2;
  v4 = (unsigned __int8)a2;
  v6 = 0;
  result = (INT64)ExAllocatePoolWithTag(PagedPool, (unsigned int)(8 * IopNumberDeviceNodes + 8), 0x35706E50ui64);
  v8 = (_PNP_ASSIGN_RESOURCES_CONTEXT *)result;
  if( result )
  {
    memset(result, 0i64);
    v8->IncludeFailedDevices = v4;
    PnpProcessAssignResourcesWorker((_DEVICE_NODE *)a1, v8);
    DeviceCount = v8->DeviceCount;
    if( (_DWORD)DeviceCount )
    {
      PoolWithTag = (_PNP_RESOURCE_REQUEST *)ExAllocatePoolWithTag(
                                               PagedPool,
                                               (unsigned int)((_DWORD)DeviceCount << 6),
                                               0x36706E50ui64);
      v11 = PoolWithTag;
      if( PoolWithTag )
      {
        memset((INT64)PoolWithTag, 0i64);
        v12 = (INT64)v11;
        DeviceList = v8->DeviceList;
        v14 = DeviceCount;
        do
        {
          v15 = *DeviceList;
          memset(v12, 0i64);
          *(_QWORD *)(v12 + 24) = 0i64;
          ++DeviceList;
          *(_QWORD *)v12 = v15;
          *(_DWORD *)(v12 + 12) = 4;
          v12 += 64i64;
          --v14;
        }
        while( v14 );
        v6 = 0;
        PnpAssignResourcesToDevices((unsigned int)DeviceCount, v11, v3);
        p_ResourceAssignment = &v11->ResourceAssignment;
        while( 1 )
        {
          v17 = (__int64)*(p_ResourceAssignment - 5);
          if( v17 )
            v18 = *(_QWORD *)(*(_QWORD *)(v17 + 312) + 40i64);
          else
            v18 = 0i64;
          v19 = *((_DWORD *)p_ResourceAssignment + 4);
          if( v19 >= 0 )
          {
            v6 = 1;
            if( *p_ResourceAssignment )
            {
              KeAcquireGuardedMutex(&PiResourceListLock);
              *(_QWORD *)(v18 + 416) = *p_ResourceAssignment;
              *(_QWORD *)(v18 + 424) = p_ResourceAssignment[1];
              KeReleaseGuardedMutex(&PiResourceListLock);
            }
            else
            {
              PipSetDevNodeFlags(v18, 256);
            }
            PipSetDevNodeState((_DEVICE_NODE *)v18, DeviceNodeResourcesAssigned, v20);
            PipClearDevNodeUserFlags(v18, 4);
            goto LABEL_18;
          }
          if( v19 != -1073741267 )
            break;
LABEL_18:
          p_ResourceAssignment += 8;
          if( !--DeviceCount )
          {
            ExFreePoolWithTag(v11, 0x36706E50u);
            goto LABEL_3;
          }
        }
        switch( v19 )
        {
          case -1073741686:
            v22 = 17;
            break;
          case -1073741438:
            v22 = 34;
            break;
          case -1073739512:
          case -1073479627:
            v22 = 35;
            break;
          case -1073479626:
            v22 = 33;
            break;
          default:
            v21 = v18;
            if( v19 == -1073479625 )
              v22 = 36;
            else
              v22 = 12;
            goto LABEL_37;
        }
        v21 = v18;
LABEL_37:
        PipSetDevNodeProblem(v21, v22, v19);
        goto LABEL_18;
      }
    }
LABEL_3:
    ExFreePoolWithTag(v8, 0x35706E50u);
  }
  LOBYTE(result) = v6;
  return result;
}

Referenced by:

PipProcessDevNodeTree