FsRtlRemovePerFileObjectContext

_FSRTL_PER_FILEOBJECT_CONTEXT *__stdcall FsRtlRemovePerFileObjectContext(
        PFILE_OBJECT FileObject,
        VOID *OwnerId,
        VOID *InstanceId){
  _ETHREAD *CurrentThread; 
  _FSRTL_PER_FILEOBJECT_CONTEXT *bf_0; 
  _EX_PUSH_LOCK *v7; 
  _FSRTL_PER_FILEOBJECT_CONTEXT *i; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  _EX_PUSH_LOCK *PushLock; 

  PushLock = 0i64;
  if( !FileObject )
    return 0i64;
  IoGetFileObjectFilterContext(FileObject, (PVOID *)&PushLock, 0);
  if( !PushLock )
    return 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  bf_0 = 0i64;
  --CurrentThread->Tcb.KernelApcDisable;
  v7 = PushLock;
  ExAcquirePushLockExclusiveEx(PushLock, 0i64);
  if( InstanceId )
  {
    for( i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)v7[1]._bf_0;
          i != (_FSRTL_PER_FILEOBJECT_CONTEXT *)&v7[1];
          i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)i->Links.Flink )
    {
      if( i->OwnerId == OwnerId && i->InstanceId == InstanceId )
      {
LABEL_8:
        bf_0 = i;
        goto LABEL_9;
      }
    }
  }
  else if( OwnerId )
  {
    for( i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)v7[1]._bf_0;
          i != (_FSRTL_PER_FILEOBJECT_CONTEXT *)&v7[1];
          i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)i->Links.Flink )
    {
      if( i->OwnerId == OwnerId )
        goto LABEL_8;
    }
  }
  else if( (_EX_PUSH_LOCK *)v7[1]._bf_0 != &v7[1] )
  {
    bf_0 = (_FSRTL_PER_FILEOBJECT_CONTEXT *)v7[1]._bf_0;
LABEL_9:
    if( bf_0 )
    {
      Flink = bf_0->Links.Flink;
      if( (_FSRTL_PER_FILEOBJECT_CONTEXT *)bf_0->Links.Flink->Blink != bf_0
        || (Blink = bf_0->Links.Blink, (_FSRTL_PER_FILEOBJECT_CONTEXT *)Blink->Flink != bf_0) )
      {
        __fastfail(3u);
      }
      Blink->Flink = Flink;
      Flink->Blink = Blink;
    }
  }
  ExReleasePushLockEx((ULONG_PTR)v7, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return bf_0;
}

Referenced by:

No references.