PnpReleaseResourcesInternal

VOID __stdcall PnpReleaseResourcesInternal(_DEVICE_NODE *DeviceNode){
  unsigned int *v2; 
  __int64 v3; 
  unsigned int v4; 
  unsigned int *v5; 
  unsigned int v6; 
  unsigned int v7; 
  unsigned int v8; 
  _QWORD *v9; 
  int v10; 
  _QWORD *v11; 
  _QWORD *i; 
  INT64 v13; 
  INT64 *v14; 
  __int64 *LegacyBusDeviceNode; 
  __int64 *v16; 
  unsigned int v17; 
  unsigned int *v18; 
  __int64 v19; 
  __int64 v20; 
  INT64 result; 
  INT64 *p_result; 
  int v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  int v29; 
  unsigned int v30; 
  unsigned int v31; 
  memset((INT64)&result, 0i64);
  v2 = (unsigned int *)*((_QWORD *)DeviceNode + 52);
  v3 = 0i64;
  p_result = &result;
  v23 = 0;
  result = (INT64)&result;
  v25 = *((_QWORD *)DeviceNode + 4);
  v24 = 0i64;
  v26 = 4i64;
  v27 = 0i64;
  v28 = 0i64;
  if( (v2 || (v2 = (unsigned int *)*((_QWORD *)DeviceNode + 68)) != 0i64) && (v4 = *v2) != 0 )
  {
    v5 = v2 + 1;
  }
  else
  {
    v4 = 1;
    v2 = 0i64;
    v5 = 0i64;
  }
  v31 = 0;
  v6 = 0;
  if( v4 )
  {
    while( v2 )
    {
      v7 = *v5;
      v8 = v5[1];
      v30 = v8;
      if( *v5 == -1 )
        goto LABEL_28;
LABEL_7:
      if( DeviceNode == IopRootDeviceNode )
        v9 = DeviceNode;
      else
        v9 = (_QWORD *)*((_QWORD *)DeviceNode + 2);
      v10 = 1;
      v29 = 1;
      if( v9 )
      {
        do
        {
          if( v9 == IopRootDeviceNode && v10 )
          {
            LegacyBusDeviceNode = IopFindLegacyBusDeviceNode(v7, v8);
            v9 = LegacyBusDeviceNode;
            if( LegacyBusDeviceNode == v16 && !v7 )
              v9 = IopFindLegacyBusDeviceNode(1u, 0);
            v29 = v3;
          }
          v11 = v9 + 61;
          for( i = (_QWORD *)v9[61]; i != v11; i = (_QWORD *)*i )
          {
            if( i[3] != v3 )
            {
              v29 = v3;
              result = (INT64)(i + 5);
              p_result = i + 5;
              i[5] = &result;
              i[6] = &result;
              IopCallArbiter((INT64)i, 0i64, (INT64)(i + 5));
              IopCallArbiter((INT64)i, 2i64, 0i64);
              v13 = result;
              v14 = p_result;
              if( *(INT64 **)(result + 8) != &result || (INT64 *)*p_result != &result )
                __fastfail(3u);
              *p_result = result;
              v3 = 0i64;
              *(_QWORD *)(v13 + 8) = v14;
              p_result = &result;
              result = (INT64)&result;
              v11 = v9 + 61;
            }
          }
          v9 = (_QWORD *)v9[2];
          v10 = v29;
          v8 = v30;
        }
        while( v9 );
        v6 = v31;
      }
      if( v4 > 1 )
      {
        v17 = v5[3];
        v18 = v5 + 4;
        if( v17 )
        {
          v19 = v17;
          do
          {
            v20 = (unsigned int)v3;
            if( *(_BYTE *)v18 == 5 )
              v20 = v18[1];
            v18 = (unsigned int *)((char *)v18 + v20 + 20);
            --v19;
          }
          while( v19 );
        }
        v5 = v18;
      }
      v31 = ++v6;
      if( v6 >= v4 )
        goto LABEL_22;
    }
    v8 = v3;
    v30 = v3;
LABEL_28:
    v7 = 1;
    goto LABEL_7;
  }
LABEL_22:
  IopWriteAllocatedResourcesToRegistry(DeviceNode, 0i64, 0);
}

Referenced by:

IopReleaseResources
PnpReallocateResources