PnpRestoreResourcesInternal

__int64 __fastcall PnpRestoreResourcesInternal(_DEVICE_NODE *DeviceNode){
  _CM_RESOURCE_LIST *ResourceList; 
  VOID **v4; 
  NTSTATUS BestConfiguration; 
  __int64 v6; 
  _CM_RESOURCE_LIST *v7; 
  unsigned int v8; 
  _LIST_ENTRY ArbiterList; 
  PNP_RESOURCE_REQUEST Request[16]; 
  char vars0; 

  ResourceList = DeviceNode->ResourceList;
  ArbiterList = 0i64;
  if( !ResourceList )
    return 0i64;
  v4 = PnpCmResourcesToIoResources((__int64)DeviceNode, ResourceList, 0);
  if( !v4 )
    return 3221225626i64;
  memset(Request, 0i64, sizeof(Request));
  *(_QWORD *)Request = DeviceNode->PhysicalDeviceObject;
  *(_QWORD *)&Request[6] = v4;
  Request[3] = 4;
  BestConfiguration = IopResourceRequirementsListToReqList(Request, (VOID **)&Request[8]);
  if( BestConfiguration >= 0 && (v6 = *(_QWORD *)&Request[8]) != 0 )
  {
    IopRearrangeReqList(*(_REQ_LIST **)&Request[8]);
    if( !*(_QWORD *)(v6 + 24) )
    {
      PnpFreeResourceRequirementsForAssignTable((unsigned __int64)Request, (unsigned __int64)&vars0);
      return 3221225858i64;
    }
    BestConfiguration = PnpFindBestConfiguration((INT64)Request, 1ui64, &ArbiterList);
    PnpFreeResourceRequirementsForAssignTable((unsigned __int64)Request, (unsigned __int64)&vars0);
    if( BestConfiguration >= 0 )
      BestConfiguration = IopCommitConfiguration(&ArbiterList);
    if( *(_QWORD *)&Request[10] )
      ExFreePoolWithTag(*(PVOID *)&Request[10], 0);
    if( *(_QWORD *)&Request[12] )
      ExFreePoolWithTag(*(PVOID *)&Request[12], 0);
    v7 = DeviceNode->ResourceList;
    v8 = PnpDetermineResourceListSize(v7);
    IopWriteAllocatedResourcesToRegistry(DeviceNode, v7, v8);
  }
  else
  {
    ExFreePoolWithTag(*(PVOID *)&Request[6], 0);
  }
  return(unsigned int)BestConfiguration;
}

Referenced by:

PnpReallocateResources