FsRtlRemovePerStreamContext

_FSRTL_PER_STREAM_CONTEXT *__stdcall FsRtlRemovePerStreamContext(
        _FSRTL_ADVANCED_FCB_HEADER *AdvFcbHeader,
        PVOID OwnerId,
        PVOID InstanceId){
  _ETHREAD *CurrentThread; 
  _FSRTL_PER_STREAM_CONTEXT *v7; 
  _LIST_ENTRY *p_FilterContexts; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *Blink; 
  if( !AdvFcbHeader || (AdvFcbHeader->Flags2 & 2) == 0 )
    return 0i64;
  if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
  {
    ExAcquireFastMutex(AdvFcbHeader->FastMutex);
  }
  else
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx((UINT64)&AdvFcbHeader->PushLock, 0i64);
  }
  v7 = 0i64;
  p_FilterContexts = &AdvFcbHeader->FilterContexts;
  Flink = AdvFcbHeader->FilterContexts.Flink;
  if( InstanceId )
  {
    while( Flink != p_FilterContexts )
    {
      if( Flink[1].Flink == OwnerId && Flink[1].Blink == InstanceId )
        goto LABEL_9;
      Flink = Flink->Flink;
    }
  }
  else if( OwnerId )
  {
    while( Flink != p_FilterContexts )
    {
      if( Flink[1].Flink == OwnerId )
        goto LABEL_9;
      Flink = Flink->Flink;
    }
  }
  else if( Flink != p_FilterContexts )
  {
LABEL_9:
    v7 = (_FSRTL_PER_STREAM_CONTEXT *)Flink;
    if( Flink )
    {
      v10 = Flink->Flink;
      if( (_FSRTL_PER_STREAM_CONTEXT *)v10->Blink != v7
        || (Blink = v7->Links.Blink, (_FSRTL_PER_STREAM_CONTEXT *)Blink->Flink != v7) )
      {
        __fastfail(3u);
      }
      Blink->Flink = v10;
      v10->Blink = Blink;
    }
  }
  if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
  {
    KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
  }
  else
  {
    ExReleasePushLockEx((UINT64)&AdvFcbHeader->PushLock, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  return v7;
}

Referenced by:

No references.