FsRtlLookupPerStreamContextInternal

_LIST_ENTRY *__fastcall FsRtlLookupPerStreamContextInternal(
        _FSRTL_ADVANCED_FCB_HEADER *AdvFcbHeader,
        VOID *OwnerId,
        VOID *InstanceId){
  _ETHREAD *CurrentThread; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *p_FilterContexts; 
  _LIST_ENTRY *v9; 
  _ETHREAD *v10; 
  bool v11; 

  if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
  {
    ExAcquireFastMutex(AdvFcbHeader->FastMutex);
  }
  else
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockSharedEx(&AdvFcbHeader->PushLock, 0i64);
  }
  Flink = AdvFcbHeader->FilterContexts.Flink;
  p_FilterContexts = &AdvFcbHeader->FilterContexts;
  v9 = 0i64;
  if( InstanceId )
  {
    if( Flink != p_FilterContexts )
    {
      while( Flink[1].Flink != OwnerId || Flink[1].Blink != InstanceId )
      {
        Flink = Flink->Flink;
        if( Flink == p_FilterContexts )
          goto LABEL_8;
      }
LABEL_7:
      v9 = Flink;
    }
  }
  else
  {
    if( OwnerId )
    {
      if( Flink == p_FilterContexts )
        goto LABEL_8;
      while( Flink[1].Flink != OwnerId )
      {
        Flink = Flink->Flink;
        if( Flink == p_FilterContexts )
          goto LABEL_8;
      }
      goto LABEL_7;
    }
    if( Flink != p_FilterContexts )
      v9 = AdvFcbHeader->FilterContexts.Flink;
  }
LABEL_8:
  if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
  {
    KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
  }
  else
  {
    ExReleasePushLockEx((_DWORD)AdvFcbHeader + 72, 0);
    v10 = (_ETHREAD *)KeGetCurrentThread();
    v11 = v10->Tcb.KernelApcDisable++ == -1;
    if( v11
      && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v10->Tcb.ApcState.ApcListHead[0].Flink != &v10->Tcb.152
      && !v10->Tcb.SpecialApcDisable )
    {
      KiCheckForKernelApcDelivery();
    }
  }
  return v9;
}

Referenced by:

No references.