PiDevCfgFreeResolveContext

VOID __stdcall PiDevCfgFreeResolveContext(_PI_DEVCFG_RESOLVE_CONTEXT *ResolveContext){
  __int64 v2; 
  unsigned int i; 
  void **v4; 
  void *v5; 
  void **v6; 
  VOID *v7; 
  int v8; 
  __int64 v9; 
  VOID *v10; 

  if( *((_QWORD *)ResolveContext + 3) )
  {
    for( i = 0; i < 0x7F; ++i )
    {
      while( 1 )
      {
        v4 = (void **)(*((_QWORD *)ResolveContext + 3) + 16i64 * i);
        v5 = *v4;
        if( *v4 == v4 )
          break;
        if( *((void ***)v5 + 1) != v4 || (v6 = *(void ***)v5, *(void **)(*(_QWORD *)v5 + 8i64) != v5) )
          __fastfail(3u);
        *v4 = v6;
        v6[1] = v4;
        RtlFreeAnsiString((_UNICODE_STRING *)v5 + 1);
        v7 = (VOID *)*((_QWORD *)v5 + 5);
        if( v7 )
        {
          v8 = *((_DWORD *)v5 + 8);
          if( (_WORD)v8 == 0x8000 )
          {
            if( (v8 & 0x100000) != 0 )
            {
              if( *(&stru_140CF2E80 + 607) && (v9 = *(_QWORD *)(*(&stru_140CF2E80 + 607) + 224i64)) != 0 )
                v10 = *(VOID **)(v9 + 8);
              else
                v10 = 0i64;
              RegRtlDeleteTreeInternal(v7, 0i64, v10, 0);
            }
            ZwClose(*((_QWORD *)v5 + 5));
          }
          else
          {
            ExFreePoolWithTag(v7, 0);
          }
        }
        ExFreePoolWithTag(v5, 0);
      }
    }
    ExFreePoolWithTag(*((PVOID *)ResolveContext + 3), 0);
  }
  v2 = *((_QWORD *)ResolveContext + 2);
  if( v2 )
    ZwClose(v2);
}

Referenced by:

PiDevCfgConfigureDeviceKeys
PiDevCfgInitResolveContext
PiDevCfgVerifyDeviceAllowed