IopLegacyResourceAllocation

NTSTATUS __stdcall IopLegacyResourceAllocation(
        _ARBITER_REQUEST_SOURCE AllocationType,
        _DRIVER_OBJECT *DriverObject,
        _DEVICE_OBJECT *DeviceObject,
        _IO_RESOURCE_REQUIREMENTS_LIST *ResourceRequirements,
        _CM_RESOURCE_LIST **AllocatedResources){
  _ETHREAD *CurrentThread; 
  _ARBITER_REQUEST_SOURCE v6; 
  _DEVICE_OBJECT *v7; 
  _DEVICE_NODE *v8; 
  NTSTATUS v12; 
  _DEVICE_NODE *v13; 
  _DEVICE_NODE *LegacyDeviceNode; 
  NTSTATUS v16; 
  _DEVICE_NODE *v17; 
  _DEVICE_NODE *v18; 
  _DEVICE_OBJECT *v19; 
  _DEVICE_OBJECT *v20; 
  _DEVICE_NODE *v21; 
  _DEVICE_NODE *v22; 
  const VOID **v23; 
  _CM_RESOURCE_LIST *v24; 
  VOID **PoolWithTag; 
  size_t v26; 
  _CM_RESOURCE_LIST *v27; 
  _CM_RESOURCE_LIST *v28; 
  unsigned int v29; 
  _DEVICE_OBJECT *PhysicalDeviceObject; 
  __int64 v31[8]; 
  _DEVICE_NODE *DeviceNode; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = AllocationType;
  v7 = 0i64;
  v8 = 0i64;
  --CurrentThread->Tcb.KernelApcDisable;
  KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 6016, 4, 0, 0, 0i64);
  v12 = -1073741823;
  if( DeviceObject )
  {
    v13 = (_DEVICE_NODE *)DeviceObject->DeviceObjectExtension->DeviceNode;
    DeviceNode = v13;
    if( v13 )
    {
      v8 = v13;
LABEL_4:
      v7 = DeviceObject;
LABEL_5:
      v12 = 0;
      goto LABEL_6;
    }
    if( (DeviceObject->Flags & 0x1000) == 0 )
    {
      v16 = PipAllocateDeviceNode(DeviceObject, (PDEVICE_NODE *)&DeviceNode);
      v17 = DeviceNode;
      v12 = v16;
      if( DeviceNode )
      {
        if( v16 == -1073740946 )
        {
          IopDestroyDeviceNode(DeviceNode);
          goto LABEL_17;
        }
        PipSetDevNodeFlags(DeviceNode, 0x20000ui64);
        v8 = v17;
        goto LABEL_4;
      }
      goto LABEL_35;
    }
  }
  else
  {
    v18 = (_DEVICE_NODE *)*(&PnpReplaceEvent + 720);
    DeviceNode = (_DEVICE_NODE *)*(&PnpReplaceEvent + 720);
    if( *(&PnpReplaceEvent + 720) )
    {
      do
      {
        if( (_DRIVER_OBJECT *)v18->DuplicatePDO == DriverObject )
          break;
        v18 = v18->Sibling;
      }
      while( v18 );
      DeviceNode = v18;
      if( v18 )
      {
        v7 = v18->PhysicalDeviceObject;
        v8 = v18;
        goto LABEL_5;
      }
    }
    PhysicalDeviceObject = 0i64;
    v12 = IopCreateRootEnumeratedDeviceObject(&PhysicalDeviceObject);
    if( v12 >= 0 )
    {
      v19 = PhysicalDeviceObject;
      v20 = PhysicalDeviceObject;
      PhysicalDeviceObject->Flags |= 0x1000u;
      v12 = PipAllocateDeviceNode(v20, (PDEVICE_NODE *)&DeviceNode);
      if( v12 == -1073740946 || (v21 = DeviceNode) == 0i64 )
      {
        IoDeleteDevice(v19);
        v6 = AllocationType;
LABEL_35:
        v12 = -1073741670;
        goto LABEL_36;
      }
      v22 = DeviceNode;
      v19->DriverObject = DriverObject;
      PipSetDevNodeFlags(v22, 0x20001ui64);
      PipSetDevNodeState(v21, DeviceNodeInitialized);
      v21->DuplicatePDO = (_DEVICE_OBJECT *)DriverObject;
      v21->Sibling = (_DEVICE_NODE *)*(&PnpReplaceEvent + 720);
      if( *(&PnpReplaceEvent + 720) )
        *(_QWORD *)(*(&PnpReplaceEvent + 720) + 8i64) = v21;
      v7 = v19;
      *(&PnpReplaceEvent + 720) = v21;
      v6 = AllocationType;
      v8 = v21;
    }
  }
