IopSaveRestoreConfiguration

VOID __stdcall IopSaveRestoreConfiguration(
        _PNP_RESOURCE_REQUEST *RequestTable,
        UINT64 RequestTableCount,
        _LIST_ENTRY *ArbiterList,
        UINT8 Save){
  void **p_ReqList; 
  __int64 v7; 
  _QWORD *v8; 
  __int64 *v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  int v15; 
  __int128 v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  __int128 v20; 
  __int128 v21; 
  int v22; 
  __int128 v23; 
  __int128 v24; 
  __int128 v25; 
  __int128 v26; 
  __int128 v27; 
  __int128 v28; 
  _LIST_ENTRY *i; 
  _LIST_ENTRY v30; 
  _LIST_ENTRY v31; 

  if( (_DWORD)RequestTableCount )
  {
    p_ReqList = &RequestTable->ReqList;
    v7 = (unsigned int)RequestTableCount;
    do
    {
      v8 = *p_ReqList;
      if( Save )
      {
        v9 = (__int64 *)v8[2];
        v8[3] = v9;
      }
      else
      {
        v9 = (__int64 *)v8[3];
        v8[2] = v9;
      }
      v10 = *v9;
      v11 = 0i64;
      v12 = v10 + 24;
      v13 = (8 * ((unsigned __int64)*(unsigned int *)(v10 + 20) + 3) - 24 + 7) >> 3;
      if( v10 + 24 > v10 + 8 * ((unsigned __int64)*(unsigned int *)(v10 + 20) + 3) )
        v13 = 0i64;
      if( v13 )
      {
        do
        {
          if( *(_BYTE *)(*(_QWORD *)v12 + 8i64) )
          {
            v14 = *(_QWORD *)(*(_QWORD *)v12 + 32i64);
            if( Save )
            {
              v15 = *(_DWORD *)(v14 + 152);
              v16 = *(_OWORD *)(v14 + 56);
              *(_OWORD *)(v14 + 160) = *(_OWORD *)(v14 + 40);
              v17 = *(_OWORD *)(v14 + 72);
              *(_OWORD *)(v14 + 176) = v16;
              v18 = *(_OWORD *)(v14 + 88);
              *(_OWORD *)(v14 + 192) = v17;
              v19 = *(_OWORD *)(v14 + 104);
              *(_OWORD *)(v14 + 208) = v18;
              v20 = *(_OWORD *)(v14 + 120);
              *(_OWORD *)(v14 + 224) = v19;
              v21 = *(_OWORD *)(v14 + 136);
              *(_OWORD *)(v14 + 240) = v20;
              *(_OWORD *)(v14 + 256) = v21;
              *(_DWORD *)(v14 + 272) = v15;
            }
            else
            {
              v22 = *(_DWORD *)(v14 + 272);
              v23 = *(_OWORD *)(v14 + 176);
              *(_OWORD *)(v14 + 40) = *(_OWORD *)(v14 + 160);
              v24 = *(_OWORD *)(v14 + 192);
              *(_OWORD *)(v14 + 56) = v23;
              v25 = *(_OWORD *)(v14 + 208);
              *(_OWORD *)(v14 + 72) = v24;
              v26 = *(_OWORD *)(v14 + 224);
              *(_OWORD *)(v14 + 88) = v25;
              v27 = *(_OWORD *)(v14 + 240);
              *(_OWORD *)(v14 + 104) = v26;
              v28 = *(_OWORD *)(v14 + 256);
              *(_OWORD *)(v14 + 120) = v27;
              *(_OWORD *)(v14 + 136) = v28;
              *(_DWORD *)(v14 + 152) = v22;
            }
          }
          v12 += 8i64;
          ++v11;
        }
        while( v11 < v13 );
      }
      p_ReqList += 8;
      --v7;
    }
    while( v7 );
  }
  for( i = ArbiterList->Flink; i != ArbiterList; i = i->Flink )
  {
    if( Save )
    {
      v30 = *i;
      i[-2] = i[-3];
      i[-1] = v30;
    }
    else
    {
      v31 = i[-1];
      i[-3] = i[-2];
      *i = v31;
    }
  }
}

Referenced by:

PnpFindBestConfigurationWorker