PnpGetResourceRequirementsForAssignTable

__int64 __fastcall PnpGetResourceRequirementsForAssignTable(unsigned __int64 a1, unsigned __int64 a2, int *a3){
  int v3; 
  unsigned __int64 v6; 
  int v7; 
  _REQ_LIST **v8; 
  __int64 v9; 
  _DEVICE_NODE *v10; 
  _IO_RESOURCE_REQUIREMENTS_LIST *v11; 
  int v12; 
  _IO_RESOURCE_REQUIREMENTS_LIST *v14; 
  NTSTATUS v15; 
  _REQ_LIST *v16; 
  unsigned int v17; 
  unsigned int v18; 
  _IO_RESOURCE_REQUIREMENTS_LIST *ResourceRequirements; 
  UINT64 Length; 
  int v21; 
  char *v22; 

  v3 = 0;
  LODWORD(Length) = 0;
  v21 = 0;
  v22 = 0i64;
  *a3 = 0;
  if( a1 < a2 )
  {
    v6 = a1 + 24;
    while( 1 )
    {
      v7 = *(_DWORD *)(v6 - 16);
      v8 = (_REQ_LIST **)(v6 + 8);
      *(_QWORD *)(v6 + 8) = 0i64;
      if( (v7 & 0x20) == 0 )
        break;
LABEL_13:
      v6 += 64i64;
      if( v6 - 24 >= a2 )
      {
        v3 = *a3;
        return v3 == 0 ? 0xC0000001 : 0;
      }
    }
    *(_QWORD *)(v6 + 16) = 0i64;
    v9 = *(_QWORD *)(v6 - 24);
    *(_QWORD *)(v6 + 24) = 0i64;
    if( v9 )
      v10 = *(_DEVICE_NODE **)(*(_QWORD *)(v9 + 312) + 40i64);
    else
      v10 = 0i64;
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
    if( (v10->Flags & 0x400) != 0 )
    {
      ResourceRequirements = v10->ResourceRequirements;
      if( ResourceRequirements )
      {
        ExFreePoolWithTag(ResourceRequirements, 0);
        v10->ResourceRequirements = 0i64;
        PipClearDevNodeFlags(v10, 0x200ui64);
        *(_DWORD *)(v6 - 16) |= 0x400u;
      }
    }
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
    if( !*(_QWORD *)v6 )
    {
      v11 = v10->ResourceRequirements;
      if( !v11 || (v10->Flags & 0x200) != 0 )
      {
        IopQueryDeviceResources(*(_DEVICE_OBJECT **)(v6 - 24), 1ui64, (VOID **)v6, &Length);
        if( v12 < 0 || !*(_QWORD *)v6 )
        {
          *(_DWORD *)(v6 + 32) = v12;
LABEL_12:
          *(_DWORD *)(v6 - 16) |= 0x20u;
          goto LABEL_13;
        }
        ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
        v14 = v10->ResourceRequirements;
        if( v14 )
        {
          ExFreePoolWithTag(v14, 0);
          PipClearDevNodeFlags(v10, 0x200ui64);
        }
        v10->ResourceRequirements = *(_IO_RESOURCE_REQUIREMENTS_LIST **)v6;
        KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
      }
      else
      {
        *(_QWORD *)v6 = v11;
        *(_DWORD *)(v6 - 12) = 4;
      }
    }
    if( (*(_DWORD *)(v6 - 16) & 0x200) != 0 )
    {
      if( (int)PnpFilterResourceRequirementsList(*(VOID **)v6, &v10->ResourceList->Count, &v22, &v21) >= 0 && v22 )
        *(_QWORD *)v6 = v22;
      else
        *(_DWORD *)(v6 - 16) &= ~0x200u;
    }
    v15 = IopResourceRequirementsListToReqList((PNP_RESOURCE_REQUEST *)(v6 - 24), (VOID **)(v6 + 8));
    if( v15 >= 0 )
    {
      v16 = *v8;
      if( *v8 )
      {
        IopRearrangeReqList(*v8);
        if( *((_QWORD *)v16 + 3) )
        {
          v17 = v16[8];
          v18 = 0;
          *(_DWORD *)(v6 + 32) = v15;
          if( v17 >= 3 )
            v18 = v17;
          ++*a3;
          *(_DWORD *)(v6 - 8) = v18;
          goto LABEL_13;
        }
        PnpFreeResourceRequirementsForAssignTable(v6 - 24, v6 + 40);
        v15 = -1073741438;
      }
    }
    *(_DWORD *)(v6 + 32) = v15;
    goto LABEL_12;
  }
  return v3 == 0 ? 0xC0000001 : 0;
}

Referenced by:

PnpAllocateResources
PnpQueryRebalanceWorker
PnpReallocateResources