SmFpCleanup

VOID __stdcall SmFpCleanup(_SM_FORWARD_PROGRESS_CTX *FpContext){
  unsigned int v1; 
  _SM_FORWARD_PROGRESS_CTX *v2; 
  void **v3; 
  void *v4; 

  v1 = 0;
  v2 = FpContext + 22;
  v3 = (void **)(FpContext + 8);
  do
  {
    while( 1 )
    {
      v4 = *v3;
      if( !*v3 )
        break;
      *v3 = *(void **)v4;
      if( v1 < 5 )
      {
        if( v1 == 2 )
        {
          SmKmFreeMdlForLock(*((_MDL **)v4 + 1));
        }
        else if( v1 == 3 )
        {
          SmAcquireReleaseCharges((unsigned __int64)*(unsigned __int16 *)v2 << 12, 1ui64, 1ui64);
        }
        else
        {
          ExFreePoolWithTag(*((PVOID *)v4 + 1), 0);
        }
      }
      else
      {
        MmFreeMappingAddress(*((PVOID *)v4 + 1), 0x6D526D73u);
      }
      ExFreePoolWithTag(v4, 0);
    }
    ++v1;
    ++v3;
    v2 = (_SM_FORWARD_PROGRESS_CTX *)((char *)v2 + 2);
  }
  while( v1 < 6 );
}

Referenced by:

SMKM_STORE::SmStCleanup
SmFirstTimeInit
SmFpPreAllocate
void