FsRtlTeardownPerStreamContexts

VOID __stdcall FsRtlTeardownPerStreamContexts(_FSRTL_ADVANCED_FCB_HEADER *AdvFcbHeader){
  _LIST_ENTRY *p_FilterContexts; 
  _ETHREAD *CurrentThread; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v5; 
  _ETHREAD *v6; 

  p_FilterContexts = &AdvFcbHeader->FilterContexts;
  if( p_FilterContexts->Flink != p_FilterContexts )
  {
    if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
    {
      ExAcquireFastMutex(AdvFcbHeader->FastMutex);
    }
    else
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx(&AdvFcbHeader->PushLock, 0i64);
    }
    while( 1 )
    {
      Flink = p_FilterContexts->Flink;
      if( p_FilterContexts->Flink == p_FilterContexts )
        break;
      v5 = Flink->Flink;
      if( Flink->Blink != p_FilterContexts || v5->Blink != Flink )
        __fastfail(3u);
      p_FilterContexts->Flink = v5;
      v5->Blink = p_FilterContexts;
      if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
      {
        KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
      }
      else
      {
        ExReleasePushLockEx((_DWORD)AdvFcbHeader + 72, 0);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
      }
      ((void(__fastcall *)(_LIST_ENTRY *))Flink[2].Flink)(Flink);
      if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
      {
        ExAcquireFastMutex(AdvFcbHeader->FastMutex);
      }
      else
      {
        v6 = (_ETHREAD *)KeGetCurrentThread();
        --v6->Tcb.KernelApcDisable;
        ExAcquirePushLockExclusiveEx(&AdvFcbHeader->PushLock, 0i64);
      }
    }
    if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
    {
      KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
    }
    else
    {
      ExReleasePushLockEx((_DWORD)AdvFcbHeader + 72, 0);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
    }
  }
}

Referenced by:

RawCleanupVcb