IopReleaseResources

VOID __stdcall IopReleaseResources(_DEVICE_NODE *DeviceNode){
  _CM_RESOURCE_LIST *ResourceList; 
  _CM_RESOURCE_LIST *ResourceListTranslated; 
  unsigned int Flags; 
  _CM_RESOURCE_LIST *v5; 
  _CM_RESOURCE_LIST *BootResources; 

  PnpReleaseResourcesInternal(DeviceNode);
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
  ResourceList = DeviceNode->ResourceList;
  if( ResourceList )
  {
    ExFreePoolWithTag(ResourceList, 0);
    DeviceNode->ResourceList = 0i64;
  }
  ResourceListTranslated = DeviceNode->ResourceListTranslated;
  if( ResourceListTranslated )
  {
    ExFreePoolWithTag(ResourceListTranslated, 0);
    DeviceNode->ResourceListTranslated = 0i64;
  }
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
  Flags = DeviceNode->Flags;
  if( (Flags & 0x10001) == 1 )
  {
    if( (Flags & 0x40) != 0 )
    {
      BootResources = DeviceNode->BootResources;
      if( BootResources )
        IopAllocateBootResourcesInternal(ArbiterRequestPnpEnumerated, DeviceNode->PhysicalDeviceObject, BootResources);
    }
  }
  else
  {
    PipClearDevNodeFlags(DeviceNode, 0xC0ui64);
    v5 = DeviceNode->BootResources;
    if( v5 )
    {
      ExFreePoolWithTag(v5, 0);
      DeviceNode->BootResources = 0i64;
    }
  }
}

Referenced by:

IopLegacyResourceAllocation