ResFwFreeContext

VOID __stdcall ResFwFreeContext(VOID *Context){
  __int64 v2; 
  __int64 v3; 
  _MDL *v4; 

  if( (*(&SbiVmbusArrivalEvent + 92) & 0x100000) != 0 )
  {
    v2 = *(&stru_140C00F40 + 931);
    v3 = **(&stru_140C00F40 + 931);
    if( *(_UNKNOWN **)(*(&stru_140C00F40 + 931) + 8i64) != (_UNKNOWN *)((char *)&stru_140C00F40 + 7448) )
LABEL_15:
      __fastfail(3u);
    while( 1 )
    {
      if( *(_QWORD *)(v3 + 8) != v2 )
        goto LABEL_15;
      *(&stru_140C00F40 + 931) = v3;
      *(_QWORD *)(v3 + 8) = (char *)&stru_140C00F40 + 7448;
      if( (_UNKNOWN *)v2 == (_UNKNOWN *)((char *)&stru_140C00F40 + 7448) )
        break;
      BgpGxRectangleDestroy(*(_GRAPHICS_RECTANGLE **)(v2 + 48));
      BgpFwFreeMemory((VOID *)v2);
      v2 = *(&stru_140C00F40 + 931);
      if( *(_UNKNOWN **)(*(&stru_140C00F40 + 931) + 8i64) != (_UNKNOWN *)((char *)&stru_140C00F40 + 7448) )
        goto LABEL_15;
      v3 = **(&stru_140C00F40 + 931);
    }
    *(&stru_140C00F40 + 1866) = 0;
    if( *(&SbiVmbusArrivalEvent + 120) )
      RaspClearCache();
    AnFwDisableBackgroundUpdateTimer();
    AnFwFadeCompletion();
    LogFwReport();
    if( *((_QWORD *)Context + 2) )
    {
      BgpFwReservePoolSwap(POP, 0i64, 0i64, 0i64);
      MmFreePagesFromMdl(*((PMDL *)Context + 1));
      ExFreePoolWithTag(*((PVOID *)Context + 1), 0);
    }
    *(&SbiVmbusArrivalEvent + 92) &= 0xFFEFF7FD;
    *(&SbiVmbusArrivalEvent + 70) = qword_140C50460;
    *(&SbiVmbusArrivalEvent + 71) = qword_140C50458;
    *(&SbiVmbusArrivalEvent + 36) = 0i64;
    *(&SbiVmbusArrivalEvent + 16) = 0i64;
    *(&SbiVmbusArrivalEvent + 17) = 0i64;
    ResFwBackgroundTransition(LIBRARY_DISABLE);
  }
  else
  {
    v4 = (_MDL *)*((_QWORD *)Context + 1);
    if( v4 )
    {
      MmFreePagesFromMdl(v4);
      ExFreePoolWithTag(*((PVOID *)Context + 1), 0);
    }
  }
}

Referenced by:

BgFreeContext