IopReleaseDeviceResources

NTSTATUS __fastcall IopReleaseDeviceResources(__int64 a1, int a2){
  NTSTATUS result; 
  PVOID v5; 
  int v6; 
  const wchar_t *v7; 
  BOOL v8; 
  _ETHREAD *CurrentThread; 
  void(__fastcall *v10)(__int64, __int64, PVOID); 
  __int64 v11; 
  UINT64 DataSize; 
  struct _UNICODE_STRING ValueName; 
  UINT64 v14; 
  PVOID Resource; 
  HANDLE KeyHandle; 
  ValueName = 0i64;
  if( !*(_QWORD *)(a1 + 416) && (*(_DWORD *)(a1 + 396) & 0x80u) == 0 )
    return 0;
  LODWORD(v14) = 0;
  v5 = 0i64;
  Resource = 0i64;
  if( a2 && (*(_DWORD *)(a1 + 396) & 1) == 0 )
  {
    IopQueryDeviceResources(*(_DEVICE_OBJECT **)(a1 + 32), 0i64, &Resource, &v14);
    if( v6 < 0 )
    {
      Resource = 0i64;
      LODWORD(v14) = 0;
    }
    else
    {
      v5 = Resource;
    }
  }
  result = IopLegacyResourceAllocation(
             ArbiterRequestUndefined,
             PnpDriverObject,
             *(DEVICE_OBJECT **)(a1 + 32),
             0i64,
             0i64);
  if( result >= 0 )
  {
    PnpRequestDeviceAction(0i64, AssignResources, 0, 0i64, 0i64, 0i64);
    if( a2 && (*(_DWORD *)(a1 + 396) & 1) == 0 )
    {
      v7 = *(const wchar_t **)(a1 + 48);
      KeyHandle = 0i64;
      if( (int)CmOpenDeviceRegKey(PiPnpRtlCtx, v7, 20, 0, 983103, v5 != 0i64, (__int64)&KeyHandle, 0i64) >= 0 )
      {
        *(_DWORD *)&ValueName.Length = 1441812;
        ValueName.Buffer = (wchar_t *)L"BootConfig";
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)CurrentThread + 242);
        LOBYTE(v8) = 1;
        ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, v8);
        if( Resource )
        {
          LODWORD(DataSize) = v14;
          ZwSetValueKey(KeyHandle, &ValueName, 0i64, 8ui64, Resource, DataSize);
        }
        else
        {
          ZwDeleteValueKey(KeyHandle, &ValueName);
        }
        ExReleaseResourceLite(&PnpRegistryDeviceResource);
        KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
        ZwClose(KeyHandle);
        v5 = Resource;
      }
      if( v5 )
      {
        PipSetDevNodeFlags(a1, 64);
        v10 = (void(__fastcall *)(__int64, __int64, PVOID))IopAllocateBootResourcesRoutine;
        v11 = *(_QWORD *)(a1 + 32);
        *(_QWORD *)(a1 + 544) = v5;
        v10(4i64, v11, v5);
      }
    }
    return 0;
  }
  return result;
}

Referenced by:

PnpDisableDevice
PnpDriverLoadingFailed
PnpRemoveLockedDeviceNode
PnpSurpriseRemoveLockedDeviceNode