LABEL_36:
  if( v12 < 0 )
    goto LABEL_17;
LABEL_6:
  LegacyDeviceNode = 0i64;
  if( v8->Parent )
    goto LABEL_7;
  if( ResourceRequirements )
  {
    if( ResourceRequirements->InterfaceType == InterfaceTypeUndefined )
      ResourceRequirements->InterfaceType = Isa;
    v8->Parent = (_DEVICE_NODE *)*(&PnpReplaceEvent + 831);
LABEL_7:
    if( ResourceRequirements )
      goto LABEL_42;
  }
  if( v8->Parent )
  {
LABEL_9:
    IopReleaseResources(v8);
    goto LABEL_10;
  }
LABEL_42:
  if( v8->ResourceList || v8->BootResources )
    goto LABEL_9;
LABEL_10:
  if( !ResourceRequirements )
  {
    LegacyDeviceNode = v8->OverUsed1.LegacyDeviceNode;
    goto LABEL_12;
  }
  memset(v31, 0i64, sizeof(v31));
  v31[0] = (__int64)v7;
  v31[3] = (__int64)ResourceRequirements;
  HIDWORD(v31[1]) = v6;
  LODWORD(v31[1]) = 128;
  PnpAllocateResources(1u, (PNP_RESOURCE_REQUEST *)v31, 1, 0i64);
  v12 = v31[7];
  if( SLODWORD(v31[7]) < 0 )
    goto LABEL_12;
  v23 = (const VOID **)AllocatedResources;
  v24 = (_CM_RESOURCE_LIST *)v31[5];
  if( *AllocatedResources )
    v24 = *AllocatedResources;
  DeviceNode = (_DEVICE_NODE *)(unsigned int)PnpDetermineResourceListSize(v24);
  PoolWithTag = ExAllocatePoolWithTag(1ui64, (UINT64)DeviceNode, 538996816i64);
  if( PoolWithTag )
  {
    if( *v23 )
      ExFreePoolWithTag((PVOID)v31[5], 0);
    else
      *v23 = (const VOID *)v31[5];
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
    v26 = (unsigned int)DeviceNode;
    v8->ResourceList = (_CM_RESOURCE_LIST *)PoolWithTag;
    memmove(PoolWithTag, *v23, v26);
    v8->ResourceListTranslated = (_CM_RESOURCE_LIST *)v31[6];
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
    LegacyDeviceNode = v8->OverUsed1.LegacyDeviceNode;
  }
  else
  {
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
    v8->ResourceList = (_CM_RESOURCE_LIST *)v31[5];
    v8->ResourceListTranslated = (_CM_RESOURCE_LIST *)v31[6];
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
    IopReleaseResources(v8);
    v12 = -1073741670;
  }
  if( v12 < 0 )
  {
LABEL_12:
    IopRemoveLegacyDeviceNode(DeviceObject, v8);
    if( v12 < 0 )
      goto LABEL_17;
  }
  if( LegacyDeviceNode )
  {
    v27 = IopCombineLegacyResources(LegacyDeviceNode);
    v28 = v27;
    if( v27 )
    {
      v29 = PnpDetermineResourceListSize(v27);
      IopWriteAllocatedResourcesToRegistry(LegacyDeviceNode, v28, v29);
      ExFreePoolWithTag(v28, 0);
    }
  }
  if( AllocationType != ArbiterRequestPnpDetected && ResourceRequirements )
    IopSetLegacyResourcesFlag(DriverObject);
LABEL_17:
  KeReleaseSemaphore((_KSEMAPHORE *)&PnpReplaceEvent + 188, 0i64, 1i64, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v12;
}

Referenced by:

IoAssignResources
IoReportResourceUsageInternal
IopDestroyDeviceNode
IopReleaseDeviceResources