PnpProcessAssignResources

char __fastcall PnpProcessAssignResources(_DEVICE_NODE *DeviceNode, unsigned __int8 a2, _BYTE *a3){
  int v4; 
  char v6; 
  size_t v7; 
  VOID **PoolWithTag; 
  __int64 *v9; 
  __int64 v10; 
  VOID **v12; 
  PNP_RESOURCE_REQUEST *v13; 
  PNP_RESOURCE_REQUEST *v14; 
  __int64 *v15; 
  __int64 v16; 
  __int64 v17; 
  PNP_RESOURCE_REQUEST *v18; 
  __int64 v19; 
  _DEVICE_NODE *v20; 
  NTSTATUS v21; 
  _DEVICE_NODE *v22; 
  UINT64 v23; 

  v4 = a2;
  v6 = 0;
  v7 = 8 * *(&PnpReplaceEvent + 1500) + 8;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v7, 896560720i64);
  v9 = (__int64 *)PoolWithTag;
  if( PoolWithTag )
  {
    memset(PoolWithTag, 0i64, v7);
    *(_DWORD *)v9 = v4;
    PnpProcessAssignResourcesWorker(DeviceNode, v9);
    v10 = *((unsigned int *)v9 + 1);
    if( (_DWORD)v10 )
    {
      v12 = ExAllocatePoolWithTag(1ui64, (unsigned int)((_DWORD)v10 << 6), 913337936i64);
      v13 = (PNP_RESOURCE_REQUEST *)v12;
      if( v12 )
      {
        memset(v12, 0i64, (_DWORD)v10 << 6);
        v14 = v13;
        v15 = v9 + 1;
        v16 = v10;
        do
        {
          v17 = *v15;
          memset(v14, 0i64, 0x40u);
          *((_QWORD *)v14 + 3) = 0i64;
          ++v15;
          *(_QWORD *)v14 = v17;
          v14[3] = 4;
          v14 += 16;
          --v16;
        }
        while( v16 );
        v6 = 0;
        PnpAssignResourcesToDevices(v10, v13, a3);
        v18 = v13 + 10;
        while( 1 )
        {
          v19 = *((_QWORD *)v18 - 5);
          if( v19 )
            v20 = *(_DEVICE_NODE **)(*(_QWORD *)(v19 + 312) + 40i64);
          else
            v20 = 0i64;
          v21 = v18[4];
          if( v21 >= 0 )
          {
            v6 = 1;
            if( *(_QWORD *)v18 )
            {
              KeAcquireGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
              v20->ResourceList = *(_CM_RESOURCE_LIST **)v18;
              v20->ResourceListTranslated = (_CM_RESOURCE_LIST *)*((_QWORD *)v18 + 1);
              KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
            }
            else
            {
              PipSetDevNodeFlags(v20, 0x100ui64);
            }
            PipSetDevNodeState(v20, DeviceNodeResourcesAssigned);
            PipClearDevNodeUserFlags(v20, 4ui64);
            goto LABEL_18;
          }
          if( v21 != -1073741267 )
            break;
LABEL_18:
          v18 += 16;
          if( !--v10 )
          {
            ExFreePoolWithTag(v13, 0x36706E50u);
            goto LABEL_3;
          }
        }
        switch( v21 )
        {
          case -1073741686:
            v23 = 17i64;
            break;
          case -1073741438:
            v23 = 34i64;
            break;
          case -1073739512:
          case -1073479627:
            v23 = 35i64;
            break;
          case -1073479626:
            v23 = 33i64;
            break;
          default:
            v22 = v20;
            if( v21 == -1073479625 )
              v23 = 36i64;
            else
              v23 = 12i64;
            goto LABEL_37;
        }
        v22 = v20;
LABEL_37:
        PipSetDevNodeProblem(v22, v23, v21);
        goto LABEL_18;
      }
    }
LABEL_3:
    ExFreePoolWithTag(v9, 0x35706E50u);
  }
  return v6;
}

Referenced by:

PipProcessDevNodeTree