IopAllocateBootResourcesInternal

NTSTATUS __stdcall IopAllocateBootResourcesInternal(
        _ARBITER_REQUEST_SOURCE ArbiterRequestSource,
        PDEVICE_OBJECT DeviceObject,
        PCM_RESOURCE_LIST BootResources){
  __int64 v6; 
  _DEVICE_NODE *DeviceNode; 
  VOID **v8; 
  VOID **v9; 
  int v10; 
  _CM_RESOURCE_LIST *BootResourcesTranslated; 
  _CM_RESOURCE_LIST *v13; 
  _CM_RESOURCE_LIST *v14; 
  PNP_RESOURCE_REQUEST Request[16]; 

  memset(Request, 0i64, sizeof(Request));
  if( DeviceObject )
    DeviceNode = (_DEVICE_NODE *)DeviceObject->DeviceObjectExtension->DeviceNode;
  else
    DeviceNode = 0i64;
  v8 = PnpCmResourcesToIoResources(v6, BootResources, 1);
  v9 = v8;
  if( v8 )
  {
    Request[3] = ArbiterRequestSource;
    *(_QWORD *)&Request[6] = v8;
    *(_QWORD *)Request = DeviceObject;
    v10 = IopResourceRequirementsListToReqList(Request, (VOID **)&Request[8]);
    if( v10 >= 0 )
    {
      if( !*(_QWORD *)&Request[8] )
        goto LABEL_15;
      v10 = IopBootAllocation(*(_REQ_LIST **)&Request[8]);
      if( v10 >= 0 )
      {
        PipSetDevNodeFlags(DeviceNode, 0x80ui64);
        PnpBuildCmResourceList((__int64)Request, 0);
        v10 = Request[14];
        if( Request[14] >= 0 )
        {
          if( DeviceNode->BootResources )
          {
            if( *(_QWORD *)&Request[10] )
            {
              ExFreePoolWithTag(*(PVOID *)&Request[10], 0);
              *(_QWORD *)&Request[10] = 0i64;
            }
          }
          else
          {
            DeviceNode->BootResources = *(_CM_RESOURCE_LIST **)&Request[10];
          }
          BootResourcesTranslated = DeviceNode->BootResourcesTranslated;
          if( BootResourcesTranslated )
          {
            ExFreePoolWithTag(BootResourcesTranslated, 0);
            DeviceNode->BootResourcesTranslated = 0i64;
          }
          v10 = 0;
          DeviceNode->BootResourcesTranslated = *(_CM_RESOURCE_LIST **)&Request[12];
        }
      }
    }
  }
  else
  {
    v10 = -1073741823;
  }
  if( *(_QWORD *)&Request[8] )
    IopFreeReqList(*(_REQ_LIST **)&Request[8]);
LABEL_15:
  if( v9 )
    ExFreePoolWithTag(v9, 0);
  if( v10 < 0 )
  {
    v13 = DeviceNode->BootResources;
    if( v13 )
    {
      ExFreePoolWithTag(v13, 0);
      DeviceNode->BootResources = 0i64;
    }
    v14 = DeviceNode->BootResourcesTranslated;
    if( v14 )
    {
      ExFreePoolWithTag(v14, 0);
      DeviceNode->BootResourcesTranslated = 0i64;
    }
  }
  return v10;
}

Referenced by:

IopAllocateBootResources
IopReleaseResources